渗透测试及漏洞挖掘技巧干货分享——客户端JavaScript静态分析
Posted 嘶吼专业版
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了渗透测试及漏洞挖掘技巧干货分享——客户端JavaScript静态分析相关的知识,希望对你有一定的参考价值。
javascript已经成为现代Web浏览器开发中最普遍的技术之一。使用客户端JavaScript框架(如AngularJS,ReactJS和Vue.js)构建的应用程序已向前端输送了大量功能和逻辑。
随着客户端功能和逻辑的增加,客户端的攻击面也在逐渐增加。
作为安全测试人员,我们必须了解这些应用程序的攻击面。对我们来说,了解要查找的信息,查找的位置以及如何查找那些能导致在应用程序中发现潜在安全问题的信息都很重要。
在这篇博文中,我们将介绍如何对客户端JavaScript代码进行静态分析来发现应用程序中潜在的安全问题。
我们特别感兴趣的事情是通过执行静态分析发现安全问题。我们不会深入研究性能分析或功能测试。
静态分析是分析代码而不是执行代码。
我们需要找哪些信息?
作为渗透测试人员,对客户端JavaScript进行静态分析时,我们或多或少会对以下几类信息感兴趣 :
1.会增加攻击面(URL,域等)的信息
2.敏感信息(密码,API密钥,存储等)
3.代码中的潜在危险位置(eval,dangerouslySetInnerhtml等)
4.具有已知漏洞的组件(过时的框架等)
执行静态分析的步骤
我们将执行静态分析分解为以下几个步骤:
1.识别和收集应用程序中的JavaScript文件
2.将收集的JavaScript代码进行可读处理(Unminify / Deobfuscate)
3.识别可能导致发现安全问题的信息
收集JavaScript文件
1.如果你使用的是Burp Suite测试应用程序,那么有多种方法可以收集应用程序中的所有JavaScript文件。
在Appsecco中,我们遵循用户驱动的工作流程来测试Web应用程序,我们通过模拟用户浏览整个应用程序来开始测试。
通过设置Burp代理在浏览应用程序时将产生的流量发送到Burp。完成浏览后,你可以使用Burp的工具集来提取所有的JavaScript文件。
如果你使用的是Burp Suite Community Edition,则可以在菜单中导航到proxy > HTTP history并使用显示过滤器,设置为仅显示应用程序使用的JavaScript文件。你还可以复制已显示的所有JavaScript文件的URL。
Burp显示过滤器仅显示给定的应用程序的JavaScript文件
复制过滤后显示的所有JavaScript文件的URL
如果你使用的是Burp Suite Professional,在Target > Site map中右键点击感兴趣的网站,然后选择Engagement tools > Find scripts;使用此功能,你可以导出该应用程序中的所有脚本,还可以复制URL。
Burp 中的“查找脚本”功能可以识别应用程序上的所有JS文件
Burp中的“查找脚本”的功能可以导出所有脚本,而不仅仅是URL
2.另一种在应用程序中快速列出JavaScript文件的有趣技术是挖掘类似Wayback Machine之类的互联网档案数据库。此技术完全是被动的,因为我们不需要向目标应用程序的服务器发送任何请求。
挖掘Wayback Machine 等互联网档案对于识别应用程序中的JavaScript文件非常有用。有时你将能够找到在服务器上还未删除的JavaScript文件。
waybackurls是一个利用Wayback Machine搜索感兴趣的网站的JavaScript文件(或任何其他URL)的简洁工具。
go get waybackurls waybackurls internet.org | grep“ .js”| uniq | sort
使用“waybackurls”提取在Wayback Machine归档中列出的域名的JavaScript文件的URL列表后,可以使用curl快速检查服务器上JavaScript文件的状态。
cat js_files_url_list.txt | parallel -j50 -q curl -w 'Status:%{http_code} Size:%{size_download} %{url_effective} ' -o /dev/null -sk
使用cURL快速检查服务器上JavaScript文件的状态
对收集的JavaScript代码进行可读处理
有时,你收集的JavaScript文件可能无法读取或可读性较差。这可能是因为开发人员已经将JavaScript代码进行缩小或混淆。
缩小:指在不影响浏览器处理资源的方式的情况下删除不必要或冗余数据的过程;例如代码注释和格式化,删除未使用的代码,使用较短的变量和函数名称等等。
混淆:涉及对程序进行修改,更改变量,函数和成员的名称,使程序更难理解。
有各种工具可以缩小JavaScript。UglifyJS是一个简洁的JS代码处理工具,它也可以作为npm包使用
使用UglifyJS压缩JavaScript
有各种工具可以简化JavaScript。JS Beautifier是一个可以美化和反混淆某些混淆方案的工具。你可以通过node.js,python,online或VS Code等代码编辑器使用此工具。
使用JS Beautifier解析JavaScript
在执行反混淆处理尤其是在处理恶意软件时,没有一种适合所有技术的通用工具。你将不得不尝试各种工具,反混淆方案并执行一些手动分析。但是有多种工具可以帮助你反混淆JavaScript代码。我们经常使用的一些工具是JStillery,JSDetox,JS-Beautifier,IlluminateJs,JSNice等。
在JavaScript中识别有趣的信息
1.在JavaScript文件中寻找的关键信息之一:端点,即完整的URL,相对路径等。
识别完整的URL和JavaScript文件中的相对路径将帮助我们发现攻击面并可能发现更多的漏洞
relative-url-extractor 是由Jobert ABMA开发的一个非常方便且快速识别一个JavaScript文件中的所有相对路径的工具。此工具可以在本地和远程JavaScript文件上工作。此工具可以直接在压缩过的JavaScript上工作
使用relative-url-extractor从远程JS文件中提取相对路径
LinkFinder是由 Gerben Javado开发的一个确定所有端点和端点所对应的JavaScript文件中的参数的工具。此工具也可以直接在压缩过的JavaScript上工作,它通过jsbeautifier还原JavaScript。也可以针对某个域名运行此工具来枚举所有的JavaScript文件。
python linkfinder.py -i https://example.com -d -o cli
使用LinkFinder从应用程序中的所有JS文件中提取端点
2.CloudScraper是一种用于搜寻云资源的爬虫和抓取目标的工具。可以查看JavaScript文件来查找对云资源的引用。此搜索产生的副作用是该工具还会识别托管在云服务(如Amazon S3 Buckets)上的所有JavaScript文件。
使用CloudScraper识别源代码中的云资源
3.JavaScript文件还可能包含敏感信息,如凭据和API密钥。从广义上讲,我们可以使用正则表达式或熵来识别源代码文件中的秘密。正则表达式搜索将能够识别用户设置的凭据,例如用户名和密码。基于熵的搜索在识别足够随机的密钥(例如API密钥和令牌)方面是非常有效的。
truffleHog是一个在源代码文件中搜索密钥的神奇工具。此工具支持基于熵和基于正则表达式的搜索。在正则表达式搜索和熵搜索中,truffleHog也可以轻松高度的自定义。
不要忘记,在搜索源代码文件的特定敏感信息时,grep / sed / awk也非常强大。
4.在查看JavaScript文件时,重要的是识别代码中的危险位置,即开发人员往往会犯错误的地方,这会导致潜在的安全问题。
innerHTML的用法表示可能存在XSS问题。在现代客户端JavaScript框架中也存在与innerHTML等价的方法,eval功能是另一个在客户端和服务器端都可能出错的地方。例如React框架中的dangerouslytSetInnerHTML并且它们确实在过去导致过严重的安全漏洞。在Angular中对于bypassSecurityTrustX方法的不正确使用也会导致XSS问题。
Angular中的bypassSecurityTrustX 方法列表
postMessage API是JSONP和带有CORS头的XHR以及其他方法的替代方法,可以通过绕过同源策略(SOP)在源之间发送数据。绕过SOP并与不同来源进行通信的想法应该是攻击者非常感兴趣的事情。使用postMessage时会存在各种安全隐患,一旦了解了与postMessage相关的安全问题,就可以在JavaScript文件中查找实现。在消息发送方,寻找window.postMessage并在接收方端寻找一个监听器window.addEventListener。你必须记住,很多框架都在postMessage代码的附近实现了包装器。
localStorage和sessionStorage是HTML Web存储对象。在JavaScript中,你可以查找window.localStorage和window.sessionStorage实现,通过Web存储,Web应用程序可以在用户的浏览器中本地存储数据。使用Web存储识别存储内容是重要的,特别是存储敏感的任何内容都可能导致潜在的安全问题。
在JavaScript中查找可能导致潜在安全问题的危险位置强依赖于正在使用的技术堆栈。你应该确定正在使用的框架,在框架中识别危险的函数,然后在源代码中查找它们。
5.使用安全评估工具和静态安全扫描程序可以轻松识别JavaScript代码中的低危漏洞。JSPrime是一个静态分析工具,用于查找JavaScript代码中的安全问题,但项目暂时没有更新。ESLint是最流行的JavaScript 评估工具之一。通过添加自定义规则,可以轻松自定义ESLint。ESLint提供了许多自定义安全规则,特别是针对Angular,React等现代框架。
配置了Angular安全规则的ESLint报告了潜在的安全问题
6.在执行安全性评估时,识别应用程序中使用的老版本的和易受攻击的JavaScript框架/库非常重要。Retire.js是一个可以识别正在使用的JavaScript框架是否过时的工具。此工具可用作独立工具,浏览器扩展,grunt插件或Burp / ZAP扩展。如果你以用户驱动的方式执行测试,则RetireJS Burp扩展特别有用。尽管RetireJS可以产生一些误报,但RetireJS报告的并非易受攻击的漏洞。
Burp套件扩展插件——RetireJS报告了一个过时的JavaScript库问题
结论
在这篇博文中,我们介绍了一种执行客户端JavaScript代码静态分析的通用方法。我们所介绍的只是一个工作流程,能够指导你从收集JavaScript文件开始到使用JavaScript代码查找安全问题。
参考
Lewis Ardern执行JavaScript静态分析 [视频]
https://statuscode.ch/2015/05/static-javascript-analysis-with-burp/
http://blog.blueclosure.com/2017/10/javascript-dangerous-functions-part-2_29.html
https://reverseengineering.stackexchange.com/questions/4561/how-to-deobfuscate-an-obfuscated-javascript-file-like-this
https://labs.detectify.com/2016/12/08/the-pitfalls-of-postmessage/
https://angular.io/guide/security
https://blog.jse.li/posts/marveloptics-malware
以上是关于渗透测试及漏洞挖掘技巧干货分享——客户端JavaScript静态分析的主要内容,如果未能解决你的问题,请参考以下文章
常见36种WEB渗透测试漏洞描述及解决方法-不安全HTTP方法