JS应用
常见分析调试:
-代码全局搜索
案例
登录框,可以看到发送用户名密码被JS加密
![](https://img-blog.csdnimg.cn/direct/3c47f46520484da3bcf717d5eb66511a.png)
搜索Username,找到加密地方
logindata.UserName = encodeURI(encrypt.encrypt(numMobile));
logindata.Mobile = encodeURI(encrypt.encrypt(numMobile));;
//加密密码
logindata.Password = encodeURI(encrypt.encrypt(numPassword));
![](https://img-blog.csdnimg.cn/direct/667fe397b79a4d069030bfe37d96b013.png)
使用控制台加密,报错没有声明函数
encodeURI(encrypt.encrypt(1231231424));
![](https://img-blog.csdnimg.cn/direct/7fb23359ec9d4055b50a1c5ab6047130.png)
搜索encrypt,找到声明encrypt函数的地方
![](https://img-blog.csdnimg.cn/direct/e348f8f7d56742c48132c1452ceb8408.png)
声明encrypt函数后进行加密
var encrypt = new JSEncrypt();
encodeURI(encrypt.encrypt(1231231424));
![](https://img-blog.csdnimg.cn/direct/39cd0a39278647ef84527fae35aab8aa.png)
断点
-文件流程断点
案例
发送数据包后可以在启动器看到有发送顺序
![](https://img-blog.csdnimg.cn/direct/4d79143c731a4f7486b7910cd5ccf1f5.png)
点击Login.js?v=20240516211949:222
跳转到ajax
![](https://img-blog.csdnimg.cn/direct/a7d09bd3b6574aa0aa35f42471692041.png)
点击左边,进行断点调试,然后重新登录,放在logindta上就可以看到,登录数据已经被加密了
![](https://img-blog.csdnimg.cn/direct/4f0e37577fca446484c9d9193c6fc9f9.png)
打开调用堆栈,查看数据什么时候被加密的
![](https://img-blog.csdnimg.cn/direct/222358e86a3347069da7d4afeca7f185.png)
搜索logindata,鼠标放到encrypt.encrypt,显示了加密算法文件
![](https://img-blog.csdnimg.cn/direct/db776b3770244475b250f804ca815028.png)
-代码标签断点
案例
鼠标放到登录,右击检查标签
![](https://img-blog.csdnimg.cn/direct/f7fc26752e89429d917ec476c6340cc7.png)
鼠标右击点击中断于属性修改,有修改就断
![](https://img-blog.csdnimg.cn/direct/2dd61989968d40ee867b9ef12d68c5b2.png)
点击登录就成功断点
![](https://img-blog.csdnimg.cn/direct/06dcf86d71414b74ad13a782bd742483.png)
断点找到加密用户名密码js
![](https://img-blog.csdnimg.cn/direct/9e37b41d27854479918ba5d7dece0265.png)
将加密js文件全部复制
![](https://img-blog.csdnimg.cn/direct/b6570b0e2c7c4ac28e0580b59745edf9.png)
将o直接赋值为生成出来的值
var r = new JSEncrypt
o = "305c300d06092a864886f70d0101010500034b003048024100959684a0076fd2a8fc1589469cf8c95f16ef67490c519f4d274373f29cee64cf6a0db8ad8953122c5b3664e4a48acd34d9b95c0ae62a31be612632e1c49154db0203010001"
;
r.setPublicKey(o);
var s = r.encrypt(123)
console.log(s)
![](https://img-blog.csdnimg.cn/direct/fe2529bb918640df97f7def291f4a188.png)
-XHR提交断点
案例
先抓包看类型是不是xhr
![](https://img-blog.csdnimg.cn/direct/b5115274fa824736adb1cc21dcdae180.png)
在请求包标头找到请求网址的路径,复制/Vip/LoginResult
![](https://img-blog.csdnimg.cn/direct/8f8d41926acd4daea6b5fb60a97127b7.png)
然后找到源代码,将复制的路径添加到XHR断点
![](https://img-blog.csdnimg.cn/direct/fac7368ff5914efca5e20471bbe4ecf1.png)
点击登录就被断点
![](https://img-blog.csdnimg.cn/direct/e3f599229e2a459bbc7411cd4c74c9fc.png)
![](https://img-blog.csdnimg.cn/direct/5caacdd5114e4447a8fc6579e6f9b36f.png)
-密码登录枚举爆破
JS逆向-结合BurpSuite-插件引用
根据使用系统下载phantomjs
![](https://img-blog.csdnimg.cn/direct/23b42f39c1b145789078c76883f0027b.png)
设置环境变量
将phantomjs路径添加到path里面
![](https://img-blog.csdnimg.cn/direct/27e58a28cecd4d47b80a54103ee2679c.png)
检查环境变量是否设置成功
![](https://img-blog.csdnimg.cn/direct/79096366873e4a8397ee17b5cc9c0abb.png)
BurpSuite加载jsEncrypter插件
![](https://img-blog.csdnimg.cn/direct/12a8c32211574aacaae4326ecaf762ec.png)
添加jsEncrypter插件
![](https://img-blog.csdnimg.cn/direct/e9aef213d40d46daa8f3a4f840d3da9b.png)
添加成功就会出现这个
![](https://img-blog.csdnimg.cn/direct/1d495e7b0c0e434590f53bd967ef4dab.png)
对逆向的加密算法提取JS文件及代码
将加密算法JSEncrypt.js文件下载到同级目录
![](https://img-blog.csdnimg.cn/direct/e55efcd5da9f4f08b448ca958c08cc33.png)
修改加密js文件,将调用算法代码编写
var r = new JSEncrypt
o = "305c300d06092a864886f70d0101010500034b003048024100959684a0076fd2a8fc1589469cf8c95f16ef67490c519f4d274373f29cee64cf6a0db8ad8953122c5b3664e4a48acd34d9b95c0ae62a31be612632e1c49154db0203010001";
r.setPublicKey(o);
var newpayload = r.encrypt(payload)
![](https://img-blog.csdnimg.cn/direct/52ff6de9efd24a519b2334d3f763c05f.png)
使用phantomjs加载phantomjs_server.js文件开启127.0.0.1:1664服务
phantomjs phantomjs_server.js
![](https://img-blog.csdnimg.cn/direct/39fbbaa467584a7bab7daa0995c83acd.png)
进入burp,找到jsEncrypter模块,点击连接,连接成功会出现True,点击test,测试是否能够加密成功
![](https://img-blog.csdnimg.cn/direct/591b49359c7044579f260f60f20743f2.png)
抓到登录流量包,放入intruder模块下,将password添加为爆破点
![](https://img-blog.csdnimg.cn/direct/7dce53be9bf345f78635109b59849fa7.png)
加载一个字典,添加burp插件选择JsEncrypter插件
![](https://img-blog.csdnimg.cn/direct/c5819a4e16cf49429d03ad73cb8baba1.png)
点击启动,点击一个数据包可以看到,password已经被加密
![](https://img-blog.csdnimg.cn/direct/0f90845e5893421596df40f4a61801e1.png)
反调试
实现防止他人调试、动态分析自己的代码
![](https://img-blog.csdnimg.cn/direct/cf571d79392c45deb5ddaeba704b5ffc.png)
检测调试方法
-键盘监听(F12)
-检测浏览器的高度插值
-检测开发者人员工具变量是否为true
-利用console.log调用次数
-利用代码运行的时间差
--利用toString
-检测非浏览器
常见绕过方法
-禁用断点法
-条件断点法
-此处暂停法
-置空函数法
-本地覆盖法
右键和F12都有检测
![](https://img-blog.csdnimg.cn/direct/3938496d8b384abe9e3bb27cb4e7ac1d.png)
打开一个新页面提前打开调试
![](https://img-blog.csdnimg.cn/direct/35ff7d674ba24d8f900ac008077c7ef7.png)
搜索关键字
![](https://img-blog.csdnimg.cn/direct/ab2bfe5923ea4575b174a2cdc4c215d0.png)
选择替换本地文件
![](https://img-blog.csdnimg.cn/direct/ed0bd0e3b3754afd8d200715f6521afc.png)
点击允许
![](https://img-blog.csdnimg.cn/direct/e6575efeabdb490db69e8a2c2dd3c0ed.png)
搜索关键字debug,注释后ctrl+s保存
![](https://img-blog.csdnimg.cn/direct/5a85f3bfff144db19cdc681cfe4effd4.png)
刷新后可以看到右键已经可以打开了
![](https://img-blog.csdnimg.cn/direct/819821fb4ccc44c6bdbdeadd920f8dff.png)
混淆加密-识别&还原
代码混淆加密:
上述几种方法,已经达到了反调试的效果,但如果他人查看代码,也可能被找出检测功能并删去。为了防止反调试功能被剔除,我们可以对JS代码进行混淆加密。
1、开源代码混淆解密
在线加密网址:https://www.sojson.com/
源代码
function qiangsec(){
console.log('hello qiangsec')
}
qiangsec();
JJEncode
![](https://img-blog.csdnimg.cn/direct/b2a6b82dd92a4f4a9713f36d51ec018e.png)
在本地服务器运行加密后的代码
![](https://img-blog.csdnimg.cn/direct/366409fd515f48119591de9452a5395b.png)
AAEncode
![](https://img-blog.csdnimg.cn/direct/c314fe5f84a94f06b05b9be869d76977.png)
在本地服务器运行加密后的代码
![](https://img-blog.csdnimg.cn/direct/371438d0a2bf450ba154fd80928956a8.png)
JSFuck
![](https://img-blog.csdnimg.cn/direct/abd762b3ff134b22bbe784c05edc2e1a.png)
在本地服务器运行加密后的代码
![](https://img-blog.csdnimg.cn/direct/098e6adc3660488f98d2b4ebd48dcd7f.png)
安装Rainbow Brackets Lite 插件
![](https://img-blog.csdnimg.cn/direct/87146c07ddc54fe180961d076bb7b85a.png)
删除最后括号
![](https://img-blog.csdnimg.cn/direct/e2dfc7d1f18b4987bd2c083c54686118.png)
再执行代码就还原了
![](https://img-blog.csdnimg.cn/direct/03a6ce159ee94de7a7dfa433ce7b7399.png)
案例
响应包是jsfuck加密
![](https://img-blog.csdnimg.cn/direct/a6726740d32144a898f9ef0efa8dd733.png)
在本地服务器运行加密后的代码
![](https://img-blog.csdnimg.cn/direct/70985375e6894e5a9bb3b24397a92b9f.png)
将最后括号里的内容删除
![](https://img-blog.csdnimg.cn/direct/dcabeda3b10c4ca1893d1c29f323308d.png)
还原代码
![](https://img-blog.csdnimg.cn/direct/6ba633b2923a43cab247a141db9d25b5.png)
2、商业代码混淆解密
官方加密网址https://www.jsjiami.com/
加密算法已经告诉了
![](https://img-blog.csdnimg.cn/direct/058b4382db834978b6294096ef2efaf1.png)
直接使用https://jsdec.js.org/使用jsjiami V6解密,加密的js文件是一个编码数据的
![](https://img-blog.csdnimg.cn/direct/ec187b553b174c199ddafdf56d6396c5.png)
这是加密后的数据
![](https://img-blog.csdnimg.cn/direct/b80d539d534f4b6995c0d06a674b95f2.png)
使用AES解码,还原后的数据
![](https://img-blog.csdnimg.cn/direct/086e9bb7fd934912b1b894f6859663c6.png)
JS安全
在Javascript中也存在变量和函数,当存在可控变量及函数调用即可参数漏洞。
JS开发应用和PHP,JAVA等区别在于即没源代码,也可通过浏览器查看源代码。
获取URL,获取JS敏感信息,获取代码传参等,所以相当于JS开发的WEB应用属于白盒测试,一般会在JS中寻找更多URL地址,(加密算法,APIkey配置,验证逻辑,框架漏洞等)进行后期安全测试。
1、会增加攻击面(URL、接口,分析调试代码逻辑)
2、敏感信息(用户密码、ak/sk、token/session)
3、潜在危险函数(eval、dangerallySetInnerHTML)
4、开发框架类(寻找历史漏洞Vue、NodeJS、Angular等)
打包器Webpack:PackerFuzzer
AK/SK云安全利用:工具箱CF(云安全后续会讲更多)
浏览器插件:Pentestkit FindSomething Wappalyzer(前期的JS收集项目)
前端验证
响应包返回数据
![](https://img-blog.csdnimg.cn/direct/4edb1742e3ea4fc9a2542a8d1e450442.png)
复制访问路径,在js文件中搜索
![](https://img-blog.csdnimg.cn/direct/d1fbcd4b2ca0462ca4c0eee4bf12c0a3.png)
![](https://img-blog.csdnimg.cn/direct/5506d03daa29452a80b8bee122e380bf.png)
状态码为200就验证成功
![](https://img-blog.csdnimg.cn/direct/c6e171a96c514d96a6ffa53982b14757.png)
返回request包
![](https://img-blog.csdnimg.cn/direct/ad2dce69c69f45ce846eccf4eeec41c6.png)
将206改成200
![](https://img-blog.csdnimg.cn/direct/ba340c354d9f496ba5349905aeccfd12.png)
直接跳过验证码修改密码
![](https://img-blog.csdnimg.cn/direct/1e3b6709f65d40f298f36d4fb20f262a.png)