首页 技术分享

因为我懒嘛~~,绝对不是因为我懒哈,是因为之前的方法一直不适合绝大多数用户,今天才发现了每个人都能用的方法。

起因是这样的,某一天我像往常一样刷着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']
$_SERVER['HTTP_USER_AGENT']
开始构造完整代码,首先是在大佬文章中找到的获取真实ip的函数(直接白嫖):

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文件伪装成图片,构造代码如下:

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

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

<?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和谐,所以这里提供一个比较稳定的示例代码:

<?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:

<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

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




文章评论

    kwkw 大佬SafariMac
    28天 前   回复

    ip用处不大,但自动访问链接用处大,比如自动挖矿

      Y5neKO 菜鸡ChromeWindows
      21天 前   回复

      确实,哈哈哈

    Y5neKO 菜鸡ChromeWindows
    2020-10-22 20:18   回复

    目前通过链接分享的形式失效,暂时只能使用太极xposed或者虚拟xposed以及qq机器人发送xml卡片,以后发现新的方法会继续更新

    11 大佬ChromeWindows
    2020-05-23 17:07   回复

    等普及ipv6就有用了,现在什么ip都是虚的

      YS_Neko 菜鸡ChromeWindows
      2020-05-24 18:14   回复

      而且现在查出来也没什么大用处,顶多装一装样子,哈哈

      YS_Neko 菜鸡ChromeWindows
      2020-05-24 18:13   回复

      哈哈,确实是,不过应该还是能获取到的,只是ipv6没ipv4那么容易查了

目录