一、不是所有的注入点都会直接回显注入结果
通常来讲,如果注入点是出现在查询、搜索等语句中,那么注入拿到的数据很可能直接从接口就返回了,这就好比你问张三:“你叫什么名字?”,张三回答:“在下就是知名《刑法》实践者张三同志”。
但是很多时候,注入点是不会直接回显你所注入的语句查询到的结果的,比如说你在一个用来删除数据的接口里成功注入语句,但这毕竟是删除语句,因此它不会返回任何查询的结果。
那么,这种情况下,怎样才能把查询的结果带出来呢?这就需要“盲注”了。
二、盲注的一般思路
在需要盲注的场景下,直接返回已经是不可能的了,但是我们还可以采用别的方法来拿到结果。
1. DNSlog 盲注
DNSlog 的玩法是非常“骚气”的,因为在网络应用中, DNS 查询是一个很常见的行为,甚至有些防火墙都会对其网开一面,因此在绝大部分渗透场景都是可以用 DNS 往外“夹带私货”的,比如 XSS、解析漏洞等等。
部分 SQL 注入点也支持 DNSlog 外带查询结果,具体详见这一片锦囊:https://ke.yijincc.com/wechat/info/detail?id=76 。
2. 时间盲注
假如有一群“理想”的美女,你拿到了她们的微信,然后你挨个给她们发消息,以测试她们对你的印象如何。那么一种假设就是:如果对方对你有意思的话,就会秒回信息——看到没有,即便她们回复的都是同样的信息“好的”,但是从时间长短你也可以推测其他信息。
当然,女生的心情比较难猜,而且人家可能正好玩手机、心情好所以秒回,也有可能是正在考试所以隔半天才回复,这些都是“不理想”的情形,会极大地影响我们的判断,所以上面所假设的才是“理想”的美女。
而数据库就不一样了,它永远是理想的,如果没出问题的话它们是“有求必应”的——因此我们可以构造大量表达式,每一个表达式只确定一个因素,通过简单的二分法就可以拿到精确的信息。
3. 报错盲注
作为一种程序,数据库理应在出错的时候提供详尽的错误报告,来帮助程序员定位到具体的问题,如果程序员没有将这些错误信息隐藏起来,而是任其暴露在了用户的眼前,那么用户就有可能从中推测出数据库的其他信息。
最常见的一种,当你查询一个不存在的表名字的时候,数据库可能会告诉你:数据库“用户表”中不存在名为“学生”的表。虽然查询是失败的,但是我们得知了一个信息——当前数据库的名字是“用户表”。
除了这种数据库主动暴露的内容之外,像 updatexml、 floor、extractvalue 等函数,如果善加利用,就可以利用报错注入场景获得更多更详尽的信息。