JS,前端的灵魂,也是安全漏洞的温床。这篇文章?入门级而已!今天,咱们不只是“记录学习”,而是要彻底解剖JS,玩转参数逆向,让隐藏的漏洞无处遁形!
前言:JS,不止是动画和特效,更是漏洞挖掘的宝藏!
别再把JS当成简单的脚本语言了!它承载着业务逻辑、数据交互,也隐藏着无数的安全隐患。想成为真正的网络安全专家?吃透JS是必经之路!
漏洞挖掘:从入门到入狱!
一、用户名密码?密钥?别藏着掖着了,JS会让你哭出来!
- 默认用户名密码: 这种低级错误现在还有?有的!JS里翻翻,说不定有惊喜(惊吓)!
- 硬编码密码、密钥泄露: 开发者图省事儿?把密钥直接写在JS里?恭喜你,挖到金矿了!这可比SQL注入刺激多了!
二、指纹信息:暴露你的框架,暴露你的版本!
框架信息、开发商信息、版本信息... 这些看似不起眼的信息,却是黑客的侦察利器。JS文件就像开发者的自白书,藏都藏不住!
三、接口泄露:找到隐藏的后门,直捣黄龙!
JS里藏着大量的接口?那是必须的!别再用burp suite 傻乎乎的 跑目录了!用正则匹配敏感字,或者截取父目录,直接找到隐藏的业务模块。这才是效率!
四、异步加载:等等党永不为奴?不存在的!
页面加载慢?模块不显示?异步加载的JS文件在搞鬼!别傻等了,直接上代码,让所有JS文件瞬间爆炸!
-
异步加载JS?So what? 同步加载?老古董了!异步加载才是王道!
async
和defer
属性,让浏览器飞起来!但是加载的JS文件也可能包含未授权的接口! -
实战?注册点都没有?那就自己创造! 登录页面没有注册?别慌!从前端源码入手,异步加载所有JS,直接找到隐藏的功能点!
异步加载,一键梭哈!
javascript var arr=["https://xxx.xxx.com/xxxxxxx/xxxx/0.1.0/js/xxxxxxx.js", //完整的js路径,一个都不能少!"https://xxx.xxx.com/xxxxxxx/xxxx/0.1.0/js/xxxxxxx.js"] for(var i=0;i<arr.length;i++){ var script = document.createElement('script'); script.src = arr[i]; document.getElementsByTagName('head')[0].appendChild(script); }
控制台跑起来,隐藏的file接口,给我现形!
找到接口,构造参数,一波带走!云服务资源?直接白嫖!
存储桶?拿下!
五、JS逆向:破解加密,为所欲为!
-
思路?简单粗暴! 定位源码,浏览逻辑,断点调试,找到算法,脚本还原,破解解密,测试漏洞! 一气呵成!
-
案例?越权查看?小菜一碟! 抓包分析,发现加密?直接开干!
接口
/rxxx/xxxxxte
?nonce
、skey
、sign
? 别怕,都是纸老虎!搜索大法好!找不到?断点伺候!
找到JS文件,全局分析,加密参数,全部现形!
getKeyParams
方法?核心加密逻辑!javascript getKeyParams: function(t, e) { var n = { timestamp: "", nonce: "", skey: "", body: "", sign: "", aesSecretKey: "" }; ut = e; n.timestamp = (new Date).getTime(); n.nonce = this.getNonce(32); n.skey = this.getAesSecretKey(); n.aesSecretKey = rt; n.body = this.encryptByAES(r()(t), rt, "12xxxxxxxxxxxef").encryptContent; var i = this.encryptByMD5(n.timestamp + n.nonce + n.skey + n.body); return n.sign = this.encryptByRSA(i, ut), n; }
时间戳、随机数、AES密钥、加密内容、签名... 一步到位!
getNonce
?生成随机字符串!javascript getNonce: function(t, e, n) { var i, a = ""; void 0 === t && (t = 10), "string" == typeof e && (n = e), i = e && "number" == typeof e ? Math.round(Math.random() * (e - t)) + t : t, n = n || "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; for (var o = 0; o < i; o++) { var l = Math.round(Math.random() * (n.length - 1)); a += n.substring(l, l + 1) } return a }
encryptByMD5
?MD5加密!javascript encryptByMD5: function(t) { return console.log("md5", t), ot.a.MD5(t) .toString() .toUpperCase() }
encryptFunction
?RSA加密!javascript encryptFunction: function() { return this.encryptByRSA(ct, ut); }
getAesSecretKey
?生成AES密钥并加密!javascript getAesSecretKey: function() { var t = ut; return rt = this.getNonce(16), console.log("16", rt), ct = this.encryptByRSA(rt, t); }
encryptByAES
?AES加密!javascript encryptByAES: function(t, e, n) { var i = ot.a.enc.Utf8.parse(e), a = ot.a.enc.Utf8.parse(n); return { encryptContent: ot.a.AES.encrypt(t, i, { iv: a, mode: ot.a.mode.CBC, padding: ot.a.pad.Pkcs7 }).toString(), encryptSecretKey: e }; }
Python还原!
```python
import base64
import hashlib
import random
import time
from Crypto.Cipher import AES, PKCS1_v1_5
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import pad, unpadrsa_public_key = '''-----BEGIN PUBLIC KEY-----MxxxxxxxxxMBUD-----END PUBLIC KEY-----'''.strip()
class EncryptHandler:
def init(self, rsa_public_key):
self.aes_key = self.get_nonce(16) # 生成 AES 密钥
self.iv = '12xxxxxxxxxef'.encode('utf-8') # 固定的 IV,实际中可根据需求随机化
self.rsa_public_key = rsa_public_key@staticmethod def get_nonce(length): characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" return ''.join(random.choice(characters) for _ in range(length)) def aes_encrypt(self, data): cipher = AES.new(self.aes_key.encode('utf-8'), AES.MODE_CBC, self.iv) encrypted = cipher.encrypt(pad(data.encode('utf-8'), AES.block_size)) return base64.b64encode(encrypted).decode('utf-8') def md5_sign(self, data): return hashlib.md5(data.encode('utf-8')).hexdigest().upper() def rsa_encrypt(self, data): key = RSA.import_key(self.rsa_public_key) cipher = PKCS1_v1_5.new(key) encrypted_data = cipher.encrypt(data.encode('utf-8')) return base64.b64encode(encrypted_data).decode('utf-8') def prepare_request(self, body): timestamp = str(int(time.time() * 1000)) nonce = self.get_nonce(32) aes_encrypted_body = self.aes_encrypt(body) skey = self.rsa_encrypt(self.aes_key) sign_str = timestamp + nonce + skey + aes_encrypted_body md5_signature = self.md5_sign(sign_str) rsa_signature = self.rsa_encrypt(md5_signature) request_data = { "timestamp": timestamp, "nonce": nonce, "skey": skey, "body": aes_encrypted_body, "sign": rsa_signature } return request_data
handler = EncryptHandler(rsa_public_key)
def main():
body = "xxxx" # 需要加密的内容
encrypted_request = handler.prepare_request(body)
print("Encrypted Request:", encrypted_request)if name == 'main':
main()
```运行脚本,更改body,一键加密!
替换参数,越权查看,so easy!
六、JSrpc:远程调用?免抠代码?黑科技!
-
JSrpc?什么鬼? 远程调用浏览器方法,免去抠代码补环境!这才是真正的效率神器!
-
原理?简单粗暴! 浏览器注入环境,websocket连接,RPC调用函数,加密解密,一气呵成!
-
实战?走起!
下载项目,本地运行!
注入JS,构建通信环境!
连接通信!
javascript // 注入环境后连接通信 var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz"); // 可选 //var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=zzz&clientId=hliang/"+new Date().getTime())
调用浏览器ws接口,运行JS代码!
```python
import requestsjs_code = """(function(){
console.log("test")
return "执行成功"})()"""
url = "http://localhost:12080/execjs"
data = {
"group": "zzz",
"code": js_code
}
res = requests.post(url, data=data)
print(res.text)
```寻找加密函数,改为全局函数!
自定义函数,传递参数,加密结果,唾手可得!
注册JS方法!
javascript // 固定的RSA密钥 var rsa = "MIxxxxxxxxDAQAB"; //注册行为 demo.regAction("key", function(resolve, param) { var user = param["param"]; var res = getKeyParams(user, rsa); // 使用固定的RSA密钥作为第二个参数调用getKeyParams函数 resolve(res); });
远程调用!
http://127.0.0.1:12080/go?group=zzz&action=key¶m=123456
远程调用加密函数,省去脚本转化,效率Max!
JS,不仅仅是前端的玩具,更是安全攻防的利器!掌握JS逆向,你就能在网络安全的世界里,为所欲为!
```
黑客/网络安全学习包
资料目录
-
成长路线图&学习规划
-
配套视频教程
-
SRC&黑客文籍
-
护网行动资料
-
黑客必读书单
-
面试题合集
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************
3.SRC&黑客文籍
大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录
SRC技术文籍:
黑客资料由于是敏感资源,这里不能直接展示哦!
4.护网行动资料
其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!
5.黑客必读书单
**
**
6.面试题合集
当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。
更多内容为防止和谐,可以扫描获取~
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************