摘要:這是一個被爆出來的隨機數漏洞,如果我知道了服務端的隨機數漏洞,那么完全可以利用這一點來偽造出一個完美的假。
原文:http://www.l4zy.com/posts/how-to-get-real-ip-address.html
起因寫這篇文章緣起SF的一個問題 http://segmentfault.com/q/1010000000686700/a-1020000000687155。由此我想到了很多,就和大家隨便聊聊吧
在PHP中獲取ip地址有一段網上流傳甚廣的代碼,還有它的各種變種
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中第一個非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地址。
這段代碼有問題嗎?如果從功能角度來看,它是沒有問題的,因為它保證了你可以盡可能地獲取到一個ip地址,如果你地程序不需要驗證這個ip地址是否正確,只是為了顯示它的來源,那么你可以這樣做沒問題。
但是很多情況下我們需要確切地知道當前跟服務器連接的是哪個ip,那這段代碼就不妥了。
在PHP的$_SERVER變量中,凡是以HTTP_開頭的鍵值都是直接從客戶端的HTTP請求頭中直接解析出來的。
這句話啥意思,意思就是客戶端告訴你ip是多少就是多少,偽造它的成本可以說非常低。除了這兩個以HTTP_開頭的地址外,還有一個REMOTE_ADDR地址,這個地址是與你的服務器進行實際tcp連接的地址,它是一個可信賴的地址。要偽造這個地址成本很高,這是由于TCP三次握手協議的原理決定的,除非你能騙過服務器端的路由,那這樣的成本就太高了,還不如直接黑進你的服務器
衍生上圖是一個經過簡化的TCP握手協議,握手就是指在你正式傳輸信息之前,客戶端和服務端確認雙方是否可信的過程,這三步可以通俗化成下面的過程
小C (Client) 向小S (Server) 發了一封信(SYN),告訴它我要寄一個包裹 (數據) 給你,但是為了保證這個包裹你能收到,我先發一封信確認下你的地址 (Server IP) 是不是正確的,怎么確認呢?收到這封信后請按信上的地址 (Client IP) 回信就行了。
小S收到了這封信以后一想,我不僅要回信確認我的地址是存在的(ACK),還要問問你的地址是不是正確的,要不然我咋知道你是不是靠譜的人。于是小S給小C發了一封回信,不僅在信里確認自己的地址是正確的(ACK),也要求(SYN)小C在收到信件后給自己發一封回信,以確認他的地址也是真實的。要不然我會拒絕你的連接
小C在收到小S的確認后,馬上發了一封回信(ACK)告訴我已經收到信了
從此它們就可以愉快的通信了。
那么問題來了如果小C沒有收到小S的確認信,但他也發了一封回信騙小S說自己已經收到了,怎么破?
這個問題實際上在TCP協議中已經解決了,每個SYN請求都會包含一個隨機數字,發送回信ACK的時候,必須一并將這個數字加一再發回去。這樣我們收到ACK的時候只要確認這個值是否正確就行了。
如果郵政局被收買了怎么?
這確實是一個風險,這就是我剛才提到的,路由器被黑掉的可能。這也就是很多人為什么說互聯網的基礎是非常脆弱的,只要公網上的其中一個路由器說了假話,所有經過這個路由器的數據都會變成不可信的。
但同時這個成本非常高,因為路由器的安全級別通常是很高的,而且一般的路由器管理端口也不會向普通訪問者開放。所以能做到這一點的黑客,通常會選擇直接去黑你的服務器。
這就好比我為了寄點東西噁心你一下,還要去賄賂一整個郵政局,顯然不劃算。還不如我直接買張火車票,趕到你的住處,把你門撬了,放你桌上。
再發散下SYN FLOOD攻擊
也就是SYN洪水攻擊,看了上面的解釋你應該大概知道SYN是啥意思了,就是一個詢問包。所謂SYN洪水攻擊就是指Client發送第一個SYN包的時候,告訴Server的源地址是一個假的,當Server發送回執時會進入到一個half-open(半開)狀態。
為啥叫半開,因為這個端口只開了一半,握手過程已經開始,但還有一半沒完成。這個半開連接大家應該都聽過,早先玩迅雷下載或者bt的時候都需要打一個windows半開連接數補丁,就是因為桌面操作系統的計算資源是優先傾向于GUI的,當系統處于半開連接時因為處于等待狀態,是會消耗內存和計算資源的,所以操作系統會默認把這個值調低,限制你能接受的連接。而我們p2p下載又需要比較高的連接量,所以就有了這個補丁,把它的限制打開。
我花這段篇幅解釋半開連接數并不是沒事找事,這其實就是SYN FLOOD攻擊的原理。因為當系統處于半開狀態時要消耗資源,而服務器往往半開連接數限制都比較大(或者干脆沒限制),因此接第一段的話,因為服務器得到的源地址是個假的,發送回執后肯定會收不到確認,因此就會進入到漫長的等待過程(相對于響應時間)。攻擊者通過偽造大量的這種無效請求,使服務器端等待大量連接,從而耗盡服務器資源,以達到使其癱瘓的目的。
想看看你是不是受到了此種攻擊,只需要在netstat時看看是不是有大量的SYN_RCVD連接即可。SYN_RCVD表示服務器處于握手的第二步。
隨機數的漏洞
我先將剛剛講過的一個問題引用下
如果小C沒有收到小S的確認信,但他也發了一封回信騙小S說自己已經收到了,怎么破?
這個問題實際上在TCP協議中已經解決了,每個SYN請求都會包含一個隨機數字,發送回信ACK的時候,必須一并將這個數字加一再發回去。
這段話段的關鍵在于“隨機數”這三個字,因為我們這個驗證過程的一大基礎是Server生成的隨機數是不可能被Client端提前知道的,這就好比打撲克時你不可能知道其他人的牌是什么,一個道理。
但如果這個Client是個賭神呢?
http://www.securityfocus.com/bid/25348/discuss
根據安全機構的研究,Linux內核中包含了一個可導致Dos和權限提升的漏洞,可以被黑客利用來運行攻擊代碼。這是一個核心內存的堆棧溢出問題,可以導致系統的崩潰,再特定的環境下,還可以提升權限。這個漏洞影響到了Linux內核2.6.22.3前的版本。
這是一個被爆出來的隨機數漏洞,如果我知道了服務端的隨機數漏洞,那么完全可以利用這一點來偽造出一個完美的假ip。
最后弱弱地總結下那我們到底該相信哪個ip呢?
首選REMOTE_ADDR,因為雖然有如此多地偽造方法,但在語言層面你只能選一個最可靠地。
如果你地服務隱藏在負載均衡或者緩存系統后面,它通常會給你發一個Client-Ip或者X-Forwarded-For的HTTP頭,告訴你跟它連接的客戶端ip,這時的HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR是可信的,因為它是從前端服務器上的直接傳遞過來的,當然你必須在程序中指定只信任這一個來源,而不要像最開始的代碼那樣每個都檢測一遍
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31880.html
摘要:這是一個被爆出來的隨機數漏洞,如果我知道了服務端的隨機數漏洞,那么完全可以利用這一點來偽造出一個完美的假。 原文:http://www.l4zy.com/posts/how-to-get-real-ip-address.html 起因 寫這篇文章緣起SF的一個問題 http://segmentfault.com/q/1010000000686700/a-10200000006871...
摘要:原理遠程主機收到用戶的登錄請求,把自己的公鑰發給用戶。也就是說,要實現免密碼登入,首先要設置鑰匙。把公鑰放到遠程服務器比如我的基本都安裝了,萬一沒有,上。TL;DR 本地登錄服務器 ssh user@remote -p port,端口是22的話ssh user@remote,退出登錄exit 本地免密碼登錄 ssh-copy-id user@remote -p port,這在寫腳本服務器控...
摘要:相比之下,在年月進行的一次調查中的中小型受訪企業表示,他們所使用的基于云計算的應用程序的安全等級要高于他們在內部實施的安全等級。 ?????? 在十年不到的時間里,云計算已從一個有趣的新概念發展成為業界的一大主流市場。業界對云計算未來的期望普遍較高,摩根士丹利預測Amazon網絡服 務(AWS)將在2022年突破二百四十億美元年收入的大關。當然,任何單一一家供應商云計算業務的成功都完全取決于...
摘要:全球可信的證書品牌有等。一品牌商家主要有哪些旗下年收購。。這個品牌的是目前全球知名的品牌之一,用的人和企業也不較多。ssl證書品牌有哪些值得推薦的呢?ssl證書是由CA機構頒發的數字認證證書,只要是合法的CA機構比如Comodo、symantec、thawte、digicert這些都可以。 ? 目前,市場上可供選擇的SSL證書品牌很多,但并不是所有的品牌都值得信任。如果選擇了不可信的...
閱讀 2813·2023-04-25 15:01
閱讀 3012·2021-11-23 10:07
閱讀 3357·2021-10-12 10:12
閱讀 3444·2021-08-30 09:45
閱讀 2183·2021-08-20 09:36
閱讀 3566·2019-08-30 12:59
閱讀 2424·2019-08-26 13:52
閱讀 927·2019-08-26 13:24