我和JS文件不得不说的故事
JS里能找到啥?
作为一个安全从业人员,我们最关心的就是Js文件中的这些东西:
- 会增加攻击面的信息(URL,域名等)
- 敏感信息(密码,API密钥,bucket等)
- 代码中的潜在危险函数操作(eval,dangerallySetInnerHTML等)
- 具有已知漏洞的组件(过时的框架等)
怎么去找?
- 识别并收集应用程序中的JavaScript文件
- 使收集的JavaScript代码可读(取消最小化/反混淆)
- 识别可能导致安全问题的信息(找敏感词)
收集整理js文件
如果你是使用Burp Suite来进行测试,就可以通过多种方式来收集应用程序中的所有JavaScript文件。这也是俺比较喜欢的一种方式
挂着burp,然后浏览应用程序。浏览结束后,burp会被动或主动记录下所有经过burp的请求,其中就包括你请求的js文件,然后咱们就可以使用burp提取出js文件?
如果你使用的是Burp Suite社区版,则可以导航到 Proxy > HTTP history,并使用显示过滤器仅显示该应用程序使用的JavaScript文件。您还可以复制所有显示的JavaScript文件的URL。
如果使用的是Burp Suite专业版,不仅可以复制应用程序中所有JavaScript文件的url,还可以导出所有js文件内容。在Target > sitemap下,右键点击感兴趣的站点,选择Engagement tools>Find scripts。使用此特性,你可以导出该应用程序中的所有脚本内容。
还有一种利用【互联网归档数据库】快速查找Js文件的方法,如Wayback Machine,这种技术是完全被动的,因为我们不向目标应用服务器发送任何请求。
Wayback Machine可以理解为一个互联网的历史记录数据库,你可以在里面找到某个网站所有的链接
它的地址是(可能需要爬墙):https://archive.org/web/
在诸如Wayback Machine之类的Internet档案库中进行挖掘对于识别应用程序中的JavaScript文件非常有用。有时,能够找到服务器上未删除的较旧的JavaScript文件
waybackurls是一个使用Wayback Machine搜索某个站点JavaScript文件(或者任何其他url)的工具,大家可以瞅瞅
使用Wayback Machine可能会导致误报,所以,在收集了JavaScript文件的url列表之后,我们需要检查这个js文件是否真的还存在,可以使用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
如果你觉得上面的方法太麻烦了,也可以使用其它现成的工具,例如:hakcheckurl
- 安装:
go get github.com/hakluke/hakcheckurl
- 使用:
cat lyftgalactic-js-urls.txt | hakcheckurl
Js文件美化
大多数时候,我们收集的JavaScript文件都是经过压缩、混淆的。
有很多工具可以压缩JavaScript。UglifyJS是一个压缩JS代码的工具,它也可以作为npm包使用
有很多工具可以解压缩js。例如JS Beautifier,这个工具很强大,我们可以在各个语言中使用它,例如node.js、python等
当我们在反混淆时,特别是在逆向恶意程序时,没有一种技术或工具是一劳永逸的。我们将不得不尝试各种工具、去混淆方案。当然,目前已经有很多工具可以帮助咱们去混淆Js代码,例如:
- JStillery:
https://github.com/mindedsecurity/JStillery
- JSDetox: ``
- JS-Beautifier
- IlluminateJs
- JSNice
寻找敏感信息
接口
js文件中有很多接口,这些接口可以扩展我们的攻击面,例如,我在水滴src中某个页面下发现的js文件:
虽然经过测试这些接口貌似都没有未授权访问问题,但是,只要肯挖,说不定下一次就是一个高危敏感信息泄露呢?
当然,也有一些很方便的工具帮助我们从js文件中提取这些接口:
relative-url-extractor:这个工具既可以直接从线上js文件中提取接口,也可以从本地文件中提取,并且,它还可以从压缩的js代码中提取,直接省去了咱们前面说的美化js的步骤
LinkFinder:这个工具也相当nice,应该很多人都知道,使用也很简单:
python linkfinder.py -i https://example.com -d -o cli
当然,还有国内一位安全研究员写的JSFinder,也是很好用的
密码、密钥等
找这些敏感信息也还是靠正则,当然还有一种技术叫entropy,俺也不知道这个怎么翻译才好,应该就是根据一串字符串的随机性来判断这个字符串是否是密钥,我们都知道,密钥都是一串字符嘛,同样的,有工具?,安心做个脚本小子吧:
- DumpsterDiver
- Repo-supervisor
- truffleHog
除此之外,还可以用grep/sed/awk等工具来搜索敏感词
我都说了,shell玩得好,老婆随便找
危险函数、操作
下面的内容逐渐超出我漏洞挖掘的耐心范围,非战斗人员请撤离❗️❗️❗️
JS中的一些函数使用可能带来潜在的问题,例如innerHTML的使用就可能带来dom xss问题
而现在前端框架琳琅满目,我一个都不会,md
他们用的方法名字那叫一个长呀,React中就有一个和innerHTML差不多的函数叫做dangerouslytSetInnerHTML,这个函数也是咱们的重点关注对象
然后还有Angular中的bypassSecurityTrustX,还有咱们熟悉的eval函数
除此之外,还有postMessage函数值得关注,这个函数相关的问题都可以专门开一篇文章讲了,这里就不多说了,下次一定,下次也不一定...
localStorage和sessionStorage是HTML Web存储对象
通过web storage,web应用程序可以在用户的浏览器中本地存储数据
识别使用Web Storage存储的内容非常重要,尤其是可能导致潜在安全问题的内容
在JavaScript中,我们可以可以查找window.localStorage
以及window.sessionStorage
。这里俺也不太了解,留待大家去探索吧?
寻找js中的危险函数、危险代码高度依赖目标所使用的的前端技术栈,不说了,先去学webpack了
哦,对了,我们还可以使用工具呀?
- JSPrime:是一种静态代码分析工具,用于查找JavaScript代码中的安全性问题,但是该项目已经有一段时间没有更新了。
- ESLint:是最流行的JavaScript工具之一,通过添加自定义规则,对它进行自定义。ESLint提供了许多自定义安全规则,尤其是针对现代框架(如Angular,React等)。
存在漏洞的框架
老生常谈的问题,寻找一些老旧的存在问题的前端框架,不过,我觉得这个基本没啥用,为了文章完整性还是列出来吧
如果目标程序使用了一些存在漏洞的前端框架,那对我们来说也是一点曙光不是?
关于这个的挖掘,直接上工具吧——Retire.js
Retire.js是一个可以识别应用程序使用的老旧JavaScript框架的工具
该工具可以用作独立工具,浏览器扩展,grunt插件或Burp / ZAP扩展。当然,这个工具也还是有很多误报的,不过作为参考还是不错的嘛
- 巧用 Hive 模拟分布式 grep
- 串行乘法器
- 一例 Hive join 优化实战
- 奇数分频
- Nginx log error:client sent invalid userid cookie
- Shell 参数扩展及各类括号在 Shell 编程中的应用
- linux 系统监控、诊断工具之 IO wait
- 关于 MySQL UTF8 编码下生僻字符插入失败/假死问题的分析
- Windows用户自查:微软紧急更新修复Meltdown和Spectre CPU漏洞
- rsync error: protocol incompatibility / mismatch
- 玩转 SHELL 脚本之:Shell 命令 Buffer 知多少?
- 使用实体嵌入的结构化数据进行深度学习
- CoffeeMiner:劫持WiFi网络接入设备进行“挖矿”的框架
- 数码管显示电路的Verilog HDL 实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java 使用Collections.reverse对list集合进行降序排序
- Liquibase异常 mysql数据库 Cannot add foreign key constraint
- Linux获取文件最后修改时间
- Crontab脚本无法正常执行问题
- Python 输入时间字符串以分钟单位计算时间差
- Linux下执行bcp指令
- Python 处理时间差
- Zabbix发送带附件的邮件
- CentOs7下Zabbix安装教程——zabbix agent安装和前端配置
- CentOs7下Zabbix安装教程——zabbix server安装
- CentOs7下Zabbix安装教程——准备工作
- python:HTTP Error 505: HTTP Version Not Supported
- PYES异常: TypeError: 'NoneType' object is not callable
- 第十八篇 zabbix创建自定义报警媒介
- 原创|如果懂了HashMap这两点,面试就没问题了