JavaScript 已经成为现代 Web 浏览器开发中最普遍的技术之一。使用客户端 JavaScript 框架(如 AngularJS,ReactJS 和 Vue.js)构建的应用程序已向前端输送了大量功能和逻辑。

随着客户端功能和逻辑的增加,客户端的攻击面也在逐渐增加。

作为安全测试人员,必须了解这些应用程序的攻击面。对测试来说,了解要查找的信息,查找的位置以及如何查找那些能导致在应用程序中发现潜在安全问题的信息都很重要。

在这篇博文中,我们将介绍如何对客户端 JavaScript 代码进行静态分析来发现应用程序中潜在的安全问题。

我们特别感兴趣的事情是通过执行静态分析发现安全问题。我们不会深入研究性能分析或功能测试。

 
Static analysis is analysing code without executing it.

我们需要找哪些信息?

​作为渗透测试人员,对客户端 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 display filters to display only JavaScript files for a given application

 
Copy the URLs for all the JavaScript file displayed after filtering

 
Burp “Find Scripts” to identify all the JS files on an application

 
Burp “Find scripts” can export all the scripts, not just URLs
​另一种在应用程序中快速列出 JavaScript 文件的有趣技术是挖掘类似 Wayback Machine 之类的互联网档案数据库。此技术完全是被动的,因为我们不需要向目标应用程序的服务器发送任何请求。

挖掘 Wayback Machine 等互联网档案对于识别应用程序中的 JavaScript 文件非常有用。有时你将能够找到在服务器上还未删除的 JavaScript 文件。

go get waybackurls waybackurls internet.org | grep“\ .js”| uniq | sort

 
Using “waybackurls” to extract URLs for JavaScript files that belong to a domain that are listed in Wayback Machine archive

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

 
Using cURL to quickly check for the status of the JavaScript files on the server
​对收集的 JavaScript 代码进行可读处理

有时,你收集的 JavaScript 文件可能无法读取或可读性较差。这可能是因为开发人员已经将 JavaScript 代码进行缩小或混淆。
缩小:指在不影响浏览器处理资源的方式的情况下删除不必要或冗余数据的过程;例如代码注释和格式化,删除未使用的代码,使用较短的变量和函数名称等等。

混淆:涉及对程序进行修改,更改变量,函数和成员的名称,使程序更难理解。

  • 有各种工具可以缩小 JavaScript。UglifyJS 是一个简洁的 JS 代码处理工具,它也可以作为 npm 包使用

 
Minify JavaScript using UglifyJS
有各种工具可以简化 JavaScript。JS Beautifier 是一个可以美化和反混淆某些混淆方案的工具。你可以通过 node.jspythononline 或 VS Code 等代码编辑器使用此工具。

 
Unminify JavaScript using JS Beautifier
在执行反混淆处理尤其是在处理恶意软件时,没有一种适合所有技术的通用工具。你将不得不尝试各种工具,反混淆方案并执行一些手动分析。但是有多种工具可以帮助你反混淆 JavaScript 代码。我们经常使用的一些工具是 JStilleryJSDetoxJS-BeautifierIlluminateJsJSNice 等。

在 JavaScript 中识别有趣的信息

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

识别完整的 URL 和 JavaScript 文件中的相对路径将帮助我们发现攻击面并可能发现更多的漏洞

  • relative-url-extractor是由 Jobert ABMA 开发的一个非常方便且快速识别一个 JavaScript 文件中的所有相对路径的工具。此工具可以在本地和远程 JavaScript 文件上工作。此工具可以直接在压缩过的 JavaScript 上工作

 
Using relative-url-extractor to extract relative paths from remote JS file

  • LinkFinder 是由Gerben Javado 开发的一个确定所有端点和端点所对应的 JavaScript 文件中的参数的工具。此工具也可以直接在压缩过的 JavaScript 上工作,它通过 jsbeautifier 还原 JavaScript。也可以针对某个域名运行此工具来枚举所有的 JavaScript 文件。

python linkfinder.py -i https://example.com -d -o cli

 
Using LinkFinder to extract endpoints from all the JS files in an application
2. CloudScraper 是一种用于搜寻云资源的爬虫和抓取目标的工具。可以查看 JavaScript 文件来查找对云资源的引用。此搜索产生的副作用是该工具还会识别托管在云服务(如 Amazon S3 Buckets)上的所有 JavaScript 文件。

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

  • truffleHog 是一个在源代码文件中搜索密钥的神奇工具。此工具支持基于熵和基于正则表达式的搜索。在正则表达式搜索和熵搜索中,truffleHog 也可以轻松高度的自定义。
  • 不要忘记,在搜索源代码文件的特定敏感信息时,grep / sed / awk 也非常强大。

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

  • innerHTML 的用法表示可能存在XSS问题。在现代客户端 JavaScript 框架中也存在与 innerHTML 等价的方法,eval 功能是另一个在客户端和服务器端都可能出错的地方。例如 React 框架中的 dangerouslytSetInnerHTML 并且它们确实在过去导致过严重的安全漏洞。在 Angular 中对于 bypassSecurityTrustX 方法的不正确使用也会导致 XSS 问题。

​​

 
List of bypassSecurityTrustX methods in Angular

  • 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 等现代框架。

 
ESLint with Angular security rules reporting potential security issues
6. 在执行安全性评估时,识别应用程序中使用的老版本的和易受攻击的 JavaScript 框架/库非常重要。Retire.js 是一个可以识别正在使用的 JavaScript 框架是否过时的工具。此工具可用作独立工具,浏览器扩展,grunt 插件或 Burp / ZAP 扩展。如果你以用户驱动的方式执行测试,则 RetireJS Burp 扩展特别有用。尽管 RetireJS 可以产生一些误报,但 RetireJS 报告的并非易受攻击的漏洞。

 
RetireJS Burp suite extension reporting an outdated JavaScript library

JS代码静态分析及挖掘的更多相关文章

  1. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】

    原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...

  2. 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!

    原文地址 迁移到:http://www.bdata-cap.com/newsinfo/1741515.html 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和f ...

  3. C/C++代码静态分析工具调研

    C/C++代码静态分析工具调研 摘自:https://www.jianshu.com/p/92886d979401 简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析 ...

  4. Firebug调试js代码

    Firebug功能异常强大,不仅可以调试DOM,CSS,还可以调试JS代码,下面介绍一下调试JS. 1.认识console对象 console对象是Firebug内置的对象,该对象可以在代码中写入,可 ...

  5. 浏览器控制台js代码与后台不同步

    原因:浏览器会缓存js 如果是将js代码直接通过<script>标签插入jsp页面中则不存在这个问题 在加载页面的时候会重新加载js代码 如果直接将js代码以文件的形式引入,那么每次在修改 ...

  6. js封装的三级联动菜单(使用时只需要一行js代码)

    前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...

  7. 阻止pc端浏览器缩放js代码

    阻止pc端浏览器缩放js代码 众所周知:移动端页面禁止用户缩放界面只需加上<meta name="viewport" content="user-scalable= ...

  8. 还原网站上压缩的js代码

    还原网站上压缩的js代码 我们经常可以看到一些网站,把所需的javascript代码压缩成一行,就像下图这样 这种代码浏览器能读懂,但正常人是没法阅读的. 既然浏览器能读,浏览器当然也能还原这段代码. ...

  9. 我们为什么要看《超实用的Node.JS代码段》

    不知道自己Node.JS水平如何?看这张图 如果一半以上的你都不会,必须看这本书,一线工程师用代码和功能页面来告诉你每一个技巧点. 都会一点,但不知道如何检验自己,看看本书提供的面试题: 1.     ...

随机推荐

  1. POJ 2777——线段树Lazy的重要性

    POJ 2777 Count Color --线段树Lazy的重要性 原题 链接:http://poj.org/problem?id=2777 Count Color Time Limit: 1000 ...

  2. 利用github的webhook进行自动部署

    利用github的webhook进行自动部署 github提供了webhook功能,大概意思就是,当你提交了代码,git检测到你进行了push,可以调起你一个你知道的url. 这个功能有什么用了?比如 ...

  3. Codeforces Round #639 (Div. 2)

    Codeforces Round #639 (Div. 2) (这场官方搞事,唉,just solve for fun...) A找规律 给定n*m个拼图块,每个拼图块三凸一凹,问能不能拼成 n * ...

  4. P3983 赛斯石(双背包)

    这题不算难的,但是脑子真的特别乱.....传送门 \(Ⅰ.物品可以拆开来但船不能拆开来,所以1-10载重船的最大收益完全可以用背包求出来.\) \(Ⅱ.最后一定是选一些船走,而船的收益已经固定.所以用 ...

  5. E. Marbles 状压dp

    E. Marbles 这个是一个状压dp 题目大意是:给你一个数组,数组的数在1到20之间,有一个操作就是交换相邻的两个数,问 让所有相同的数相邻的最小操作次数 dp[s] 表示s状态下的操作次数,w ...

  6. B - Housewife Wind POJ - 2763 树剖+边权转化成点权

    B - Housewife Wind POJ - 2763 因为树剖+线段树只能解决点权问题,所以这种题目给了边权的一般要转化成点权. 知道这个以后这个题目就很简单了. 怎么转化呢,就把这个边权转化为 ...

  7. 面试官:小伙子,听说你看过ThreadLocal源码?(万字图文深度解析ThreadLocal)

    前言 Ym8V9H.png (高清无损原图.pdf关注公众号后回复 ThreadLocal 获取,文末有公众号链接) 前几天写了一篇AQS相关的文章:我画了35张图就是为了让你深入 AQS,反响不错, ...

  8. 【Hadoop离线基础总结】oozie定时任务设置

    目录 简介 概述 oozie定时任务设置 1.拷贝定时任务的调度模板 拷贝hello.sh脚本 3.修改配置文件 4.上传到hdfs对应路径 5.运行定时任务 简介 概述 在oozie当中,主要是通过 ...

  9. [USACO07DEC]Best Cow Line G 字符串hash || 后缀数组

    [USACO07DEC]Best Cow Line G [USACO07DEC]Best Cow Line G 小声哔哔:字符串hash牛逼 题意 给出一个字符串,每次可以从字符串的首尾取出一个字符, ...

  10. 【疑问】SQLServer_DNS注入数据库因为点号不能显示数据库的库名的方法[语音和音乐]

    你好,欢迎关注我的网站: www.leosec.net