吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 4628|回复: 24
收起左侧

[其他原创] [油猴脚本开发指南]实战智慧树shadowroot闭包问题

  [复制链接]
李恒道 发表于 2022-6-17 14:35
本帖最后由 李恒道 于 2022-6-17 14:42 编辑

开始
最近智慧树玩上了shadowroot
说实话本来不想参与这些东西了
但是看到好多作者被折磨的欲死欲活
我的大刀又开始饥渴难耐了
不禁在此吟诗两首
社会摇中万人迷
唯有男神牌牌琦
社会摇中没有将与帅
只有实力这一块
摇!

图片.png
鸣谢
在此感谢@涛之雨 、cxxjackie对我的耐心教导之前曾辅导我将shadowroot的各种奇技淫巧将其倾囊相授
授了又授
授了还授
授了再授
那么废话不多说了
我们开始实战
实战 图片.png
我们的目标就是获取题目
首先查阅mdn文档
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/shadowRoot
通常来说是使用attachShadow函数来挂载shadowroot函数
mdn可以查阅
https://developer.mozilla.org/zh-CN/docs/Web/API/Element/attachShadow
我们如果想要hook attachShadow
那么需要修改ELEMENT的原型链附加shadowroot
图片.png
我们编写简易代码
我们编写简易代码
[JavaScript] 纯文本查看 复制代码
let old=Element.prototype.attachShadow
Element.prototype.attachShadow=function(...args){
    console.log('attach劫持',...args)
    return old.call(this,...args)
}
但是这时候智慧树提示了异常脚本
搜索一下文字找到了
图片.png
先打印一下f.r是什么
[JavaScript] 纯文本查看 复制代码
        function l() {
            return a(window.XMLHttpRequest) && a(window.XMLHttpRequest.prototype.open) && (!S.a.state.globalProperty.supportShadom || a(document.body.attachShadow)) && !window.OCS
        }

OCS作者榜上有名,笑死
然后看a.i是啥
图片.png
单纯的变量返回,那么核心问题在f.r上
我们观察代码
发现每一个都进行了
a(document.body.attachShadow)
我们继续往a函数里走
[JavaScript] 纯文本查看 复制代码
        function a(e) {
            var t = void 0 === e ? "undefined" : _()(e);
            return "function" == t ? ne.test(ee.call(e)) : e && "object" == t && Y.test(toString.call(e)) || !1
        }

因为是三元表达式
根据调试来看t在attachshadow基本情况是一个函数
所以我们走的 条件?结果1:结果2
只需要注意结果1就可以了
这个ne是一个正则表达式
图片.png
而ee是获取一个函数的源代码
图片.png
那么逻辑基本通了
我们在hook之后
智慧树按一个 白名单的函数列表做遍历
然后判断是否出现了nativecode的字样
所以我们可以无限往里的函数追
一直追到了
图片.png
这行打印了代码的字符串
图片.png
但是因为这里在启动的时候
已经获取了Function.toString了
所以我们很难对其进行函数字符化的劫持
但是因为上层使用了正则
我们可以对正则劫持
可以劫持attachShadow之后再对正则进行二次劫持
[JavaScript] 纯文本查看 复制代码
RegExp.prototype._test = RegExp.prototype.test;
RegExp.prototype.test = function (s) {
  if (this.source.includes('function') || this.source.includes('native code')) {
    return true;
  }
  return this._test(s);
};

但是那样就没啥意义了
所以我们随便再玩两三种方法吧
智慧树出现了一个小小的失误
就是他基于框架写了代码
只要有一个对框架研究的还不错的人
就可以基于框架做核心级别的劫持
因为回调和显示是无法被代码控制的
所以只能急于救火,而如果对框架进行魔改的话
又会导致无法跟随框架进度更新
甚至公司要招一个专门的懂框架的人进行补丁式维护
(这里暗示招我招我招我,月薪三千好养活,楼下保安工资都比我高)
我们之前看到异常代码在
图片.png

我们可以看到代码就是一个校验
一个上报
而f.r也只有这一处
图片.png
我们可以看到,他在这里调用了,那问题很简单
我们对setinterval和settimeout做劫持
图片.png
这里可以看到,他故意传入了一个特定参数,恶心心
图片.png

你以为这样我就拿捏不了了?
直接利用throw错误拿报错堆栈信息回溯堆栈干他
[JavaScript] 纯文本查看 复制代码
window.setInterval=function(...args){
    let err= new Error('大赦天下');
    console.log('setInterval大赦天下',err)
    return oldset.call(this,...args)
}
window.setTimeout=function(...args){
    let err= new Error('大赦天下');
    console.log('setTimeout大赦天下',err)
    return oldout.call(this,...args)
}


图片.png

那么我们直接写代码
[JavaScript] 纯文本查看 复制代码
let oldset=window.setInterval
let oldout=window.setTimeout
window.setInterval=function(...args){
    let err= new Error('大赦天下');
    if(err.stack.indexOf('checkoutNotTrustScript')!==-1){
        return
    }
    return oldset.call(this,...args)
}
window.setTimeout=function(...args){
    let err= new Error('大赦天下');
    if(err.stack.indexOf('checkoutNotTrustScript')!==-1){
        return
    }
    return oldout.call(this,...args)
}



秒杀异常报告
图片.png
然后我们编写劫持attachelemtn代码
[JavaScript] 纯文本查看 复制代码
let old=Element.prototype.attachShadow
Element.prototype.attachShadow=function(...args){
    console.log('attach劫持',...args)
    args[0].mode='open'
    return old.call(this,...args)
}


测试一下
已经拿捏
图片.png

你以为这里就结束了?
继续大赦天下
我们全局搜索attachShadow
只找到了一个closed

图片.png
可以知道this.shadowDom是attachShadow的引用
因为之前我们大量的调试知道是vue页面
直接爆框架
document.querySelector('.subject_describe >div >div').parentElement.__vue__.shadowDom.innerHTML
图片.png

结语
今天浅聊三种方式拿捏
只要是基于框架的
都有无数种可能无数种方式让我们尝试注入,修改,破坏
从技术的角度是浪漫的
是矛与盾,刀与剑,周瑜与黄盖的罗曼蒂克史
但是从道德的角度上
我一直推荐大家仅仅用来刷公共课
刷专业课是无趣且无聊的
我是一名土木工程的毕业生
当初转计算机的时候
你们一脸鄙夷的网络选修课计算机教程
是我日日夜夜不断反复观看的资料
每当我想到这个事情的时候
总觉得无比的讽刺。
严肃性撒花




图片.png

免费评分

参与人数 3威望 +1 吾爱币 +25 热心值 +3 收起 理由
笙若 + 1 + 1 谢谢@Thanks!
苏紫方璇 + 1 + 20 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
正己 + 4 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

正己 发表于 2022-6-17 15:17
大佬带带弟弟
saisaixs 发表于 2022-6-17 15:54
 楼主| 李恒道 发表于 2022-6-17 15:19

这文章80%全特么涛教的
呜呜呜呜
图片.png

点评

他都不带我,呜呜呜 @涛之雨  详情 回复 发表于 2022-6-17 15:29
正己 发表于 2022-6-17 15:29
李恒道 发表于 2022-6-17 15:19
这文章80%全特么涛教的
呜呜呜呜

他都不带我,呜呜呜
@涛之雨
dft2010 发表于 2022-6-17 15:52
前排围观大佬,虽然我看不懂……
 楼主| 李恒道 发表于 2022-6-17 16:19
dft2010 发表于 2022-6-17 15:52
前排围观大佬,虽然我看不懂……

不是大佬的~
很基础的内容
哥哥如果学学也没问题的
 楼主| 李恒道 发表于 2022-6-17 16:20
saisaixs 发表于 2022-6-17 15:54
同是土木狗,以后也跟着大佬一起转行吧

哥哥也可以学学前端
我当初差点进土木了
都准备签中交二了
后来实习在哈尔滨一个哈西上边小工地
呆了一阵直接吓尿了
环境太差了
我草
dft2010 发表于 2022-6-17 16:55
李恒道 发表于 2022-6-17 16:19
不是大佬的~
很基础的内容
哥哥如果学学也没问题的

年纪大了。。。奔四了。。。脑子转不过弯了。。
galford 发表于 2022-6-17 17:02
懵逼进来,懵逼出去,完全看不懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表