成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從如何獲取可信賴的ip地址聊起

wua_wua2012 / 2665人閱讀

摘要:這是一個被爆出來的隨機(jī)數(shù)漏洞,如果我知道了服務(wù)端的隨機(jī)數(shù)漏洞,那么完全可以利用這一點(diǎn)來偽造出一個完美的假。

原文:http://www.l4zy.com/posts/how-to-get-real-ip-address.html

起因

寫這篇文章緣起SF的一個問題 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中第一個非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地址。

這段代碼有問題嗎?如果從功能角度來看,它是沒有問題的,因?yàn)樗WC了你可以盡可能地獲取到一個ip地址,如果你地程序不需要驗(yàn)證這個ip地址是否正確,只是為了顯示它的來源,那么你可以這樣做沒問題。

但是很多情況下我們需要確切地知道當(dāng)前跟服務(wù)器連接的是哪個ip,那這段代碼就不妥了。

在PHP的$_SERVER變量中,凡是以HTTP_開頭的鍵值都是直接從客戶端的HTTP請求頭中直接解析出來的。

這句話啥意思,意思就是客戶端告訴你ip是多少就是多少,偽造它的成本可以說非常低。除了這兩個以HTTP_開頭的地址外,還有一個REMOTE_ADDR地址,這個地址是與你的服務(wù)器進(jìn)行實(shí)際tcp連接的地址,它是一個可信賴的地址。要偽造這個地址成本很高,這是由于TCP三次握手協(xié)議的原理決定的,除非你能騙過服務(wù)器端的路由,那這樣的成本就太高了,還不如直接黑進(jìn)你的服務(wù)器

衍生

上圖是一個經(jīng)過簡化的TCP握手協(xié)議,握手就是指在你正式傳輸信息之前,客戶端和服務(wù)端確認(rèn)雙方是否可信的過程,這三步可以通俗化成下面的過程

小C (Client) 向小S (Server) 發(fā)了一封信(SYN),告訴它我要寄一個包裹 (數(shù)據(jù)) 給你,但是為了保證這個包裹你能收到,我先發(fā)一封信確認(rèn)下你的地址 (Server IP) 是不是正確的,怎么確認(rèn)呢?收到這封信后請按信上的地址 (Client IP) 回信就行了。

小S收到了這封信以后一想,我不僅要回信確認(rèn)我的地址是存在的(ACK),還要問問你的地址是不是正確的,要不然我咋知道你是不是靠譜的人。于是小S給小C發(fā)了一封回信,不僅在信里確認(rèn)自己的地址是正確的(ACK),也要求(SYN)小C在收到信件后給自己發(fā)一封回信,以確認(rèn)他的地址也是真實(shí)的。要不然我會拒絕你的連接

小C在收到小S的確認(rèn)后,馬上發(fā)了一封回信(ACK)告訴我已經(jīng)收到信了

從此它們就可以愉快的通信了。

那么問題來了

如果小C沒有收到小S的確認(rèn)信,但他也發(fā)了一封回信騙小S說自己已經(jīng)收到了,怎么破?

這個問題實(shí)際上在TCP協(xié)議中已經(jīng)解決了,每個SYN請求都會包含一個隨機(jī)數(shù)字,發(fā)送回信ACK的時候,必須一并將這個數(shù)字加一再發(fā)回去。這樣我們收到ACK的時候只要確認(rèn)這個值是否正確就行了。

如果郵政局被收買了怎么?

這確實(shí)是一個風(fēng)險,這就是我剛才提到的,路由器被黑掉的可能。這也就是很多人為什么說互聯(lián)網(wǎng)的基礎(chǔ)是非常脆弱的,只要公網(wǎng)上的其中一個路由器說了假話,所有經(jīng)過這個路由器的數(shù)據(jù)都會變成不可信的。

但同時這個成本非常高,因?yàn)槁酚善鞯陌踩墑e通常是很高的,而且一般的路由器管理端口也不會向普通訪問者開放。所以能做到這一點(diǎn)的黑客,通常會選擇直接去黑你的服務(wù)器。

這就好比我為了寄點(diǎn)東西噁心你一下,還要去賄賂一整個郵政局,顯然不劃算。還不如我直接買張火車票,趕到你的住處,把你門撬了,放你桌上。

再發(fā)散下

SYN FLOOD攻擊

也就是SYN洪水攻擊,看了上面的解釋你應(yīng)該大概知道SYN是啥意思了,就是一個詢問包。所謂SYN洪水攻擊就是指Client發(fā)送第一個SYN包的時候,告訴Server的源地址是一個假的,當(dāng)Server發(fā)送回執(zhí)時會進(jìn)入到一個half-open(半開)狀態(tài)。

為啥叫半開,因?yàn)檫@個端口只開了一半,握手過程已經(jīng)開始,但還有一半沒完成。這個半開連接大家應(yīng)該都聽過,早先玩迅雷下載或者bt的時候都需要打一個windows半開連接數(shù)補(bǔ)丁,就是因?yàn)樽烂娌僮飨到y(tǒng)的計算資源是優(yōu)先傾向于GUI的,當(dāng)系統(tǒng)處于半開連接時因?yàn)樘幱诘却隣顟B(tài),是會消耗內(nèi)存和計算資源的,所以操作系統(tǒng)會默認(rèn)把這個值調(diào)低,限制你能接受的連接。而我們p2p下載又需要比較高的連接量,所以就有了這個補(bǔ)丁,把它的限制打開。

我花這段篇幅解釋半開連接數(shù)并不是沒事找事,這其實(shí)就是SYN FLOOD攻擊的原理。因?yàn)楫?dāng)系統(tǒng)處于半開狀態(tài)時要消耗資源,而服務(wù)器往往半開連接數(shù)限制都比較大(或者干脆沒限制),因此接第一段的話,因?yàn)榉?wù)器得到的源地址是個假的,發(fā)送回執(zhí)后肯定會收不到確認(rèn),因此就會進(jìn)入到漫長的等待過程(相對于響應(yīng)時間)。攻擊者通過偽造大量的這種無效請求,使服務(wù)器端等待大量連接,從而耗盡服務(wù)器資源,以達(dá)到使其癱瘓的目的。

想看看你是不是受到了此種攻擊,只需要在netstat時看看是不是有大量的SYN_RCVD連接即可。SYN_RCVD表示服務(wù)器處于握手的第二步。

隨機(jī)數(shù)的漏洞

我先將剛剛講過的一個問題引用下

  

如果小C沒有收到小S的確認(rèn)信,但他也發(fā)了一封回信騙小S說自己已經(jīng)收到了,怎么破?
這個問題實(shí)際上在TCP協(xié)議中已經(jīng)解決了,每個SYN請求都會包含一個隨機(jī)數(shù)字,發(fā)送回信ACK的時候,必須一并將這個數(shù)字加一再發(fā)回去。

這段話段的關(guān)鍵在于“隨機(jī)數(shù)”這三個字,因?yàn)槲覀冞@個驗(yàn)證過程的一大基礎(chǔ)是Server生成的隨機(jī)數(shù)是不可能被Client端提前知道的,這就好比打撲克時你不可能知道其他人的牌是什么,一個道理。

但如果這個Client是個賭神呢?

  

http://www.securityfocus.com/bid/25348/discuss
根據(jù)安全機(jī)構(gòu)的研究,Linux內(nèi)核中包含了一個可導(dǎo)致Dos和權(quán)限提升的漏洞,可以被黑客利用來運(yùn)行攻擊代碼。這是一個核心內(nèi)存的堆棧溢出問題,可以導(dǎo)致系統(tǒng)的崩潰,再特定的環(huán)境下,還可以提升權(quán)限。這個漏洞影響到了Linux內(nèi)核2.6.22.3前的版本。

這是一個被爆出來的隨機(jī)數(shù)漏洞,如果我知道了服務(wù)端的隨機(jī)數(shù)漏洞,那么完全可以利用這一點(diǎn)來偽造出一個完美的假ip。

最后弱弱地總結(jié)下

那我們到底該相信哪個ip呢?

首選REMOTE_ADDR,因?yàn)殡m然有如此多地偽造方法,但在語言層面你只能選一個最可靠地。

如果你地服務(wù)隱藏在負(fù)載均衡或者緩存系統(tǒng)后面,它通常會給你發(fā)一個Client-Ip或者X-Forwarded-For的HTTP頭,告訴你跟它連接的客戶端ip,這時的HTTP_CLIENT_IPHTTP_X_FORWARDED_FOR是可信的,因?yàn)樗菑那岸朔?wù)器上的直接傳遞過來的,當(dāng)然你必須在程序中指定只信任這一個來源,而不要像最開始的代碼那樣每個都檢測一遍

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/11122.html

相關(guān)文章

  • 如何獲取可信賴的ip地址聊起

    摘要:這是一個被爆出來的隨機(jī)數(shù)漏洞,如果我知道了服務(wù)端的隨機(jī)數(shù)漏洞,那么完全可以利用這一點(diǎn)來偽造出一個完美的假。 原文:http://www.l4zy.com/posts/how-to-get-real-ip-address.html 起因 寫這篇文章緣起SF的一個問題 http://segmentfault.com/q/1010000000686700/a-10200000006871...

    W4n9Hu1 評論0 收藏0
  • 網(wǎng)絡(luò)協(xié)議及編碼

    摘要:協(xié)議族協(xié)議協(xié)議協(xié)議應(yīng)用程序通過套接字對協(xié)議和協(xié)議所提供的服務(wù)進(jìn)行訪問。網(wǎng)絡(luò)層完成將分組報文傳輸?shù)剿哪康牡?,即路由功能,一般采用協(xié)議。程序間達(dá)成的這種包含了信息交換的形式和意義的共識稱為協(xié)議。 TCP/IP協(xié)議族:IP協(xié)議、TCP協(xié)議、UDP協(xié)議 showImg(https://segmentfault.com/img/bVvwxE); 應(yīng)用程序通過套接字API對UPD協(xié)議和TCP協(xié)議...

    fizz 評論0 收藏0
  • ssh免密登錄服務(wù)器和scp的使用

    摘要:原理遠(yuǎn)程主機(jī)收到用戶的登錄請求,把自己的公鑰發(fā)給用戶。也就是說,要實(shí)現(xiàn)免密碼登入,首先要設(shè)置鑰匙。把公鑰放到遠(yuǎn)程服務(wù)器比如我的基本都安裝了,萬一沒有,上。TL;DR 本地登錄服務(wù)器 ssh user@remote -p port,端口是22的話ssh user@remote,退出登錄exit 本地免密碼登錄 ssh-copy-id user@remote -p port,這在寫腳本服務(wù)器控...

    Jochen 評論0 收藏0
  • 云計算漏洞風(fēng)險的識別與應(yīng)對措施

    摘要:相比之下,在年月進(jìn)行的一次調(diào)查中的中小型受訪企業(yè)表示,他們所使用的基于云計算的應(yīng)用程序的安全等級要高于他們在內(nèi)部實(shí)施的安全等級。 ?????? 在十年不到的時間里,云計算已從一個有趣的新概念發(fā)展成為業(yè)界的一大主流市場。業(yè)界對云計算未來的期望普遍較高,摩根士丹利預(yù)測Amazon網(wǎng)絡(luò)服 務(wù)(AWS)將在2022年突破二百四十億美元年收入的大關(guān)。當(dāng)然,任何單一一家供應(yīng)商云計算業(yè)務(wù)的成功都完全取決于...

    HackerShell 評論0 收藏0
  • 全球知名ssl證書品牌推薦:Symantec、DigiCert、Comodo、GeoTrust、Th

    摘要:全球可信的證書品牌有等。一品牌商家主要有哪些旗下年收購。。這個品牌的是目前全球知名的品牌之一,用的人和企業(yè)也不較多。ssl證書品牌有哪些值得推薦的呢?ssl證書是由CA機(jī)構(gòu)頒發(fā)的數(shù)字認(rèn)證證書,只要是合法的CA機(jī)構(gòu)比如Comodo、symantec、thawte、digicert這些都可以。 ? 目前,市場上可供選擇的SSL證書品牌很多,但并不是所有的品牌都值得信任。如果選擇了不可信的...

    GitChat 評論0 收藏0

發(fā)表評論

0條評論

wua_wua2012

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<