在渗透测试中,关键的就是信息收集阶段,收集信息的多少很大程度影响到攻击面的大小,这里不再对基本的信息收集步骤进行介绍,只讨论一下如何通过JS拓展信息收集面,这里仅仅是我用到的一些方法和工具,有没写到的欢迎师傅们在评论区补充。
域名收集
对于域名收集,分为根域名收集和子域名收集,在渗透测试的初期,如果是只有一个根域名,那么可以通过收集其他的根域名来拓展子域名的收集面,对于收集其他根域名,有很多不同的方式,从js角度来说,因为在js中会存在一些接口调用,其中不乏有其他域名的接口,那么这样只要在JS中发现了其他的域名,转而再去收集这些域名中的JS文件进行分析,那么就可以收集到很多根域名和子域名了,这个步骤人工做起来难免有些复杂,已经有师傅写过一些工具可以一键收集,这个会在下面进行介绍。
另外可以通过天眼查的网站备案来找出很多根域名
敏感信息
API信息
在JS中通常会存在一些页面的API,如果后端没有进行验证,那么可能造成未授权漏洞或者越权漏洞,例如在没有登录的情况下通过JS代码发现了后台中一些功能的API,那么可以通过尝试这些API,尤其是查询信息的API来测试是否有漏洞,比较多的一种情况是,首先在发现后台后,通过种种方式,获得一个低权限的用户,进入后通过审计JS代码, 很多情况下都会有意想不到的收获,例如有的时候,这些JS中就存在超级管理员的一些API,通过调用这些API,可以使用一些超级管理员的功能。
密码等敏感信息
可以通过正则表达式来获取JS文件中的一些密码信息,有的程序员为了更好的维护代码、调试代码,经常在源码中加各种注释。比如为了方便调试,直接把账号密码写在Javascript代码中,调试完后,只是把这条语句注释掉而非删掉;有时候系统更迭,推出一些新的接口,开发人员把老接口注释掉使用新的接口,但服务器端并没有把老接口关掉等等。
AJAX请求
Ajax请求通常是被各个事件触发调用,而这些事件的触发往往需要满足一定条件。但很多时候,即便事件触发条件未满足,我们去构造Ajax请求的数据包发送给服务器端,依然可以得到服务器的响应。
例如一个修改密码的流程可能是先验证手机号,然后再修改密码,那么如果通过js中的信息找到了修改密码的Ajax请求,那么就可以尝试直接构造请求来修改密码
JS中存在危险函数
危险函数有直接执行JavaScript、加载URL、执行HTML、创建元素、部分可控执行五类
直接执行JavaScript
这类危险函数直接把输入以JavaScript代码的形式执行,例如。
eval(payload)
setTimeout(payload, 100)
setInterval(payload, 100)
Function(payload)()
<script>payload</script>
<img src=x onerror=payload>
加载URL
这类危险函数以URL加载的形式执行JavaScript代码,但是大体和JavaScript类似。
location=javascript:alert(/xss/)
location.href=javascript:alert(/xss/)
location.assign(javascript:alert(/xss/))
location.replace(javascript:alert(/xss/))
执行HTML
这类危险函数直接把输入以HTML代码的形式执行,在一定情况下可以执行代码。
xx.innerHTML=payload
xx.outerHTML=payload
document.write(payload)
document.writeln(payload)
创建元素
这类调用大多是创建一个DOM元素,并将其加入页面中。当script的源可控或者元素的构造可控的时候,可能会出现问题。
scriptElement.src
domElement.appendChild
domElement.insertBefore
domElement.replaceChild
部分可控执行
这类调用存在一定的动态成分,可控的程度不高,但是在部分情况下存在价值,因此在工具中加入了对其的监控。
(new Array()).reduce(func)
(new Array()).reduceRight(func)
(new Array()).map(func)
(new Array()).filter(func)
存在漏洞的框架
无论jQuery 1、jQuery 2或jQuery 3各版本都存在数个漏洞,分别有跨站脚本、类型污染以及DoS等漏洞,jQuery的热门模块也存在许多漏洞,像是jquery-mobile、jquery-fileupload以及jquery-colorbox函数库,存在跨站脚本或是任意程序代码执行漏洞。Retire.js是一个可以识别应用程序使用的老旧JavaScript框架的工具,可以在burpsuite上安装插件进行
收集JS文件
使用burpsuite收集JS文件
对于一个网站的JS,可以使用Burpsuite进行收集
然后将结果导出就可以获得在当前页面收集到的JS文件了
利用历史库
https://archive.org/web/
Wayback Machine可以理解为一个互联网的历史记录数据库,你可以在里面找到某个网站所有的链接,获取到后,可能有些文件已经删除了,所以可以使用工具或者命令来批量验证这些文件是不是存在,可以使用hakcheckurl
- 安装:
go get github.com/hakluke/hakcheckurl
- 使用:
cat jslinks.txt | hakcheckurl
敏感信息收集工具
JSINFO-SCAN
https://github.com/p1g3/JSINFO-SCAN
这个工具采用递归的方法,一开始只需要一个域名,然后运行后就会递归的爬取JS文件进行分析,然后将收集到的主域名、子域名、api以及其他敏感信息保存下来,其中收集到的主域名和子域名还会继续递归,还可以设置关键字以及黑名单,用于搜集根域名、扩充子域名,黑名单用于当返回包中含有这些关键字则不再进行二次爬取
使用方法
python3 jsinfo.py --target www.xxx.com --keywords baidu --black_keywords test
在实际使用中,这个工具能收集到的信息非常多,尤其是根域名和子域名,但是运行速度很慢,可以结合nohup命令放在服务器上跑,但是有一点是这个保存结果是在Ctrl+C后才把收集到的信息从内存中保存到文件中,使用nohup命令后,可以使用kill -9 进程的PID号 来中断程序,否则程序会一直运行。
如图,该工具会将收集到信息的数量显示出来,并且新发现的根域名和子域名也会显示,中断程序后会将结果自动保存,另外通过代码可以看到,该工具会通过这些正则表达式来查找一些敏感信息
self.leak_info_patterns = {'mail': r'([-_a-zA-Z0-9\.]{1,64}@%s)', 'author': '@author[: ]+(.*?) ',
'accesskey_id': 'accesskeyid.*?["\'](.*?)["\']',
'accesskey_secret': 'accesskeyid.*?["\'](.*?)["\']',
'access_key': 'access_key.*?["\'](.*?)["\']', 'google_api': r'AIza[0-9A-Za-z-_]{35}',
'google_captcha': r'6L[0-9A-Za-z-_]{38}|^6[0-9a-zA-Z_-]{39}$',
'google_oauth': r'ya29\.[0-9A-Za-z\-_]+',
'amazon_aws_access_key_id': r'AKIA[0-9A-Z]{16}',
'amazon_mws_auth_toke': r'amzn\\.mws\\.[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',
'amazon_aws_url': r's3\.amazonaws.com[/]+|[a-zA-Z0-9_-]*\.s3\.amazonaws.com',
'amazon_aws_url2': r"("r"[a-zA-Z0-9-\.\_]+\.s3\.amazonaws\.com"r"|s3://[a-zA-Z0-9-\.\_]+"r"|s3-[a-zA-Z0-9-\.\_\/]+"r"|s3.amazonaws.com/[a-zA-Z0-9-\.\_]+"r"|s3.console.aws.amazon.com/s3/buckets/[a-zA-Z0-9-\.\_]+)",
'facebook_access_token': r'EAACEdEose0cBA[0-9A-Za-z]+',
'authorization_basic': r'basic [a-zA-Z0-9=:_\+\/-]{5,100}',
'authorization_bearer': r'bearer [a-zA-Z0-9_\-\.=:_\+\/]{5,100}',
'authorization_api': r'api[key|_key|\s+]+[a-zA-Z0-9_\-]{5,100}',
'mailgun_api_key': r'key-[0-9a-zA-Z]{32}',
'twilio_api_key': r'SK[0-9a-fA-F]{32}',
'twilio_account_sid': r'AC[a-zA-Z0-9_\-]{32}',
'twilio_app_sid': r'AP[a-zA-Z0-9_\-]{32}',
'paypal_braintree_access_token': r'access_token\$production\$[0-9a-z]{16}\$[0-9a-f]{32}',
'square_oauth_secret': r'sq0csp-[ 0-9A-Za-z\-_]{43}|sq0[a-z]{3}-[0-9A-Za-z\-_]{22,43}',
'square_access_token': r'sqOatp-[0-9A-Za-z\-_]{22}|EAAA[a-zA-Z0-9]{60}',
'stripe_standard_api': r'sk_live_[0-9a-zA-Z]{24}',
'stripe_restricted_api': r'rk_live_[0-9a-zA-Z]{24}',
'github_access_token': r'[a-zA-Z0-9_-]*:[a-zA-Z0-9_\-]+@github\.com*',
'rsa_private_key': r'-----BEGIN RSA PRIVATE KEY-----',
'ssh_dsa_private_key': r'-----BEGIN DSA PRIVATE KEY-----',
'ssh_dc_private_key': r'-----BEGIN EC PRIVATE KEY-----',
'pgp_private_block': r'-----BEGIN PGP PRIVATE KEY BLOCK-----',
'json_web_token': r'ey[A-Za-z0-9-_=]+\.[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*$',
'slack_token': r"\"api_token\":\"(xox[a-zA-Z]-[a-zA-Z0-9-]+)\"",
'SSH_privKey': r"([-]+BEGIN [^\s]+ PRIVATE KEY[-]+[\s]*[^-]*[-]+END [^\s]+ PRIVATE KEY[-]+)",
'possible_Creds': r"(?i)("r"password\s*[`=:\"]+\s*[^\s]+|"r"password is\s*[`=:\"]*\s*[^\s]+|"r"pwd\s*[`=:\"]*\s*[^\s]+|"r"passwd\s*[`=:\"]+\s*[^\s]+)", }
LinkFinder
https://github.com/GerbenJavado/LinkFinder
LinkFinder是一个Python脚本,旨在发现JavaScript文件中的端点及其参数。这样,渗透测试人员和Bug猎手就可以在他们正在测试的网站上收集新的,隐藏的端点。导致新的测试环境,可能包含新的漏洞。它通过将jsbeautifier for python与相当大的正则表达式结合使用来实现。
可以使用python3运行
git clone https://github.com/GerbenJavado/LinkFinder.git
cd LinkFinder
pip3 install -r requirements.txt
python setup.py install
使用实例
- 在在线JavaScript文件中查找端点并将HTML结果输出到results.html的最基本用法:
python linkfinder.py -i https://example.com/1.js -o results.html
- CLI / STDOUT输出(不使用jsbeautifier,这使其非常快):
python linkfinder.py -i https://example.com/1.js -o cli
python linkfinder.py -i https://example.com -d
python linkfinder.py -i burpfile -b
- 枚举JavaScript文件的整个文件夹,同时查找以/ api /开头的端点,最后将结果保存到results.html中:
python linkfinder.py -i 'Desktop/*.js' -r ^/api/ -o results.html
https://github.com/jobertabma/relative-url-extractor
这个工具可以直接从线上js文件中提取接口,也可以从本地文件中提取接口,在提取时,会自动对代码进行美化
参考
https://xz.aliyun.com/t/5380
https://noob-sec.github.io/%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E4%B9%8Bjs%E6%96%87%E4%BB%B6/
https://wooyun.js.org/drops/JS%E6%95%8F%E6%84%9F%E4%BF%A1%E6%81%AF%E6%B3%84%E9%9C%B2%EF%BC%9A%E4%B8%8D%E5%AE%B9%E5%BF%BD%E8%A7%86%E7%9A%84WEB%E6%BC%8F%E6%B4%9E.html
https://www.mad-coding.cn/2019/12/23/JS%E6%96%87%E4%BB%B6%E4%BF%A1%E6%81%AF%E6%94%B6%E9%9B%86%E5%B7%A5%E5%85%B7-LinkFinder/#3-2-%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B