case when 15 like '1%' then 0 else 2*1e308 end
在一次日常的web安全检测时发现的一个sql注入,刚开始是直接扔sqlmap里面的,后面发现sqlmap对于这个站是怎么样都无法正常的检测注入
如下图:
而手工检测是可以注入但是人家返回的是你输入的内容,也就是不会有数据库的数据返回
这就很蛋疼了,并且通过这个网站的一处输入与输出的地方,我还知道了,他会全局把
(
)
过滤为[
]
这就说明我们注入的时候是没有函数可以给我们使用的,也解释了为什么sqlmap会检测不出来。
如下图:
好了前言介绍完了,剩下的就是与项目无关了
最后在实战时,发现可以使用 union + case when 来进行布尔盲注获取数据,也就是通过他,我的项目成功通过了,我们在本地模拟一下,因为在发肯定会漏,而且也不好理解
我在本地写了几行代码,模拟线上的情况。
<?php
$id = @$_GET['id'];
$dsn = "mysql:host=127.0.0.1; port=3306; dbname=test; charset=utf8";
$user = 'root';
$psw ='root';
$pdo = new PDO($dsn, $user, $psw);
$sql = 'select * from test';
if (!empty($id)) {
$id = str_replace("(", "[", $id);
$id = str_replace(")", "]", $id);
} else {
exit;
}
$sql .= ' where ' . 'id = ' . $id;
echo 'sql:' . $sql;
echo '<br/>';
echo '<br/>';
echo '<br/>';
//进行查询数据库出问题则报具体错误
$query = $pdo->query($sql);
$res = @$query->fetch();
if ($res) {
// 这里写访问记录+1 但是我不想写,所以就直接把那个+1的流程去掉了
echo 'studio_one_hour_pageview_' . $id . '_53aa9d8bcf7749bdb0bbajksbdjkasbd';
}
好了其实前面都是在凑字数的 : )
后面发现我们可以使用这种方法来进行注入
例如查库名: