Skip to content

比赛题目-T23 非对称加密

目录

前言

TIP

骚操作 + 常规加密

思路

核心问题: 这个题目最难受的在于,一点开题目,立马跳转了一个 https://www.yuanshen.com/#/ 😭😭😭

到这至少让我 知道这个问题和"跳转"相关 ~

也就是 href,这种设计的目的是确保页面内容未被修改(例如,用于反调试、反爬虫或保护特定资源)

怎么办呢?

我的建议是:打断点,script断点 💡 img.png

然后,在地址栏,手动输入这一题目的网址,回车 img_1.png

然后 img_2.png

这个时候最好是要多加一个 _challenge/page xhr 断点,拦截request定位参数 💡

img_3.png

img_4.png

js
  fetch(window.location.href).then(function (e) {
    return e.text()
}).then(function (e) {
    var n = CryptoJS.SHA256(e).toString();
    "b16486740ef3943cd5582f93a0754cb9a848f331062503fdb54996df92dc2671" !== n && "6d9d2c73c1f9758c951b53a81935789655bb3a4841873923fc22e2c7d0425a77" !== n && (window.location.href = "https://yuanshen.com/")
}).catch(function (e) {
    "HTML integrity check failed" === e.message || console.warn("HTML 完整性校验失败(网络错误):", e)
})

终于:跳转的原因找到了window.location.href = "https://yuanshen.com/")

这个时候只要把这个过了,咱们就能正常分析了~

两个思路

  • hook
  • 本地替换,然后删除这段代码,不让跳转!

我这边就用本地替换啦 img_5.png

然后,在本地,找到window.location.href = "https://yuanshen.com/") 然后删除! img_6.png

接下来,刷新网页,就发现可以正常看到发包啦 img_7.png

解密

加密参数

看参数

img_8.pngimg_9.png

四个加密参数: header: x-auth-key,x-signature param: data,verify,t

搜索参数

img_10.png

核心加密位置:

js
 var n, t, r = e.url.match(/\/page\/(\d+)\//);
if (r) {
    var c = parseInt(r[1]),
        a = new URLSearchParams(e.url.split("?")[1] || "").get("challenge_type") || "fsymmetry_challenge",
        o = Date.now(), s = "".concat(c, "_").concat(a, "_").concat(o);
    e.headers["X-Auth-Key"] = u(s), e.headers["X-Signature"] = (n = s, (t = new JSEncrypt).setPrivateKey("-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQC1vKwZUIv7pgpJUXXPpDlD4+VEon3a0ANOrNmqAESrcGfkmYzD\nCo2JeuYezhBGjBNjwVmSct/Y3BBOCRGT2bvtCJGdS12RMvHbFcdbwS/Adh48+rhL\niMNYXLm+7pI3e2k6TlScxKa7EeeZpVtew/Cv5z6ol0llNPp6BdqAlOa8DwIDAQAB\nAoGAS0GaWI9AsFAFEXBgoz/jkMf14DKTgEFEJVexeNLMnNuawhCNuBSOIMCaO2Zk\nWfpWaygdUeYs6M3UGKRruXhf92g/BRmJK5FzR0kWW4qw6WwlYob3TPc3c9MFOjmp\nVtWQ0VSeEPrnBNoQRccKl0dGBnToHGuV+KEuKx8oWZc/JM0CQQDH/cvlx0BKz2zN\n6PM8FidAvc+Wgon8YW81KJgC7iJIrK9FOpctOE3L1pdF7guOQNVGRqN4HCIgLfHE\ncqxWJKJtAkEA6KIkwHe/Q23uWH5GP8DHtVkLVfohTumYkpb0rk05EYQ0dsWSNzWH\nXDH/kD6ayNq+fscnS8g+59onzvfhJ0bq6wJBAKNFkDEHenWY4js481sauvEgBVnb\nOMvSv/emLHQ39cVfNbhPHRzN2rWPe/CbZtO8GmJFSS/FyBZ9a+P1uryZLAECQAaw\nApZ12s25b0yj9KkIhbU05hqGokZ+eKBeLpKELcvPHSL88wMbStTfqxUed5ymjStf\n1kVbcFOB9fsBLTvP0hkCQFCON0l1VjFli+vqfN0lypgIqCf85V6FZFN19creGCCd\n76pX/X2FIBbUSDN1z48SM5I/RKdCkTx7FY+509q2Mek=\n-----END RSA PRIVATE KEY-----"), t.sign(n, CryptoJS.SHA256, "sha256") || "");
    var i = function (e) {
        return CryptoJS.HmacSHA256(e, "dsa_secret_key_2025").toString()
    }(s), l = u(s + "_param"), f = e.url.includes("?") ? "&" : "?";
    e.url += "".concat(f, "data=").concat(encodeURIComponent(l), "&verify=").concat(i, "&t=").concat(o)
}

扣代码

js
var JSEncrypt = require('jsencrypt')
var CryptoJS = require('crypto-js')
var e = {}

function u(e) {
    var n = new JSEncrypt;
    return n.setPublicKey("-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1vKwZUIv7pgpJUXXPpDlD4+VE\non3a0ANOrNmqAESrcGfkmYzDCo2JeuYezhBGjBNjwVmSct/Y3BBOCRGT2bvtCJGd\nS12RMvHbFcdbwS/Adh48+rhLiMNYXLm+7pI3e2k6TlScxKa7EeeZpVtew/Cv5z6o\nl0llNPp6BdqAlOa8DwIDAQAB\n-----END PUBLIC KEY-----"),
    n.encrypt(e) || ""
}

function getParams(page) {

    e.url = `/page/${page}/?challenge_type=fsymmetry_challenge`
    var n, t, r = e.url.match(/\/page\/(\d+)\//);
    if (r) {
        var c = parseInt(r[1])
            , a = new URLSearchParams(e.url.split("?")[1] || "").get("challenge_type") || "fsymmetry_challenge"
            , o = Date.now()
            , s = "".concat(c, "_").concat(a, "_").concat(o);


        var X_Auth_Key = u(s),
            X_Signature = (n = s,
                (t = new JSEncrypt).setPrivateKey("-----BEGIN RSA PRIVATE KEY-----\nMIICXAIBAAKBgQC1vKwZUIv7pgpJUXXPpDlD4+VEon3a0ANOrNmqAESrcGfkmYzD\nCo2JeuYezhBGjBNjwVmSct/Y3BBOCRGT2bvtCJGdS12RMvHbFcdbwS/Adh48+rhL\niMNYXLm+7pI3e2k6TlScxKa7EeeZpVtew/Cv5z6ol0llNPp6BdqAlOa8DwIDAQAB\nAoGAS0GaWI9AsFAFEXBgoz/jkMf14DKTgEFEJVexeNLMnNuawhCNuBSOIMCaO2Zk\nWfpWaygdUeYs6M3UGKRruXhf92g/BRmJK5FzR0kWW4qw6WwlYob3TPc3c9MFOjmp\nVtWQ0VSeEPrnBNoQRccKl0dGBnToHGuV+KEuKx8oWZc/JM0CQQDH/cvlx0BKz2zN\n6PM8FidAvc+Wgon8YW81KJgC7iJIrK9FOpctOE3L1pdF7guOQNVGRqN4HCIgLfHE\ncqxWJKJtAkEA6KIkwHe/Q23uWH5GP8DHtVkLVfohTumYkpb0rk05EYQ0dsWSNzWH\nXDH/kD6ayNq+fscnS8g+59onzvfhJ0bq6wJBAKNFkDEHenWY4js481sauvEgBVnb\nOMvSv/emLHQ39cVfNbhPHRzN2rWPe/CbZtO8GmJFSS/FyBZ9a+P1uryZLAECQAaw\nApZ12s25b0yj9KkIhbU05hqGokZ+eKBeLpKELcvPHSL88wMbStTfqxUed5ymjStf\n1kVbcFOB9fsBLTvP0hkCQFCON0l1VjFli+vqfN0lypgIqCf85V6FZFN19creGCCd\n76pX/X2FIBbUSDN1z48SM5I/RKdCkTx7FY+509q2Mek=\n-----END RSA PRIVATE KEY-----"),
            t.sign(n, CryptoJS.SHA256, "sha256") || "");
        var i = function (e) {
            return CryptoJS.HmacSHA256(e, "dsa_secret_key_2025").toString()
        }(s)
            , l = u(s + "_param")
            , f = e.url.includes("?") ? "&" : "?";
        e.url += "".concat(f, "data=").concat(encodeURIComponent(l), "&verify=").concat(i, "&t=").concat(o)


    }
    var pm = {
        X_Auth_Key,
        X_Signature,
        data: l,
        verify: i,
        t: o
    }

    return pm
}

//
console.log(getParams(5))

请求脚本

py
 for page in range(1, 101):
            data = {
                'page': f'{page}'
            }
            print(f"第{page}页")

            # 调用JS函数生成参数
            pm = ctx.call('getParams', page)
            print(pm)
            headers = {
                "Accept": "application/json, text/plain, */*",
                "Accept-Language": "zh-CN,zh;q=0.9",
                "Connection": "keep-alive",
                "Referer": "http://spiderdemo.cn/authentication/symmetry_challenge/?challenge_type=symmetry_challenge",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
                "X-Auth-Key": pm['X_Auth_Key'],
                "X-Signature": pm['X_Signature']
            }

            cookies = {
                "sessionid": ""
            }

            url = f"http://spiderdemo.cn/authentication/api/fsymmetry_challenge/page/{page}/"
            params = {
                "challenge_type": "fsymmetry_challenge",
                "data": pm['data'],
                "verify": pm['verify'],
                "t": pm['t'],
            }

            # 使用httpx发送请求
            response = await client.get(url, headers=headers, cookies=cookies, params=params)
            response_data = response.json()
            print(response_data)

            # 移除exit(),否则只会执行第一页
            # exit()
            if response_data.get('page_data'):
                for item in response_data['page_data']:
                    count += int(item)

        print(f"总计: {count}")


完结撒花 🎉🎉🎉