[SUCTF 2019]EasySQL

 尝试注入,我们发现它并没有注释掉show,database,那就尝试堆叠注入

1;show databases;

成功得到回显

 同理我们show tables也行

1;show tables;

 但是show columns from Flag就不行

它就只有简单的Array ( [0] => 1 )

那我就推断一下:
他的后端既然能做到数字回显字母不回显,说明有一个 或 结构,而且不直接回显flag

然后既然是找旗子的,则原语句应该为from Flag

随所以猜测原来的sql语句是

select $_POST['query'] || flag from flag

基于这个猜测,我们的payload就是

*1

得到了我们的flag

至于为什么是*,1呢

首先我们先明白1||flag,这个或语句,明显返回的1,所以我们拼接一下就是

select *,1 from flag

select 1 from 的意思其实是建立一个临时列,这个列的所有初始值都被设为1

关键就是这个*了

 

还有一种方法是看大佬的博客学的

把||变成字符串连接符,而不是或

涉及到mysql中sql_mode参数设置,设置 sql_mode=pipes_as_concat字符就可以设置

1;set sql_mode=PIPES_AS_CONCAT;select 1

就是把 || 设置成了 concat函数

上面那句执行是:

select concat(1,flag) from Flag

 

 

参考链接:https://blog.csdn.net/StevenOnesir/article/details/110203051

posted @ 2024-07-22 22:00  xiancaiyu  阅读(15)  评论(0编辑  收藏  举报