[SUCTF 2019]EasySQL1

[SUCTF 2019]EasySQL1
[目标]
Sql语句的堆叠注入
[环境]
Buuctf
[工具]
浏览器
[分析]
1.试试sql注入正常套路
(1)先试试1
在这里插入图片描述

有回显
(2)再试试字母
在这里插入图片描述

没有回显
(3)试试单引号注入
在这里插入图片描述

提示不一样,因此猜测这里有注入点
(4)试试有多少列
在这里插入图片描述

还是不成功,因此一般的联合查询在这里不能使用
(5)基于时间的盲注和报错注入都需要嵌套联合查询语句来实现,因此可以跳过,直接试试布尔型盲注
在这里插入图片描述

还是不成功
2.利用堆叠注入
(1)查找所有数据库
在这里插入图片描述

(2)查询所有表名
在这里插入图片描述

(3)查询Flag表中的列
在这里插入图片描述

不成功
3.接下来是网上的两种解法,参照了网上大佬们的WP,自己做的一些总结
(1)第一种是猜出了源码select $_POST[‘query’] || flag from Flag,
sql_mode 设置了 PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数
第一种就按默认没有配置来进行,此时||就是逻辑或
||在命令执行中见过,
回顾:
command1;command2顺序执行
command1 || command2
如果command1执行失败,则执行command2
command1 && command2
如果command1执行成功,则执行command2

因此只需要将

$_POST[‘query’]

提交的数据换成*,1(如果直接写的话会被报错,且写在后面会失效)
解释:
sql=select.post[‘query’]."||flag from Flag";(拼接语句)
如果$post[‘query’]的数据为

*,1

sql语句就变成了select *,1||flag from Flag,
就是select *,1 from Flag,这样就直接查询出了Flag表中的所有内容。
此处的1是临时增加一列,列名为1且这一列的所有值都为1

执行payload:*,1
在这里插入图片描述

得到flag
(2)第二种是将||作为字符串连接符,因此需要在语句中更改其配置
sql_mode=PIPES_AS_CONCAT时即可
Payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
拼接完之后:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag
相当于是select 1 from Flag和select flag from Flag
在这里插入图片描述

得到flag

猜你喜欢

转载自blog.csdn.net/bring_coco/article/details/108737434