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的函數(直接白嫖):
如果對方有代理的話$_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
本文原創,轉載請注明出處
總結
以上是生活随笔為你收集整理的QQ通过xml卡片自动探测对方ip的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 01-几种应用上下文区别
- 下一篇: java天气预报webservice_w