摘要:這是一個(gè)被爆出來(lái)的隨機(jī)數(shù)漏洞,如果我知道了服務(wù)端的隨機(jī)數(shù)漏洞,那么完全可以利用這一點(diǎn)來(lái)偽造出一個(gè)完美的假。
原文:http://www.l4zy.com/posts/how-to-get-real-ip-address.html
起因寫這篇文章緣起SF的一個(gè)問(wèn)題 http://segmentfault.com/q/1010000000686700/a-1020000000687155。由此我想到了很多,就和大家隨便聊聊吧
在PHP中獲取ip地址有一段網(wǎng)上流傳甚廣的代碼,還有它的各種變種
function real_ip() { static $realip = NULL; if ($realip !== NULL) { return $realip; } if (isset($_SERVER)) { if (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) { $arr = explode(",", $_SERVER["HTTP_X_FORWARDED_FOR"]); /* 取X-Forwarded-For中第一個(gè)非unknown的有效IP字符串 */ foreach ($arr AS $ip) { $ip = trim($ip); if ($ip != "unknown") { $realip = $ip; break; } } } elseif (isset($_SERVER["HTTP_CLIENT_IP"])) { $realip = $_SERVER["HTTP_CLIENT_IP"]; } else { if (isset($_SERVER["REMOTE_ADDR"])) { $realip = $_SERVER["REMOTE_ADDR"]; } else { $realip = "0.0.0.0"; } } } else { if (getenv("HTTP_X_FORWARDED_FOR")) { $realip = getenv("HTTP_X_FORWARDED_FOR"); } elseif (getenv("HTTP_CLIENT_IP")) { $realip = getenv("HTTP_CLIENT_IP"); } else { $realip = getenv("REMOTE_ADDR"); } } preg_match("/[d.]{7,15}/", $realip, $onlineip); $realip = !empty($onlineip[0]) ? $onlineip[0] : "0.0.0.0"; return $realip; }
這段代碼的原理是從HTTP_X_FORWARDED_FOR以及HTTP_CLIENT_IP還有REMOTE_ADDR中獲取ip地址。
這段代碼有問(wèn)題嗎?如果從功能角度來(lái)看,它是沒(méi)有問(wèn)題的,因?yàn)樗WC了你可以盡可能地獲取到一個(gè)ip地址,如果你地程序不需要驗(yàn)證這個(gè)ip地址是否正確,只是為了顯示它的來(lái)源,那么你可以這樣做沒(méi)問(wèn)題。
但是很多情況下我們需要確切地知道當(dāng)前跟服務(wù)器連接的是哪個(gè)ip,那這段代碼就不妥了。
在PHP的$_SERVER變量中,凡是以HTTP_開(kāi)頭的鍵值都是直接從客戶端的HTTP請(qǐng)求頭中直接解析出來(lái)的。
這句話啥意思,意思就是客戶端告訴你ip是多少就是多少,偽造它的成本可以說(shuō)非常低。除了這兩個(gè)以HTTP_開(kāi)頭的地址外,還有一個(gè)REMOTE_ADDR地址,這個(gè)地址是與你的服務(wù)器進(jìn)行實(shí)際tcp連接的地址,它是一個(gè)可信賴的地址。要偽造這個(gè)地址成本很高,這是由于TCP三次握手協(xié)議的原理決定的,除非你能騙過(guò)服務(wù)器端的路由,那這樣的成本就太高了,還不如直接黑進(jìn)你的服務(wù)器
衍生上圖是一個(gè)經(jīng)過(guò)簡(jiǎn)化的TCP握手協(xié)議,握手就是指在你正式傳輸信息之前,客戶端和服務(wù)端確認(rèn)雙方是否可信的過(guò)程,這三步可以通俗化成下面的過(guò)程
小C (Client) 向小S (Server) 發(fā)了一封信(SYN),告訴它我要寄一個(gè)包裹 (數(shù)據(jù)) 給你,但是為了保證這個(gè)包裹你能收到,我先發(fā)一封信確認(rèn)下你的地址 (Server IP) 是不是正確的,怎么確認(rèn)呢?收到這封信后請(qǐng)按信上的地址 (Client IP) 回信就行了。
小S收到了這封信以后一想,我不僅要回信確認(rèn)我的地址是存在的(ACK),還要問(wèn)問(wèn)你的地址是不是正確的,要不然我咋知道你是不是靠譜的人。于是小S給小C發(fā)了一封回信,不僅在信里確認(rèn)自己的地址是正確的(ACK),也要求(SYN)小C在收到信件后給自己發(fā)一封回信,以確認(rèn)他的地址也是真實(shí)的。要不然我會(huì)拒絕你的連接
小C在收到小S的確認(rèn)后,馬上發(fā)了一封回信(ACK)告訴我已經(jīng)收到信了
從此它們就可以愉快的通信了。
那么問(wèn)題來(lái)了如果小C沒(méi)有收到小S的確認(rèn)信,但他也發(fā)了一封回信騙小S說(shuō)自己已經(jīng)收到了,怎么破?
這個(gè)問(wèn)題實(shí)際上在TCP協(xié)議中已經(jīng)解決了,每個(gè)SYN請(qǐng)求都會(huì)包含一個(gè)隨機(jī)數(shù)字,發(fā)送回信ACK的時(shí)候,必須一并將這個(gè)數(shù)字加一再發(fā)回去。這樣我們收到ACK的時(shí)候只要確認(rèn)這個(gè)值是否正確就行了。
如果郵政局被收買了怎么?
這確實(shí)是一個(gè)風(fēng)險(xiǎn),這就是我剛才提到的,路由器被黑掉的可能。這也就是很多人為什么說(shuō)互聯(lián)網(wǎng)的基礎(chǔ)是非常脆弱的,只要公網(wǎng)上的其中一個(gè)路由器說(shuō)了假話,所有經(jīng)過(guò)這個(gè)路由器的數(shù)據(jù)都會(huì)變成不可信的。
但同時(shí)這個(gè)成本非常高,因?yàn)槁酚善鞯陌踩?jí)別通常是很高的,而且一般的路由器管理端口也不會(huì)向普通訪問(wèn)者開(kāi)放。所以能做到這一點(diǎn)的黑客,通常會(huì)選擇直接去黑你的服務(wù)器。
這就好比我為了寄點(diǎn)東西噁心你一下,還要去賄賂一整個(gè)郵政局,顯然不劃算。還不如我直接買張火車票,趕到你的住處,把你門撬了,放你桌上。
再發(fā)散下SYN FLOOD攻擊
也就是SYN洪水攻擊,看了上面的解釋你應(yīng)該大概知道SYN是啥意思了,就是一個(gè)詢問(wèn)包。所謂SYN洪水攻擊就是指Client發(fā)送第一個(gè)SYN包的時(shí)候,告訴Server的源地址是一個(gè)假的,當(dāng)Server發(fā)送回執(zhí)時(shí)會(huì)進(jìn)入到一個(gè)half-open(半開(kāi))狀態(tài)。
為啥叫半開(kāi),因?yàn)檫@個(gè)端口只開(kāi)了一半,握手過(guò)程已經(jīng)開(kāi)始,但還有一半沒(méi)完成。這個(gè)半開(kāi)連接大家應(yīng)該都聽(tīng)過(guò),早先玩迅雷下載或者bt的時(shí)候都需要打一個(gè)windows半開(kāi)連接數(shù)補(bǔ)丁,就是因?yàn)樽烂娌僮飨到y(tǒng)的計(jì)算資源是優(yōu)先傾向于GUI的,當(dāng)系統(tǒng)處于半開(kāi)連接時(shí)因?yàn)樘幱诘却隣顟B(tài),是會(huì)消耗內(nèi)存和計(jì)算資源的,所以操作系統(tǒng)會(huì)默認(rèn)把這個(gè)值調(diào)低,限制你能接受的連接。而我們p2p下載又需要比較高的連接量,所以就有了這個(gè)補(bǔ)丁,把它的限制打開(kāi)。
我花這段篇幅解釋半開(kāi)連接數(shù)并不是沒(méi)事找事,這其實(shí)就是SYN FLOOD攻擊的原理。因?yàn)楫?dāng)系統(tǒng)處于半開(kāi)狀態(tài)時(shí)要消耗資源,而服務(wù)器往往半開(kāi)連接數(shù)限制都比較大(或者干脆沒(méi)限制),因此接第一段的話,因?yàn)榉?wù)器得到的源地址是個(gè)假的,發(fā)送回執(zhí)后肯定會(huì)收不到確認(rèn),因此就會(huì)進(jìn)入到漫長(zhǎng)的等待過(guò)程(相對(duì)于響應(yīng)時(shí)間)。攻擊者通過(guò)偽造大量的這種無(wú)效請(qǐng)求,使服務(wù)器端等待大量連接,從而耗盡服務(wù)器資源,以達(dá)到使其癱瘓的目的。
想看看你是不是受到了此種攻擊,只需要在netstat時(shí)看看是不是有大量的SYN_RCVD連接即可。SYN_RCVD表示服務(wù)器處于握手的第二步。
隨機(jī)數(shù)的漏洞
我先將剛剛講過(guò)的一個(gè)問(wèn)題引用下
如果小C沒(méi)有收到小S的確認(rèn)信,但他也發(fā)了一封回信騙小S說(shuō)自己已經(jīng)收到了,怎么破?
這個(gè)問(wèn)題實(shí)際上在TCP協(xié)議中已經(jīng)解決了,每個(gè)SYN請(qǐng)求都會(huì)包含一個(gè)隨機(jī)數(shù)字,發(fā)送回信ACK的時(shí)候,必須一并將這個(gè)數(shù)字加一再發(fā)回去。
這段話段的關(guān)鍵在于“隨機(jī)數(shù)”這三個(gè)字,因?yàn)槲覀冞@個(gè)驗(yàn)證過(guò)程的一大基礎(chǔ)是Server生成的隨機(jī)數(shù)是不可能被Client端提前知道的,這就好比打撲克時(shí)你不可能知道其他人的牌是什么,一個(gè)道理。
但如果這個(gè)Client是個(gè)賭神呢?
http://www.securityfocus.com/bid/25348/discuss
根據(jù)安全機(jī)構(gòu)的研究,Linux內(nèi)核中包含了一個(gè)可導(dǎo)致Dos和權(quán)限提升的漏洞,可以被黑客利用來(lái)運(yùn)行攻擊代碼。這是一個(gè)核心內(nèi)存的堆棧溢出問(wèn)題,可以導(dǎo)致系統(tǒng)的崩潰,再特定的環(huán)境下,還可以提升權(quán)限。這個(gè)漏洞影響到了Linux內(nèi)核2.6.22.3前的版本。
這是一個(gè)被爆出來(lái)的隨機(jī)數(shù)漏洞,如果我知道了服務(wù)端的隨機(jī)數(shù)漏洞,那么完全可以利用這一點(diǎn)來(lái)偽造出一個(gè)完美的假ip。
最后弱弱地總結(jié)下那我們到底該相信哪個(gè)ip呢?
首選REMOTE_ADDR,因?yàn)殡m然有如此多地偽造方法,但在語(yǔ)言層面你只能選一個(gè)最可靠地。
如果你地服務(wù)隱藏在負(fù)載均衡或者緩存系統(tǒng)后面,它通常會(huì)給你發(fā)一個(gè)Client-Ip或者X-Forwarded-For的HTTP頭,告訴你跟它連接的客戶端ip,這時(shí)的HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR是可信的,因?yàn)樗菑那岸朔?wù)器上的直接傳遞過(guò)來(lái)的,當(dāng)然你必須在程序中指定只信任這一個(gè)來(lái)源,而不要像最開(kāi)始的代碼那樣每個(gè)都檢測(cè)一遍
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31880.html
摘要:這是一個(gè)被爆出來(lái)的隨機(jī)數(shù)漏洞,如果我知道了服務(wù)端的隨機(jī)數(shù)漏洞,那么完全可以利用這一點(diǎn)來(lái)偽造出一個(gè)完美的假。 原文:http://www.l4zy.com/posts/how-to-get-real-ip-address.html 起因 寫這篇文章緣起SF的一個(gè)問(wèn)題 http://segmentfault.com/q/1010000000686700/a-10200000006871...
摘要:協(xié)議族協(xié)議協(xié)議協(xié)議應(yīng)用程序通過(guò)套接字對(duì)協(xié)議和協(xié)議所提供的服務(wù)進(jìn)行訪問(wèn)。網(wǎng)絡(luò)層完成將分組報(bào)文傳輸?shù)剿哪康牡兀绰酚晒δ埽话悴捎脜f(xié)議。程序間達(dá)成的這種包含了信息交換的形式和意義的共識(shí)稱為協(xié)議。 TCP/IP協(xié)議族:IP協(xié)議、TCP協(xié)議、UDP協(xié)議 showImg(https://segmentfault.com/img/bVvwxE); 應(yīng)用程序通過(guò)套接字API對(duì)UPD協(xié)議和TCP協(xié)議...
摘要:原理遠(yuǎn)程主機(jī)收到用戶的登錄請(qǐng)求,把自己的公鑰發(fā)給用戶。也就是說(shuō),要實(shí)現(xiàn)免密碼登入,首先要設(shè)置鑰匙。把公鑰放到遠(yuǎn)程服務(wù)器比如我的基本都安裝了,萬(wàn)一沒(méi)有,上。TL;DR 本地登錄服務(wù)器 ssh user@remote -p port,端口是22的話ssh user@remote,退出登錄exit 本地免密碼登錄 ssh-copy-id user@remote -p port,這在寫腳本服務(wù)器控...
摘要:相比之下,在年月進(jìn)行的一次調(diào)查中的中小型受訪企業(yè)表示,他們所使用的基于云計(jì)算的應(yīng)用程序的安全等級(jí)要高于他們?cè)趦?nèi)部實(shí)施的安全等級(jí)。 ?????? 在十年不到的時(shí)間里,云計(jì)算已從一個(gè)有趣的新概念發(fā)展成為業(yè)界的一大主流市場(chǎng)。業(yè)界對(duì)云計(jì)算未來(lái)的期望普遍較高,摩根士丹利預(yù)測(cè)Amazon網(wǎng)絡(luò)服 務(wù)(AWS)將在2022年突破二百四十億美元年收入的大關(guān)。當(dāng)然,任何單一一家供應(yīng)商云計(jì)算業(yè)務(wù)的成功都完全取決于...
摘要:全球可信的證書(shū)品牌有等。一品牌商家主要有哪些旗下年收購(gòu)。。這個(gè)品牌的是目前全球知名的品牌之一,用的人和企業(yè)也不較多。ssl證書(shū)品牌有哪些值得推薦的呢?ssl證書(shū)是由CA機(jī)構(gòu)頒發(fā)的數(shù)字認(rèn)證證書(shū),只要是合法的CA機(jī)構(gòu)比如Comodo、symantec、thawte、digicert這些都可以。 ? 目前,市場(chǎng)上可供選擇的SSL證書(shū)品牌很多,但并不是所有的品牌都值得信任。如果選擇了不可信的...
閱讀 2875·2023-04-25 15:01
閱讀 3185·2021-11-23 10:07
閱讀 3414·2021-10-12 10:12
閱讀 3524·2021-08-30 09:45
閱讀 2249·2021-08-20 09:36
閱讀 3657·2019-08-30 12:59
閱讀 2504·2019-08-26 13:52
閱讀 988·2019-08-26 13:24