JS代码静态分析及挖掘
随着客户端功能和逻辑的增加,客户端的攻击面也在逐渐增加。
作为安全测试人员,必须了解这些应用程序的攻击面。对测试来说,了解要查找的信息,查找的位置以及如何查找那些能导致在应用程序中发现潜在安全问题的信息都很重要。
在这篇博文中,我们将介绍如何对客户端 JavaScript 代码进行静态分析来发现应用程序中潜在的安全问题。
我们特别感兴趣的事情是通过执行静态分析发现安全问题。我们不会深入研究性能分析或功能测试。
我们需要找哪些信息?
作为渗透测试人员,对客户端 JavaScript 进行静态分析时,我们或多或少会对以下几类信息感兴趣 :
- 会增加攻击面(URL,域等)的信息
- 敏感信息(密码,API 密钥,存储等)
- 代码中的潜在危险位置(eval,dangerouslySetInnerHTML 等)
- 具有已知漏洞的组件(过时的框架等)
执行静态分析的步骤
我们将执行静态分析分解为以下几个步骤:
- 识别和收集应用程序中的 JavaScript 文件
- 将收集的 JavaScript 代码进行可读处理(Unminify / Deobfuscate)
- 识别可能导致发现安全问题的信息
收集 JavaScript 文件
1.如果你使用的是 Burp Suite 测试应用程序,那么有多种方法可以收集应用程序中的所有 JavaScript 文件。
在 Appsecco 中,我们遵循用户驱动的工作流程来测试 Web 应用程序,我们通过模拟用户浏览整个应用程序来开始测试。
通过设置 Burp 代理在浏览应用程序时将产生的流量发送到Burp。完成浏览后,你可以使用 Burp 的工具集来提取所有的 JavaScript 文件。
如果你使用的是 Burp Suite Community Edition,则可以在菜单中导航到 proxy > HTTP history 并使用显示过滤器,设置为仅显示应用程序使用的JavaScript文件。你还可以复制已显示的所有 JavaScript 文件的 URL。
挖掘 Wayback Machine 等互联网档案对于识别应用程序中的 JavaScript 文件非常有用。有时你将能够找到在服务器上还未删除的 JavaScript 文件。
- waybackurls 是一个利用 Wayback Machine 搜索感兴趣的网站的 JavaScript 文件(或任何其他 URL)的简洁工具。
go get waybackurls waybackurls internet.org | grep“\ .js”| uniq | sort
- 使用 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 文件可能无法读取或可读性较差。这可能是因为开发人员已经将 JavaScript 代码进行缩小或混淆。
缩小:指在不影响浏览器处理资源的方式的情况下删除不必要或冗余数据的过程;例如代码注释和格式化,删除未使用的代码,使用较短的变量和函数名称等等。
混淆:涉及对程序进行修改,更改变量,函数和成员的名称,使程序更难理解。
- 有各种工具可以缩小 JavaScript。UglifyJS 是一个简洁的 JS 代码处理工具,它也可以作为 npm 包使用
在 JavaScript 中识别有趣的信息
1. 在 JavaScript 文件中寻找的关键信息之一:端点,即完整的 URL,相对路径等。
识别完整的 URL 和 JavaScript 文件中的相对路径将帮助我们发现攻击面并可能发现更多的漏洞
- relative-url-extractor是由 Jobert ABMA 开发的一个非常方便且快速识别一个 JavaScript 文件中的所有相对路径的工具。此工具可以在本地和远程 JavaScript 文件上工作。此工具可以直接在压缩过的 JavaScript 上工作
- LinkFinder 是由Gerben Javado 开发的一个确定所有端点和端点所对应的 JavaScript 文件中的参数的工具。此工具也可以直接在压缩过的 JavaScript 上工作,它通过 jsbeautifier 还原 JavaScript。也可以针对某个域名运行此工具来枚举所有的 JavaScript 文件。
python linkfinder.py -i https://example.com -d -o cli
- truffleHog 是一个在源代码文件中搜索密钥的神奇工具。此工具支持基于熵和基于正则表达式的搜索。在正则表达式搜索和熵搜索中,truffleHog 也可以轻松高度的自定义。
- 不要忘记,在搜索源代码文件的特定敏感信息时,grep / sed / awk 也非常强大。
4. 在查看 JavaScript 文件时,重要的是识别代码中的危险位置,即开发人员往往会犯错误的地方,这会导致潜在的安全问题。
- innerHTML 的用法表示可能存在XSS问题。在现代客户端 JavaScript 框架中也存在与 innerHTML 等价的方法,eval 功能是另一个在客户端和服务器端都可能出错的地方。例如 React 框架中的 dangerouslytSetInnerHTML 并且它们确实在过去导致过严重的安全漏洞。在 Angular 中对于 bypassSecurityTrustX 方法的不正确使用也会导致 XSS 问题。
- 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 等现代框架。
JS代码静态分析及挖掘的更多相关文章
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!
原文地址 迁移到:http://www.bdata-cap.com/newsinfo/1741515.html 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和f ...
- C/C++代码静态分析工具调研
C/C++代码静态分析工具调研 摘自:https://www.jianshu.com/p/92886d979401 简述 静态分析(static analysis)是指在不执行代码的情况下对其进行分析 ...
- Firebug调试js代码
Firebug功能异常强大,不仅可以调试DOM,CSS,还可以调试JS代码,下面介绍一下调试JS. 1.认识console对象 console对象是Firebug内置的对象,该对象可以在代码中写入,可 ...
- 浏览器控制台js代码与后台不同步
原因:浏览器会缓存js 如果是将js代码直接通过<script>标签插入jsp页面中则不存在这个问题 在加载页面的时候会重新加载js代码 如果直接将js代码以文件的形式引入,那么每次在修改 ...
- js封装的三级联动菜单(使用时只需要一行js代码)
前言 在实际的项目开发中,我们经常需要三级联动,比如省市区的选择,商品的三级分类的选择等等. 而网上却找不到一个代码完整.功能强大.使用简单的三级联动菜单,大都只是简单的讲了一下实现思路. 下面就给大 ...
- 阻止pc端浏览器缩放js代码
阻止pc端浏览器缩放js代码 众所周知:移动端页面禁止用户缩放界面只需加上<meta name="viewport" content="user-scalable= ...
- 还原网站上压缩的js代码
还原网站上压缩的js代码 我们经常可以看到一些网站,把所需的javascript代码压缩成一行,就像下图这样 这种代码浏览器能读懂,但正常人是没法阅读的. 既然浏览器能读,浏览器当然也能还原这段代码. ...
- 我们为什么要看《超实用的Node.JS代码段》
不知道自己Node.JS水平如何?看这张图 如果一半以上的你都不会,必须看这本书,一线工程师用代码和功能页面来告诉你每一个技巧点. 都会一点,但不知道如何检验自己,看看本书提供的面试题: 1. ...
随机推荐
- Java笔记(day13)
多线程: 进程:正在进行中的程序(直译) 线程:执行路径,就是进程中负责程序执行的控制单元(执行路径): 一个进程中可以多个路径,称为多线程 一个进程至少一个线程 每一个线程都有自己运行的内容,这个内 ...
- 迁移WPF项目到.NET CORE
综述 .NET CORE 3.0开始,桌面端支持WPF了.很多.NET FRAMEWORK的项目已经跑了一阵子了,不是很有必要支持.NET CORE,不过最近用一个程序,为了贯彻一些C# 8的特性,需 ...
- Java——Spring超详细总结
Spring概述 一.简化Java开发 Spring为了降低Java开发的复杂性,采用了以下四种策略 基于POJO的轻量级和最小侵入性编程: 通过依赖注入和面向接口实现松耦合: 基于切面和惯例进行声明 ...
- spring学习笔记(五)自定义spring-boot-starter(1)
在我们开始定义之前我们应该知道springBoot的大致运行原理,我们从springBoot启动类开始.首先我们看下这个注解,@SpringBootApplication,跟进去可以看到如下代码: @ ...
- Day_14【IO流】扩展案例1_缓冲区字符输入、输出流,键盘录入,contains()方法的统一运用
分析以下需求,并用代码实现 实现一个验证码小程序,要求如下: 1. 在项目根目录下新建一个文件:data.txt,键盘录入3个字符串验证码,并存入data.txt中,要求一个验证码占一行: 2. 键盘 ...
- [java作业]Fan、求直线交点、Triangle2D、选课
public class Fan { public static void main(String[] args) { Fan fan1 = new Fan(), fan2 = new Fan(); ...
- 管理环境一:venv
初衷: 在工作的时候,我们会有很多个项目,每个项目使用的库的版本不一样,导致我们切换项目的时候会很麻烦. 比如:我有两个django项目,项目一使用的版本是 django 1.7 , 项目二使用的版本 ...
- flink入门学习
Flink学习笔记 一.简介 1.定义: 针对流数据和批数据的分布式处理引擎.它主要是由 Java 代码实现.. 2.应用场景: 流数据:把所有任务当成流来处理,处理观察和分析连续事件产生的数 ...
- 豹子安全-注入工具-疑问_MySQL_基于联合查询_按钮【获取基本信息】不能成功的解决方法。
豹子安全-注入工具-疑问_MySQL_基于联合查询_按钮[获取基本信息]不能成功的解决方法. 网站: http://www.leosec.net 如下GIF影片所示:
- 向大家介绍我的新书:《基于股票大数据分析的Python入门实战》
我在公司里做了一段时间Python数据分析和机器学习的工作后,就尝试着写一本Python数据分析方面的书.正好去年有段时间股票题材比较火,就在清华出版社夏老师指导下构思了这本书.在这段特殊时期内,夏老 ...