如果您正在测试 Web 应用程序,您肯定会遇到很多 JavaScript。如今几乎每个网络应用程序都在使用它。Angular、React 和 Vue.js 等框架将 Web 应用程序的许多功能和业务逻辑放置到前端。因此,要彻底测试 Web 应用程序,您必须分析它们的客户端 JavaScript。
这篇文章向您展示了如何操作。它涵盖了静态和动态分析的基础知识,介绍了混淆和反混淆,并解释了如何绕过代码保护机制,同时给出了实际示例并为特定任务建议了适当的工具。
请注意,这篇博文相当长。您可以慢慢观看。现在,事不宜迟,让我们开始吧!
静态分析
静态分析是在不执行软件的情况下对软件进行分析。静态分析的目标可以有很多。代码中的 URL 可能会增加攻击面并暴露出损坏的访问控制。代码还可能包含密码、秘密或 API 密钥等敏感信息。此外,使用危险功能或过时的软件可能会给应用程序带来漏洞。
收集 JavaScript 代码
要执行静态分析,您首先需要收集 JavaScript 代码。我知道的最简单的方法是使用 Burp Suite,如下所示:
-
过滤代理 HTTP 历史记录以仅显示带有 js 扩展名的文件:
-
标记 JavaScript 文件和复制 URL 的结果列表:
-
将 URL 保存到文本文件:
-
用于wget -i urls.txt下载它们:
或者,您可以使用浏览器的开发者工具,逐个下载文件:
识别端点
要发现 JavaScript 文件中的端点和参数,您可以使用LinkFinder。结果可以保存到 HTML 或打印到 stdout:
$ python linkfinder.py -i 'js/*' -o result.html
$ python linkfinder.py -i 'js/*' -o cli
与其他命令行工具的结合也可能是有益的:
$ python linkfinder.py -i 'js/*' -o cli | sort -u | grep rest
/rest/admin
/rest/captcha
/rest/chatbot
/rest/continue-code
/rest/continue-code/apply/
/rest/continue-code-findIt
/rest/continue-code-findIt/apply/
/rest/continue-code-fixIt
/rest/continue-code-fixIt/apply/
/rest/country-mapping
/rest/deluxe-membership
/rest/image-captcha/
/rest/memories
/rest/order-history
/rest/products
/rest/repeat-notification
/rest/saveLoginIp
/rest/track-order
/rest/user
/rest/user/authentication-details/
/rest/user/change-password?current=
/rest/user/login
/rest/user/reset-password
/rest/user/security-question?email=
/rest/user/whoami
/rest/wallet/balance
检测秘密
要检测代码中的秘密,您可以使用TruffleHog。早些时候,TruffleHog 专注于 git 存储库中的秘密。如今,它本身支持文件系统等。只要确保使用子命令即可filesystem。
$ ./trufflehog filesystem ~/Downloads/js --no-verification --include-detectors="all"
🐷🔑🐷 TruffleHog. Unearth your secrets. 🐷🔑🐷
Found unverified result 🐷🔑❓
Detector Type: AWS
Decode Type: PLAIN
Raw result: AKIAIOSFODNN7EXAMPLE
File: ~/Downloads/js/main.js
Burp Suite Professional 用户还可以使用JS Miner来检测端点和秘密。一旦 JavaScript 文件被被动分析,问题就会显示在 Burp Suite 的问题仪表板中。
根据我的经验,JS Miner 在检测 JavaScript 中的秘密和端点方面提供了最佳结果。
如果您正在搜索特定的内容,您当然也可以使用基本的命令行工具,例如grep. 您可能想尝试的关键词是:
password
admin
login
token
user
auth
key
定位危险功能
Semgrep是一个用于检测代码漏洞的开源分析工具。您可以配置自己的检测规则或使用社区创建的规则。这些不仅能够检测秘密,而且还能够检测潜在易受攻击的方法的使用:
JavaScript 中有趣的函数和属性例如:
Element.innerHTML
eval()
window.postMessage()
window.addEventListener()
window.localStorage
window.sessionStorage
document.cookie
过时的库
过时的 JavaScript 库通常包含漏洞。一个常见的例子是jQuery。通常,您可以在库的路径或文件名中找到版本信息,或者在文件本身中以版本字符串的形式找到版本信息。
要检查漏洞是否已发布,您可以使用snyk.io等在线服务。
Burp Suite Professional 有一个内置的依赖性检查器,可以自动执行此过程。此外,还可以使用Burp Suite Professional 扩展Retire.js 。
注意:在报告之前,请验证该 Web 应用程序确实存在漏洞! 库中的漏洞通常仅影响特定功能。如果 Web 应用程序不使用这些函数,那么尽管包含该库,它也不容易受到攻击。使用上述方法在 Web 应用程序的 JavaScript 中搜索易受攻击的函数。
动态分析
动态分析是对软件执行过程中的分析。通常,您不想分析整个软件,而只想分析特定部分或功能。这使您可以重建其功能,并且优于复杂计算的静态分析。
基本工具
JavaScript 动态分析的基本工具是浏览器的开发人员工具。与 Firefox 相比,我更喜欢 Chromium 的开发工具,因为它们的性能更高。
您可以通过主菜单栏或按 F12 打开它们。
这将在当前活动选项卡中打开一个工具栏。选择“来源”选项卡。
它由 4 部分组成:
-
当前页面的源文件
-
所选文件的内容
-
调试工具
-
交互式控制台(如果不存在则使用 ESC 打开)
应用示例
我编写了一个小示例应用程序来演示基本技术。它具有简单的 ping 服务,您可以在其中输入主机并接收 ping 命令的输出。这样的服务应该容易受到命令注入的攻击。那么,让我们仔细看看。
客户端过滤
首先,我分析按下提交按钮时发送的请求。JWT被发送到服务器,其中包含要 ping 的主机等值。JWT 已签名。这使得我们无法在 Burp Suite 中操纵主机值或在不使签名无效的情况下有效地执行主动扫描。
127.0.0.1;id因此,我尝试从 Web 应用程序本身发送基本命令注入有效负载。下图显示了注射的工作原理。
但特殊字符;在客户端会被过滤掉。hostJWT 内的值包含value 127.0.0.1id。
寻找切入点
为了分析按下提交按钮时发生的情况,我右键单击它并选择Inspect。
这将打开开发人员工具中的“元素”选项卡。按钮的 HTML 不会显示任何内容,因为没有onclick属性。但选择“事件监听器”选项卡显示事件监听器已注册以调用 secure.js 第 3 行中的提交函数。
我通过单击 的链接切换回“源”secure.js选项卡。为了分析该函数,我通过单击左侧的行号在第 4 行中创建了一个断点。断点显示在右侧的工具栏中。
调试器
我再次单击“提交” 。JavaScript 执行在第 4 行停止,调试器启动。我通过按 F9 或单击工具栏顶部的相应符号来逐步执行特定的 JavaScript 语句。
在每个包含变量的语句之后,执行后其内容会显示在其旁边,并以黄色突出显示。正则表达式似乎删除了所有特殊字符,但._-.
在将清理后的主机值作为有效负载提交给 JWT 之前,我使用工具栏的“范围”部分将变量的值更改回原始输入。
点击播放按钮将恢复代码正常执行,并显示命令注入成功。
一般建议
另外三点注意:
-
为了检测入口点,有时通过工具栏在任何 XHR/fetch上设置断点会很有帮助。这样,执行会在发送 XHR 之前暂停,并显示先前语句的所有计算变量。
-
签名密钥当然也存在于 JavaScript 中。可以在 Burp Suite 中提取并使用它来计算正确的签名。我将在后续主题中介绍这一点。
-
DOM Invader是 Burp Suite 内置浏览器的扩展,有助于测试 DOM XSS。像往常一样,PortSwigger 的资源非常好.
原文始发于微信公众号(红队笔记录):渗透测试人员之 JavaScript 分析(一)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论