BUU sql注入-[SUCTF 2019]EasySQL
Posted 1vyyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BUU sql注入-[SUCTF 2019]EasySQL相关的知识,希望对你有一定的参考价值。
一、题目
点开页面,是一个提交表单
二、解题
1. 先试试一些常规的姿势
输入数字有回显
输入其他字符(或数字后加单引号构造闭合)都没有回显,应该是关闭了错误提示
那么我们可以确定这里是字符型注入
2. 优先考虑用联合查询
无论输啥数字都显示nonono,初步推断有关键字被后台过滤掉了
一个一个试(也可以在BP里面buzz测试)
常用的关键字只有show和select没被过滤掉(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 来输出文件的全部内容,二是修改这类字符的定义
以上是关于BUU sql注入-[SUCTF 2019]EasySQL的主要内容,如果未能解决你的问题,请参考以下文章