一个普通朋友在参加某女神节评比,因为正义的理由,委托我来刷票。
首先观察下内容,没有浏览器打开的选项,而我们要获得url。看起来应该是在微信sdk中调用了menuItem禁止了浏览器打开,这个的解决方法很多,我直接分享给自己然后选中聊天后尝试
发送邮件,聊天记录里微信分享的这种h5都会直接暴露url。有了这个下一步就是去在chrome里操作了。
chrome中打开后我们发现,投票被禁用了,点击投票后提示用微信打开。
然后让我来观察下html是怎样的,gs
一下,view source。发现结构上有如下一段js,替换了原本绑定在button上的点击事件,导致点击后不进行投票而是弹出使用微信打开的提示:
这里最好是能在浏览器中篡改这段html,准备祭出油猴,但问题是这个坑爹的脚本是在body最后的一个script tag,我原以为可以通过设置@run-at
来改变userscirpt
inject的时机,通过编辑server返回的raw html来删除那段脚本,
但是研究了一顿发现这是不可能的,这个跟油猴等的工作机制相关,raw html会在油猴生效前就被浏览器解析加载,油猴只能用于编辑已加载的页面,在加载后可以将某些脚本插入页面中,而那时候script tag已经执行过了。
另一个思路是监听事件,脚本执行前做点什么,在ff中是支持beforescriptexecute,但这个事件只存在于ff, 而chrome也停止了对这个事件的进一步推进。
所以这个方法是可以在ff下使用Greasemonkey
,然后配套@run-at: document-start
来达到目的。
还有什么呢?想到了一个发布很久但还没怎么用到的chrome功能:Local Overrides。这个功能完全满足了我们的诉求,直接编辑raw html。
打开开发者工具,source -> local overrides,选择一个文件夹,同意浏览器访问,然后在在source资源里找到html,直接编辑,注释掉那段脚本,同时勾选enable local overrides
, 按下cmd +s
保存,然后刷新页面:
这时候我们看下页面元素,脚本已经被注释掉了。而且生效时,network会提示黄色叹号。
再次点击投票,仍然提示微信操作,打开其他外联js资源:
问题虽然找到,但这是不需要解决的,首先刷票只要能伪造请求就可以,根本不要关心这种ui交互;另一方面考虑到业务鉴权这种常见的场景,你肯定需要一些用户标识来判断谁投的、投了几次等业务场景,就算消除了这些ui阻碍,
在浏览器中我们仍然是拿不到这些签名。看了下外链js,然后提交几个请求试验一下:
最后需要拿到wxparams,这tmd是什么?要找个路由器抓包试试,应该是用户登陆态返回的token。。。而且这里少比较了wx下抓包回来的html,这可能是在请求头不同而造成了不同的ssr,这也需要抓包才能确定。。
ref:
https://stackoverflow.com/questions/18323757/how-do-you-detect-that-a-script-was-loaded-and-executed-in-a-chrome-extension/18608622#18608622
https://gist.github.com/BrockA/2620135
https://stackoverflow.com/questions/3972038/stop-execution-of-javascript-function-client-side-or-tweak-it