MENU

微信搞事第二弹

2018 年 04 月 05 日 • 碎碎念

先前篇预览:微信网页版的各种作死

啥玩意?

上回中说到,我们已经能成功的登录微信网页版了,但是除了获取到跳转url以外没有任何的进展。
鉴于最近闲得要死,捡起来这个老坑继续来啃一啃。

继续

在成功登录微信后,我们看到HTTPS GET请求了webwxnewloginpage

20180405-204021@2x.png

具体的url为

https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=CODE()@qrticket_0&uuid=QRcode()&lang=zh_CN&scan=time()&fun=new&version=v2&lang=zh_CN

其中,使用到了开始返回给我们的登录密钥ticket和登录二维码密钥。
若你直接对这个地址进行GET请求,微信会直接甩给你一个错误的请求代码

20180405-213208@2x.png

emmm
拉回去重看了GET请求的信息,发现了其在HEADER中有额外的信息

20180405-214439@2x.png

看来微信会检查这个GET请求是不是HOST且REFERER于wx.qq.com,如果不是的话直接就抛出异常了。

伪装一波

如果让微信的服务器相信我们就是wx.qq.com呢?
的确,Header中包含了Host和Referer的信息,如果我们强制发送一个假的Host和Referer,微信会不会识别?

作死开始,先用Postman发送带有特殊Header的GET请求,结果如下

20180405-225139@2x.png

说明,在添加了

Host: wx.qq.com
Cookie: mm_lang=zh_CN; MM_WX_NOTIFY_STATE=1; MM_WX_SOUND_STATE=1;
Origin: wx.qq.com
Referer: wx.qq.com

的情况下,微信接受了我们的GET请求并成功的返回了很关键的几个变量。

  • skey
  • wxsid
  • wxuin
  • pass_ticket

而这些变量就是我们后续操作的必要信息。
剩下的工作就是把过程交给PHP来处理。

拿起键盘…

PHP中有个函数可以模拟POST/GET请求叫做fsockopen
Fscokopen可以模(wêi)拟(zào)任意的HTTP(s) POST/GET请求,只需小小更改一下,便可以伪造HOST和REFERER的变量。
关于fsockopen,PHP Manual里写到

Open Internet or Unix domain socket connection

更多关于fsockopen,点击这里

由于微信使用了HTTPS,我们需要使用ssl版本的fsockopen。
只需在host前加上ssl://即可。

配置fsockopen

有了参数可不行,我们必须配置好fsockopen的参数才能有效的模拟GET请求。
首先,需要对Header信息进行urlencode。

$formdata = array (
    "ticket" => $key . "@qrticket_0",
    "uuid" => $uuid,
    "lang" => "zh_CN",
    "scan" => time(),
    "fun" => "new",
    "version" => "v2",
    "lang" => "zh_CN");
foreach($formdata as $key => $val){
    $getstring .= urlencode($key) . "=" . urlencode($val) . "&";
}
$getstring = substr($getstring, 0, -1);

其次,建立连接,由于微信使用了HTTPS,故端口为443,采取ssl://
目标地址为最初的webwxnewloginpage,绝对目录为/cgi-bin/mmwebwx-bin/webwxnewloginpage

$fp = fsockopen("ssl://".$host, $port, $errno, $errstr, 30);

在连接建立成功后,我们添加所需的信息和编码好的Header信息。

fputs($fp, "GET " . $path ."?" . "$getstring HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Accept: application/json, text/plain, */*\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded; charset=UTF-8\r\n");
fputs($fp, "Content-length: ".strlen($getstring)."\r\n");
fputs($fp, "Connection: keep-alive\r\n\r\n");
fputs($fp, "Referer: https://wx.qq.com/?&lang=zh_CN\r\n\r\n");
fputs($fp, $getstring . "\r\n\r\n");

然后就和操作fopen一样的方法就可以获得我们所需的数据了。

最后,请不要忘记关闭你的连接!!fclose();很重要

成品图

20180405-231648@2x.png

然后呢?

有了这几个关键的变量,我们可以使用它来获取好友列表,发送消息,等其他操作。

最后编辑于: 2018 年 04 月 27 日
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论

已有 2 条评论
  1. @(滑稽)没有评论就很寒心

  2. 挺好的文章,可惜做微信的人太少……