一个普通朋友在参加某女神节评比,因为正义的理由,委托我来刷票。

首先观察下内容,没有浏览器打开的选项,而我们要获得url。看起来应该是在微信sdk中调用了menuItem禁止了浏览器打开,这个的解决方法很多,我直接分享给自己然后选中聊天后尝试
发送邮件,聊天记录里微信分享的这种h5都会直接暴露url。有了这个下一步就是去在chrome里操作了。

image.png

chrome中打开后我们发现,投票被禁用了,点击投票后提示用微信打开。

image6b3416b8eb4353ea.png

image9d7d379f828224bc.png

然后让我来观察下html是怎样的,gs一下,view source。发现结构上有如下一段js,替换了原本绑定在button上的点击事件,导致点击后不进行投票而是弹出使用微信打开的提示:

image137bccafecc5d039.png

这里最好是能在浏览器中篡改这段html,准备祭出油猴,但问题是这个坑爹的脚本是在body最后的一个script tag,我原以为可以通过设置@run-at来改变userscirptinject的时机,通过编辑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 保存,然后刷新页面:

imaged1fe0f64958ed6a8.png

image35a8ba4f0f6cb8fe.png

这时候我们看下页面元素,脚本已经被注释掉了。而且生效时,network会提示黄色叹号。

再次点击投票,仍然提示微信操作,打开其他外联js资源:

imagef564267d7051fbf2.png

问题虽然找到,但这是不需要解决的,首先刷票只要能伪造请求就可以,根本不要关心这种ui交互;另一方面考虑到业务鉴权这种常见的场景,你肯定需要一些用户标识来判断谁投的、投了几次等业务场景,就算消除了这些ui阻碍,
在浏览器中我们仍然是拿不到这些签名。看了下外链js,然后提交几个请求试验一下:

imagef55f9d7a64a35465.png
image67bb8d2b294dedd7.png
image04df5ba34266f1ea.png

最后需要拿到wxparams,这tmd是什么?要找个路由器抓包试试,应该是用户登陆态返回的token。。。而且这里少比较了wx下抓包回来的html,这可能是在请求头不同而造成了不同的ssr,这也需要抓包才能确定。。

ref:

https://stackoverflow.com/questions/16848040/how-to-edit-raw-html-with-greasemonkey-tampermonkey-before-it-is-parsed-by-brows

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