WHCSRL 技术网

BUU sql注入-[SUCTF 2019]EasySQL

一、题目

 

 点开页面,是一个提交表单

二、解题

1.  先试试一些常规的姿势

 

 输入数字有回显

 

输入其他字符(或数字后加单引号构造闭合)都没有回显,应该是关闭了错误提示

那么我们可以确定这里是字符型注入

2.  优先考虑用联合查询

 

无论输啥数字都显示nonono,初步推断有关键字被后台过滤掉了

一个一个试(也可以在BP里面buzz测试)

 

 

 

 

 

常用的关键字只有showselect没被过滤掉(or被过滤了肯定order也用不了)

联合查询可以放弃了

3.  我们知道在语句里穿插分号,可以同时执行多条命令,这就是堆叠注入的原理

于是用show尝试

 

 

 爆库爆表之后发现flag文件 Flag

好家伙,flag都被过滤掉了

再试试handler

 

......(流汗黄豆脸) 

4.  报错注入,时间盲注就别考虑了

测试之后 extractvalue(),sleep这些关键字都被过滤掉

冥思苦想(看了别人的wp)

这里我们回到最开始测试得到的结论

除非零数字外,输入其他字符都不会得到回显

 于是猜测后台语句中存在 "||",如下

select $_GET['query'] || flag from Flag

 在MySQL中,"||" 起到的是“或”的作用,这就是输入0和其他字符没有回显的原因

 而在Oracle中,"||" 起到的是连接字符串的作用

于是有两种解法

方法一:使用通配符 * 

通配符 * 的在查询语句中的作用是匹配所有结果集

构造payload:

*,1

整个查询语句就变为

select *,1 || flag from Flag

1 || flag 等价于 1

从而会输出Flag里面所有内容

方法二:修改配置

可以让MySQL里的 "||" 变成Oracle里的 "||"

构造payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1

整个查询语句变成

select 1;set sql_mode=PIPES_AS_CONCAT;select 1 || flag from Flag

concat()作用一样

得到flag

 三、总结

1. 这里猜测管道符 || 的存在确实是比较刁钻,不过有一点点提示都好,至少没把show这些关键字过滤掉,要不然真的是没啥办法

2. 遇到 "||" 等符号存在的时候有两种绕过方式,一是用 *,1 来输出文件的全部内容,二是修改这类字符的定义

推荐阅读