第一步:网页分析

1,第一个cookie

  • 打开网页直接刷新 发一个dom请求中 直接获得了页面内容 且并未携带加密请求头参数 但是携带了两个cookie

  • 查看两个cookie是本地生成还是服务器返回
  • 打开网页直接刷新,发现有两个dom请求 第一次为412,没有携带任何可疑参数和其cookie 但是可以看到 在响应标头中 出现了set-cookie 此时我们发现 第一个cookie为服务器返回

2,第二个cookie

  • 第二个cookie并未在set-cookie中发现 我们使用hook的方式来看看是否能定位到本地生成的堆栈
(function(){
   'use strict'
    var _cookie = "";
    Object.defineProperty(document, 'cookie', {
        set: function(val) {
            console.log(val);
            debugger
            _cookie = val;
            return val;
        },
        get: function() {
            debugger;
            return _cookie;
        },
});
})()
  • 在这里 我们成功hook到了第二个cookie的堆栈上方

这里我们往上跟栈发现都是vm里面的代码 ,在往上走发现一个eval执行了一些代码 而且这些代码是高度混淆的 所以我们使用本地补环境的方式 来本地生成cookie 然后导出进行请求

二,补环境

  • 这里我们把eval的整个代码 拿到本地

  • 之后我们使用proxy代理 来看这个代码访问和修改了那些属性和函数
function watch(obj, name) {
    return new Proxy(obj, {
        get(target, p, receiver) {
            // 对于 navigator,始终打印日志,不做特殊排除
            if (name === "navigator") {
                console.log(`获取: navigator.${p} =>`, target[p]);
            }

            // 处理特殊系统属性的默认代理逻辑
            if (
                p === "crypto" ||
                p === "Math" ||
                p === "isNaN" ||
                p === "encodeURI" ||
                p === "Uint8Array" ||
                p.toString().indexOf("Symbol(Symbol.") !== -1
            ) {
                return Reflect.get.apply(Reflect, arguments);
            }

            // 对于其他对象,保持原有的日志逻辑
            let val = Reflect.get.apply(Reflect, arguments);
            if (name !== "navigator") {
                console.log("获取:", name, ".", p, "=>", val);
            }
            return val;
        },
        set(target, p, value, receiver) {
            if (name === "localStorage" || name === "sessionStorage") {
                localStorage.setItem(p, value);
            }
            let val = Reflect.get.apply(Reflect, arguments);
            console.log(`设置: ${name}.${p} = ${val} => ${value}`);
            return Reflect.set(...arguments);
        }
    });
}
  • 先运行 发现缺少window

  • 我们这里对window进行补充 然后将window挂上代理
window = globalThis;


window = watch(window,"window")

  • 再次出现doucment未定义 我们按照前面的方法补上 并且加上代理

  • 之后我们发现 代理显示代码对一个ts的东西进行了操作 但是未定义 这里如果细心可以发现 在我们hook的时候 第一个出现的东西 好像就是这个ts 这里我们把这个ts复制到我们的代码

  • 这里我们又调用了一些方法和属性 我们一一补全
  • 这里注意/在真实的浏览器环境中,当一个页面不是嵌套在任何iframe或其他窗口中时,window.top 默认指向自身

这里 我们发现调用了一些document下的方法和location 这里我们把方法补全 location可以直接复制 或者挂代理查看访问了那些内容

document = {
    createElement:function (tgname) {
        console.log(`创建标签(${tgname})`)
        return watch({},`document.createElement(${tgname})`)
    }
}


window.XMLHttpRequest = function(){}
window.DOMParser = function(){}
window.location = {
    "ancestorOrigins": {},
    "href": "https://sugh.szu.edu.cn/Html/Index.html",
    "origin": "https://sugh.szu.edu.cn",
    "protocol": "https:",
    "host": "sugh.szu.edu.cn",
    "hostname": "sugh.szu.edu.cn",
    "port": "",
    "pathname": "/Html/Index.html",
    "search": "",
    "hash": ""
}

在这里进行补环境时候 注意几个点

1, 不要过度不环境 如果proxy代理检查访问的那些内容 就用if判断后放回对应的值 不要直接return

2,不要所有访问的内容都补 确定是浏览器有的 我们再去补环境

2, 第一步中 补环境只要不报错 能成功导出cookie即可 如果不行 使用异常捕获查看代码检测了那些内容

以及补全前面缺少的内容即可

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐