王一之 发表于 2022-10-21 22:04:08

[活动结束][有奖答题]网页点击大挑战!2.0

### 活动结束
> 有兴趣的哥哥依旧可以尝试解题

- @cxxjackie 奖励2
- @steven026 奖励1

---

> 上次主要是没想到优雅的解法,于是就没有发布挑战难度这么高的题目,本次可能需要借助扩展的权限去解决,扩展的context页会比页面更快运行,脚本的注入就是在context页完成,但context页无法操作window对象,只能操作document对象。
> 对于地址1我也只想到了使用扩展到方法去解,期待大佬们的各种骚操作

地址1:http://test-case.ggnb.top/is_trusted/is_trusted.html
地址2:http://test-case.ggnb.top/is_trusted/is_trusted_2.html

该网页使用了isTrusted验证,如果使用了合适的方法,解出地址2应该就可以解出地址1了

要求:使用**脚本/扩展**点击按钮,弹出“真的被点击了”,本次题目目的在于解出isTrusted,还请勿走歪门邪道,歪门邪道不享受奖励![](https://bbs.tampermonkey.net.cn/data/attachment/forum/202210/18/155809g8ad66c6dec8251j.jpg)

奖励1:解出地址1的会员,奖励100油猫币,4贡献,以及辣条一箱(限前3人,思路需不同)
奖励2:解出地址2的会员,奖励50油猫币,2贡献,以及辣条一小箱(限前3人,思路需不同)

警告:该网页不同于往期的油猴脚本开发教程,难度较大,如果基础不太好不推荐挑战

### 一段代码
只是用于验证执行顺序,图文无关

```js
// ==UserScript==
// @name         过掉isTrusted检测
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @match      http://test-case.ggnb.top/is_trusted/is_trusted.html
// @match      http://test-case.ggnb.top/is_trusted/is_trusted_2.html
// @author       You
// @run-at       document-start
// ==/UserScript==

console.log('userscript');

```

网页点击大挑战1.0
https://bbs.tampermonkey.net.cn/thread-1331-1-1.html


cxxjackie 发表于 2022-10-21 23:48:56

第二个的解法跟上次是一样的吧,劫持addEventListener伪造一个事件进去:
// ==UserScript==
// @name         过掉isTrusted检测
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @match      http://test-case.ggnb.top/is_trusted/is_trusted.html
// @match      http://test-case.ggnb.top/is_trusted/is_trusted_2.html
// @author       You
// @run-at       document-start
// ==/UserScript==

console.log('userscript');
(function() {
    'use strict';
    function trustEvent(event) {
      return new Proxy(event, {
            get: function(target, property) {
                if (property === 'isTrusted') {
                  return true;
                } else {
                  return Reflect.get(target, property);
                }
            }
      });
    }
    if (location.href.includes('is_trusted_2.html')) {
      const ael = EventTarget.prototype.addEventListener;
      EventTarget.prototype.addEventListener = function() {
            if (this === document && arguments === 'click') {
                const fn = arguments;
                arguments = function(e) {
                  fn.call(this, trustEvent(e));
                }
            }
            return ael.apply(this, arguments);
      };
      window.addEventListener('load', e => {
            document.querySelector('#btn').click();
      });
    }
})();
第一个暂时没想到不依赖扩展的解法,不过资源错误会让脚本更快注入倒是很有意思,我想到油猴有一个GM.webRequest的API,也许可以加以利用人为制造错误。可惜你这个页面不加载别的资源,我猜测正确的解法也是从扩展context注入一个不存在的资源。
脚本猫目前好像没有实现webRequest,我觉得可以把这个注入资源的特性一起加进去,不止是重定向,这样可以成为一种另类的过isTrusted的手段。

李恒道 发表于 2022-10-22 00:12:14

```javascript
// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @grant      GM_xmlhttpRequest
// @match      http://test-case.ggnb.top/*
// @author       You
// @noframes
// ==/UserScript==
let url = window.location.href
GM_xmlhttpRequest({
    url: url,
    method: "GET",
    onload: function (xhr) {
      document.querySelector('body').style.margin = 0
      let html = xhr.responseText
      document.querySelector('html').innerHTML = ""
      let frm = document.createElement('iframe')
      document.querySelector('body').append(frm)
      frm.style.width = '100vw'
      frm.style.height = '100vh'
      frm.style.border = 'none'
      frm.src = 'about:blank'
      setTimeout(() => {
            frm.contentWindow.document.querySelector('html').innerHTML = html
            let script_list = frm.contentWindow.document.querySelectorAll('script')
            script_list.forEach((script) => {
                let src_element = frm.contentWindow.document.createElement('script')
                if (script.src === '') {
                  src_element.innerHTML = script.innerHTML.replaceAll('e.isTrusted','e.type')
                } else {
                  src_element.src = script.src
                }
                script.parentElement.insertBefore(src_element, script)
                script.remove()
            })
            setTimeout(()=>frm.contentWindow.document.querySelector('button').click(),1000)
      }, 1000)

    }
});



```

steven026 发表于 2022-10-22 00:15:39

本帖最后由 steven026 于 2022-10-22 00:20 编辑

```js
// ==UserScript==
// @name         过掉isTrusted检测
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @match      http://test-case.ggnb.top/is_trusted/is_trusted_2.html
// @author       DreamNya
// @grant      none
// @run-at       document-start
// ==/UserScript==
window.MouseEvent = window.Object;
const realAdd = document.addEventListener;
document.addEventListener = function (type, fuc) {
    if (type == 'click') {
      const realFuc = fuc
      fuc = function (e) {
            realFuc.call(this, { isTrusted: true, target: e.target })
      }
    }
    realAdd.call(this, type, fuc)
}
window.onload = () => {
    document.querySelector('#btn').click()
}
```
不知道这样算吗?

李恒道 发表于 2022-10-22 00:24:52

```
// ==UserScript==
// @name         New Userscript
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      0.1.0
// @descriptiontry to take over the world!
// @match      http://test-case.ggnb.top/*
// @author       You
// @run-at       document-start
// ==/UserScript==
let dom = document.querySelector('script')
dom.innerHTML=dom.innerHTML.replace('isTrusted',"type")
window.onload=()=>document.querySelector('button').click()
```

李恒道 发表于 2022-10-22 01:03:21

cxxjackie 发表于 2022-10-21 23:48
第二个的解法跟上次是一样的吧,劫持addEventListener伪造一个事件进去:

第一个暂时没想到不依赖扩展的解 ...
可以利用创建一个空iframe标签然后写innerHtml使script失效,再修改代码重新启动来实现
但是太邪道了....
感觉没实际应用场景= =

王一之 发表于 2022-10-22 09:10:26

cxxjackie 发表于 2022-10-21 23:48
第二个的解法跟上次是一样的吧,劫持addEventListener伪造一个事件进去:

第一个暂时没想到不依赖扩展的解 ...
对,第二个解法和上次一样,都是在脚本可以比页面代码更快运行的情况

第一个也是因为扩展比页面更快执行才有解,哥哥还可以从扩展只能操作document这个方向去解,解出这个也就等于解出了第一个(我也暂时只想到这块)

从扩展context注入一个不存在的资源,这个我没尝试,但也可能是一种解法,我想到的是另外一种

王一之 发表于 2022-10-22 09:12:31

李恒道 发表于 2022-10-22 00:12
```javascript
// ==UserScript==
// @name         New Userscript


歪门邪道!不过也不为一种思路

王一之 发表于 2022-10-22 09:17:35

steven026 发表于 2022-10-22 00:15
```js
// ==UserScript==
// @name         过掉isTrusted检测

算的,突然感觉第二个难度是不是有点低了{:4_98:},而且还和上次重复

王一之 发表于 2022-10-22 09:22:09

李恒道 发表于 2022-10-22 00:24
```
// ==UserScript==
// @name         New Userscript


哥哥快要接近真相了!
页: [1] 2 3
查看完整版本: [活动结束][有奖答题]网页点击大挑战!2.0