[活动结束][有奖答题]网页点击大挑战!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,还请勿走歪门邪道,歪门邪道不享受奖励
奖励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
第二个的解法跟上次是一样的吧,劫持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的手段。 ```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: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()
}
```
不知道这样算吗? ```
// ==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()
``` cxxjackie 发表于 2022-10-21 23:48
第二个的解法跟上次是一样的吧,劫持addEventListener伪造一个事件进去:
第一个暂时没想到不依赖扩展的解 ...
可以利用创建一个空iframe标签然后写innerHtml使script失效,再修改代码重新启动来实现
但是太邪道了....
感觉没实际应用场景= = cxxjackie 发表于 2022-10-21 23:48
第二个的解法跟上次是一样的吧,劫持addEventListener伪造一个事件进去:
第一个暂时没想到不依赖扩展的解 ...
对,第二个解法和上次一样,都是在脚本可以比页面代码更快运行的情况
第一个也是因为扩展比页面更快执行才有解,哥哥还可以从扩展只能操作document这个方向去解,解出这个也就等于解出了第一个(我也暂时只想到这块)
从扩展context注入一个不存在的资源,这个我没尝试,但也可能是一种解法,我想到的是另外一种
李恒道 发表于 2022-10-22 00:12
```javascript
// ==UserScript==
// @name New Userscript
歪门邪道!不过也不为一种思路 steven026 发表于 2022-10-22 00:15
```js
// ==UserScript==
// @name 过掉isTrusted检测
算的,突然感觉第二个难度是不是有点低了{:4_98:},而且还和上次重复 李恒道 发表于 2022-10-22 00:24
```
// ==UserScript==
// @name New Userscript
哥哥快要接近真相了!