DNSlog 注入不成功的原因剖析及解决方案
2022-11-28 20:20:24682浏览
DNSlog 可以在没有直接回显的前提下,借助 DNS 查询拿到注入结果,但是这个漏洞也有其特殊的条件,如果条件不满足则无法成功。如果你也遇到诸如失败的情况,可以参考本文尝试解决。

一、SQL 配置文件需要特殊配置

MySQL 提供了一个函数 load_file 来加载文件,以方便读取配置文件或者加载文件数据,这个函数也可以引用网络文件。

因此,在一些可能存在注入,但是没有直接回显的场景,我们可以用 load_file 读写一个不存在的网络文件的方式,让 MySQL 发起网络请求。即便请求不成功,也会因为进行了 DNS 解析请求从而在服务器上留下记录,这些记录包括子域名,只要把获取到的内容附着在子域名里面,就可以在服务器日志中收到回显了。

不过这个 load_file 需要经过配置方可使用,接下来我们先修改一下这个配置。

1. 打开 phpStudy

2. 依次点击“其他选项”→“MySQL工具”→“打开数据库目录”

3. 在数据库目录里,点击回到上一层

4. 选中 my.ini ,然后右击,点击“编辑”

5. 在文件中的空白处,新增一行

secure_file_priv=''

👆注意这里是两个单引号而不是一个双引号

6. 保存文件并退出编辑

7. 点击 phpStudy 上的“重启”按钮

二、DNS 查询会被缓存

DNS 查询通常会被缓存,即便受害者服务器没有缓存,也可能被其他任何一个参与递归查询的服务器缓存,这就会导致 DNS 服务器只能收到第一次访问记录,后面的访问无法记录。

对此我们可以每次都构造不同的二级域名,确保每次都会发起 DNS 解析请求。

解决方案:

每次测试的语句里,都使用一个不同的数字作为二级域名,然后把查询的数据添加到三级域名,例如下图的 payload 中:

红框内的数字 8 就是本次查询的特殊数字。

这样做的另一个好处是:我们可以清楚地知道是第几个 payload 产生了作用!

友情链接: