眼下,JavaScript已成为现代Web浏览器中最常用的技术之一,而且,使用客户端JavaScript框架(如AngularJS、ReactJS和Vue.js)构建的应用程序已经将大量功能和逻辑转移至前端。
随着客户端功能/逻辑的增加,客户端的攻击面也会随之增加。
作为安全测试人员,我们必须了解这些应用程序的攻击面。对我们来说,挖掘应用程序中的潜在安全问题,必须掌握相关的信息,为此,必须知道要查找什么信息、在哪里查找以及如何查找所需的信息。
在本文中,我们将为读者介绍如何对客户端JavaScript代码进行静态分析,以挖掘应用程序中潜在的安全问题。
在这篇文章中,我们专注于通过静态分析来发现安全问题。因此,这里不会深入研究性能分析或功能测试。
所谓静态分析,简单来说,就是在不执行代码的情况下,完成相应的分析工作。
需要寻找哪些信息?
作为渗透测试人员,对客户端JavaScript进行静态分析时,我们或多或少会对以下几类信息感兴趣:
静态分析过程如下所示:
收集JavaScript文件
1.如果您使用Burp Suite测试应用程序,那么,可以通过多种方法来收集应用程序中的所有JavaScript文件。
我们可以通过用户驱动的工作流程对Web应用程序进行测试,像最终用户那样,通过“浏览”整个应用程序来开始测试。
通过让Burp代理发送流量来浏览应用程序。完成“浏览”后,我们就可以使用Burp的tool-set来提取所有JavaScript文件了。
-如果您使用的是Burp Suite Community Edition,则可以切换至proxy > HTTP history,并通过显示过滤器仅显示应用程序使用的那些JavaScript文件。您还可以复制显示的所有JavaScript文件的URL。
Burp显示过滤器仅显示给定应用程序的JavaScript文件
复制过滤后显示的所有JavaScript文件的URL
-如果您使用的是Burp Suite Professional版本,那么,您不仅可以复制应用程序中所有JavaScript文件的URL,还可以导出所有脚本。在Target > Site map选项卡中右键单击感兴趣的站点,然后选择Engagement tools> Find scripts,这里不仅能够导出该应用程序中的所有脚本,还可以复制相应的URL。
利用Burp的“Find Scripts”功能识别应用程序中的所有JS文件
利用Burp的"Find Scripts"功能不仅可以导出所有脚本,还能导出相关的URL
2.另一种迅速找出应用程序中的JavaScript文件的方法是挖掘诸如Wayback Machine之类的互联网档案数据库。不过,这种技术完全是被动式的,因为,我们不会向目标应用程序服务器发送任何请求。
挖掘[Wayback Machine](https://archive.org/web/ "Wayback Machine")等互联网档案对于识别应用程序中的JavaScript文件非常有用。有时,您将能够找到服务器上未删除的旧JavaScript文件。
go get waybackurls
waybackurls internet.org | grep "\.js" | uniq | sort
使用“waybackurls”提取属于Wayback Machine归档中列出的域的JavaScript文件的URL
-使用Wayback Machine时,可能会出现误报的情况,即给出服务器上已经不存在的JavaScript文件。收集JavaScript文件的URL列表后,我们就可以使用curl快速检查服务器上JavaScript文件的状态了
cat js_files_url_list.txt | parallel -j50 -q curl -w 'Status:%{http_code}\t Size:%{size_download}\t %{url_effective}\n' -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文件中的相对路径能帮助我们发现攻击面,进而找到更多的安全漏洞
-Jobert Abma提供的relative-url-extractor工具能够非常方便快速地找出JavaScript文件中的所有相对路径。这个工具可以在本地和远程JavaScript文件上使用。此外,该工具还可以直接用于经过精简处理的JavaScript代码。
使用relative-url-extractor工具从远程JS文件中提取相对路径
-在识别JavaScript文件中的所有端点及其参数方面,Gerben Javado提供的LinkFinder工具用起来也非常方便。该工具也能直接用于经过精简处理的JavaScript代码,它会通过jsbeautifier来解析JavaScript代码。此外,还可以将其用于域名,以枚举所有JavaScript文件。
python linkfinder.py -i https://example.com -d -o cli
使用LinkFinder从应用程序的所有JS文件中提取端点信息
使用CloudScraper识别源代码中的云资源
JavaScript文件还可能包含敏感信息,如凭据和API密钥。从广义上讲,我们可以使用正则表达式或熵来识别源代码文件中的秘密。正则表达式搜索方法,将能够识别用户设置的相关凭据,例如用户名和密码。基于熵的搜索方法,在识别随机性较大的秘密(例如API密钥和令牌)信息方面是非常有效的。
truffleHog是一个在源代码文件中搜索秘密信息的神奇工具。该工具支持基于熵和基于正则表达式的搜索。在正则表达式搜索方法和熵搜索方法中,truffleHog还能够轻松实现高度的定制化。
但是,千万不要忘记,在搜索源代码文件的特定敏感信息时,grep/sed/awk命令的功能也非常强大。
4.在查看JavaScript文件时,重要的是识别代码中的危险区域,即开发人员往往会犯错误的地方,安全问题往往就在这里。
Angular中的bypassSecurityTrustX方法列表
在JavaScript中寻找可能导致潜在安全问题的危险代码高度依赖于正在使用的框架。我们应该首先确定使用了哪些框架,接着识别框架中的危险函数,然后就可以在源代码中查找它们了。
5。使用安全linter和静态安全扫描器可以很轻松地识别JavaScript代码中的容易识别的安全漏洞。JSPrime是一个静态分析工具,用于查找JavaScript代码中的安全隐患,但是该项目已经有一段时间没有更新了。ESLint是最流行的JavaScript linter之一。通过添加自定义规则,ESLint很容易定制。ESLint有很多自定义安全规则,特别是针对Angular、React等现代框架的规则。
ESLint利用Angular的安全规则找到的潜在安全问题
6.在进行安全评估时,识别应用程序中使用的过时的和易受攻击的JavaScript框架/库是非常重要的一件事情。Retire.js是一个可以识别正在使用的过时JavaScript框架的工具。该工具可用作独立工具、浏览器插件、grunt插件或Burp/ZAP插件。如果您以用户驱动的方式执行测试,则RetireJS Burp插件会特别有用。由于RetireJS会出现误报,因此RetireJS报告的库并非都是易受攻击的。
RetireJS的Burp suite插件报告了一个过时的JavaScript库
小结
在本文中,我们介绍了一种对客户端JavaScript代码进行静态分析的通用方法。在这里,我们给出了一个完整的工作流程,包括从收集JavaScript文件到使用JavaScript代码查找安全问题的整个过程,希望对大家能够有所帮助。
参考资料
Performing JavaScript Static Analysis by Lewis Ardern [Video]
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/