[SUCTF 2019]EasySQL

[SUCTF 2019]EasySQL

要点:

a.堆叠注入。

b.||在oracle和mysql数据库功能的联想,sql_mode=pipes_as_concat的使用。

c.猜测后端语句。(较难)

(1)打开靶场,简单测试一下

图片.png

payload
1            页面正常回显
1'            页面无回显
1' or 1=1    回显nonono(猜测可能被过滤掉了一些东西)

(2)用fuzz字典扫一下

图片.png

好家伙,好多关键词被过滤了。

  • 注:这里博主的字典不全漏了union(后面手工注入才发现)

用不了union联合查询注入,where关键词也被过滤了,只剩下堆叠注入可以尝试一下;

(3)尝试一下堆叠注入

图片.png
好像还真可以

1;show databases;
1; show tables;

我去,到了列这里出了问题。
图片.png

试了一下,from和Flag都被过滤掉了;
试了一些方法绕不过去;

(4)没办法,去找了一下大佬的wp

据大佬给出的wp,他给出的解释是想让做题的人去猜测后端语句。

通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用。

(5)解法

  • 解法1:既然select post进去的数据||flag from Flag,那不妨通过修改SQL配置将或运算符||设置为连接符。

结合堆叠注入,构造payload(oracle 支持 通过 ‘ || ’ 来实现字符串拼接,但在mysql 不支持。mysql可以通过更改sql_mode=pipes_as_concat来使 || 用作拼接的作用。)

1;set sql_mode=PIPES_AS_CONCAT;select 1

图片.png
得到flag

  • 解法2:

大佬给的另一种解法

如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,也就是select *,1 from Flag,也就是直接查询出了Flag表中的所有内容

payload

*,1

这里也是利用了||的或功能,1||flag的返回值是1;

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2023 00hello00

请我喝杯咖啡吧~

支付宝
微信