客户端JavaScript代码的静态分析方法

栏目: JavaScript · 发布时间: 6年前

内容简介:原文:眼下,JavaScript已成为现代Web浏览器中最常用的技术之一,而且,使用客户端JavaScript框架(如AngularJS、ReactJS和Vue.js)构建的应用程序已经将大量功能和逻辑转移至前端。作为安全测试人员,我们必须了解这些应用程序的攻击面。对我们来说,挖掘应用程序中的潜在安全问题,必须掌握相关的信息,为此,必须知道要查找什么信息、在哪里查找以及如何查找所需的信息。

原文: https://blog.appsecco.com/static-analysis-of-client-side-javascript-for-pen-testers-and-bug-bounty-hunters-f1cb1a5d5288

眼下,JavaScript已成为现代Web浏览器中最常用的技术之一,而且,使用客户端JavaScript框架(如AngularJS、ReactJS和Vue.js)构建的应用程序已经将大量功能和逻辑转移至前端。

随着客户端功能/逻辑的增加,客户端的攻击面也会随之增加。

作为安全测试人员,我们必须了解这些应用程序的攻击面。对我们来说,挖掘应用程序中的潜在安全问题,必须掌握相关的信息,为此,必须知道要查找什么信息、在哪里查找以及如何查找所需的信息。

在本文中,我们将为读者介绍如何对客户端JavaScript代码进行静态分析,以挖掘应用程序中潜在的安全问题。

在这篇文章中,我们专注于通过静态分析来发现安全问题。因此,这里不会深入研究性能分析或功能测试。

所谓静态分析,简单来说,就是在不执行代码的情况下,完成相应的分析工作。

客户端JavaScript代码的静态分析方法

需要寻找哪些信息?

作为渗透测试人员,对客户端JavaScript进行静态分析时,我们或多或少会对以下几类信息感兴趣:

  1. 能够增加攻击面(URL、域等)的信息
  2. 敏感信息(如密码、API密钥、存储设备等)
  3. 代码中潜在的危险区域(如eval、dangerouslySetInnerHTML等)
  4. 带有已知漏洞的组件(如过时的框架等)

静态分析过程如下所示:

  1. 在应用程序中识别和收集JavaScript文件
  2. 提高所收集JavaScript代码的可读性(反精简/去混淆)
  3. 识别可以用来挖掘安全问题的线索

收集JavaScript文件

1.如果您使用Burp Suite测试应用程序,那么,可以通过多种方法来收集应用程序中的所有JavaScript文件。

我们可以通过用户驱动的工作流程对Web应用程序进行测试,像最终用户那样,通过“浏览”整个应用程序来开始测试。

通过让Burp代理发送流量来浏览应用程序。完成“浏览”后,我们就可以使用Burp的tool-set来提取所有JavaScript文件了。

-如果您使用的是Burp Suite Community Edition,则可以切换至proxy > HTTP history,并通过显示过滤器仅显示应用程序使用的那些JavaScript文件。您还可以复制显示的所有JavaScript文件的URL。

客户端JavaScript代码的静态分析方法

Burp显示过滤器仅显示给定应用程序的JavaScript文件

客户端JavaScript代码的静态分析方法

复制过滤后显示的所有JavaScript文件的URL

-如果您使用的是Burp Suite Professional版本,那么,您不仅可以复制应用程序中所有JavaScript文件的URL,还可以导出所有脚本。在Target > Site map选项卡中右键单击感兴趣的站点,然后选择Engagement tools> Find scripts,这里不仅能够导出该应用程序中的所有脚本,还可以复制相应的URL。

客户端JavaScript代码的静态分析方法

利用Burp的“Find Scripts”功能识别应用程序中的所有JS文件

客户端JavaScript代码的静态分析方法

利用Burp的"Find Scripts"功能不仅可以导出所有脚本,还能导出相关的URL

2.另一种迅速找出应用程序中的JavaScript文件的方法是挖掘诸如 Wayback Machine 之类的互联网档案数据库。不过,这种技术完全是被动式的,因为,我们不会向目标应用程序服务器发送任何请求。

挖掘[Wayback Machine](https://archive.org/web/ "Wayback Machine")等互联网档案对于识别应用程序中的JavaScript文件非常有用。有时,您将能够找到服务器上未删除的旧JavaScript文件。
  • waybackurls 是一个利用Wayback Machine搜索目标网站的JavaScript文件(或任何其他URL)的简洁工具。
go get waybackurls
waybackurls internet.org | grep "\.js" | uniq | sort

客户端JavaScript代码的静态分析方法

使用“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

客户端JavaScript代码的静态分析方法

使用cURL快速检查服务器上JavaScript文件的状态

提高所收集的JavaScript代码得可读性

有时,收集的JavaScript文件可读性非常差。具体原因,可能是开发人员对JavaScript代码进行了精简或混淆处理。

精简是指在不影响浏览器处理资源的方式的情况下,删除不必要或冗余数据的过程,例如删除代码注释和格式化字符、删除未使用的代码、使用较短的变量和函数名称等。

     混淆则涉及对程序进行相应的修改,如修改变量、函数和成员的名称,让程序代码变得晦涩难懂。

-有许多 工具 都可以用来精简JavaScript代码。其中,UglifyJS就是一个简洁的JS代码工具,可以通过npm包安装

客户端JavaScript代码的静态分析方法

使用UglifyJS精简JavaScript代码

-我们可以利用各种工具来精简JavaScript代码。其中, JS Beautifier 不仅可以美化代码,还能对采用某些混淆机制的代码进行去混淆的优秀工具。您可以通过 node.jspythononlineVS Code 等代码编辑器使用该工具。

客户端JavaScript代码的静态分析方法

使用JS Beautifier解析精简后的JavaScript代码

在执行反混淆处理时,尤其是在逆向分析恶意软件时,没有哪种工具和技术可以解决所有问题。因此,我们将不得不尝试各种工具、反混淆方法,甚至进行手动分析。在对JavaScript代码进行反混淆处理时,有各种工具可用。我们经常使用的一些工具是 JStilleryJSDetoxJS-BeautifierIlluminateJsJSNice 等。

在JavaScript代码中寻找感兴趣的信息

1.在JavaScript文件中寻找的关键信息之一就是端点信息,即完整的URL、相对路径等。

识别完整的URL、JavaScript文件中的相对路径能帮助我们发现攻击面,进而找到更多的安全漏洞

- Jobert Abma 提供的 relative-url-extractor 工具能够非常方便快速地找出JavaScript文件中的所有相对路径。这个工具可以在本地和远程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

客户端JavaScript代码的静态分析方法

使用LinkFinder从应用程序的所有JS文件中提取端点信息

  1. CloudScraper 是一种搜索云资源的工具,可以用来抓取目标。该搜索过程的副产品是,该工具还可以识别托管在云服务(如Amazon S3 Buckets)上的所有JavaScript文件。此外,该工具还可以查看JavaScript文件内容,进而寻找对云资源的引用。

客户端JavaScript代码的静态分析方法

使用CloudScraper识别源代码中的云资源

  1. JavaScript文件还可能包含敏感信息,如凭据和API密钥。从广义上讲,我们可以使用正则表达式或熵来识别源代码文件中的秘密。正则表达式搜索方法,将能够识别用户设置的相关凭据,例如用户名和密码。基于熵的搜索方法,在识别随机性较大的秘密(例如API密钥和令牌)信息方面是非常有效的。

  2. truffleHog 是一个在源代码文件中搜索秘密信息的神奇工具。该工具支持基于熵和基于正则表达式的搜索。在正则表达式搜索方法和熵搜索方法中,truffleHog还能够轻松实现高度的定制化。

  3. 但是,千万不要忘记,在搜索源代码文件的特定敏感信息时,grep/sed/awk命令的功能也非常强大。

4.在查看JavaScript文件时,重要的是识别代码中的危险区域,即开发人员往往会犯错误的地方,安全问题往往就在这里。

  • innerHTML的应用意味着可能存在XSS漏洞。在现代客户端的JavaScript框架中,确实存在innerHTML的等价物,例如在React框架中恰当命名的dangerouslytSetInnerHTML, 在过去它们确实会导致严重的安全漏洞 。在Angular中,如果bypassSecurityTrustX方法使用不当,也会导致XSS问题。此外,在客户端和服务器端,eval函数都是一个容易出现安全问题的地方。

客户端JavaScript代码的静态分析方法

Angular中的bypassSecurityTrustX方法列表

  • postMessage API 是JSONP、带有CORS头部的XHR和其他方法的替代品,可以通过绕过同源策略(SOP),在不同的域之间发送数据。如果不仅能够绕过SOP,并且还能与不同域进行通信的话,这些正是攻击者所梦寐以求的。使用postMessage时,也存在各种 安全隐患 。一旦知道了与postMessage相关的潜在安全问题,就可以在JavaScript文件中查找相关的实现代码了。在消息发送方,可以查找window.postMessage方法,而在接收方,则可以查找监听器window.addEventListener。需要牢记的是,很多框架都对postMessage实现了封装。
  • localStorage和sessionStorage是HTML Web存储对象。通过web存储,Web应用程序可以在用户的浏览器中本地存储数据。通过Web存储来识别其中存储的是哪些内容是非常重要的,因为其中一旦存储了敏感内容,就可能导致潜在的安全问题。为吃,我们可以在JavaScript中查找window.localStorage和window.sessionStorage方法。

在JavaScript中寻找可能导致潜在安全问题的危险代码高度依赖于正在使用的框架。我们应该首先确定使用了哪些框架,接着识别框架中的危险函数,然后就可以在源代码中查找它们了。

5。使用安全linter和静态安全扫描器可以很轻松地识别JavaScript代码中的容易识别的安全漏洞。 JSPrime 是一个静态分析工具,用于查找JavaScript代码中的安全隐患,但是该项目已经有一段时间没有更新了。 ESLint 是最流行的JavaScript linter之一。通过添加自定义 规则 ,ESLint很容易定制。ESLint有很多自定义安全规则,特别是针对Angular、React等现代框架的规则。

客户端JavaScript代码的静态分析方法

ESLint利用Angular的安全规则找到的潜在安全问题

6.在进行安全评估时,识别应用程序中使用的过时的和易受攻击的JavaScript框架/库是非常重要的一件事情。 Retire.js 是一个可以识别正在使用的过时JavaScript框架的工具。该工具可用作独立工具、浏览器插件、grunt插件或Burp/ZAP插件。如果您以用户驱动的方式执行测试,则RetireJS Burp插件会特别有用。由于RetireJS会出现误报,因此RetireJS报告的库并非都是易受攻击的。

客户端JavaScript代码的静态分析方法

RetireJS的Burp suite插件报告了一个过时的JavaScript库

小结

在本文中,我们介绍了一种对客户端JavaScript代码进行静态分析的通用方法。在这里,我们给出了一个完整的工作流程,包括从收集JavaScript文件到使用JavaScript代码查找安全问题的整个过程,希望对大家能够有所帮助。

参考资料


以上所述就是小编给大家介绍的《客户端JavaScript代码的静态分析方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

挑战编程

挑战编程

斯基纳 / 刘汝佳 / 2009-7 / 39.00元

《挑战编程:程序设计竞赛训练手册》分为14章,分别介绍在线评测系统的基本使用方法、数据结构、字符串、排序、算术与代数、组合数学、数论、回溯法、图遍历、图算法、动态规划、网格、几何,以及计算几何,并在附录中介绍了一些著名的程序设计竞赛以及相应的备赛建议与比赛技巧。每章的正文用十余页的篇幅覆盖了该领域最核心的概念和算法,然后给出八道可在线提交的完整编程挑战题目供读者练习。 全书内容紧凑、信息量大......一起来看看 《挑战编程》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具