西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁(yè)西西教程操作系統(tǒng) → linux服務(wù)器并webbench攻擊解決方案:封鎖攻擊者ip

linux服務(wù)器并webbench攻擊解決方案:封鎖攻擊者ip

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2013/3/28 21:32:59字體大。A-A+

作者:西西點(diǎn)擊:0次評(píng)論:0次標(biāo)簽: linux服務(wù)器

  • 類型:服務(wù)器區(qū)大小:62.3M語(yǔ)言:中文 評(píng)分:5.0
  • 標(biāo)簽:
立即下載

首先我來(lái)說(shuō)一下這個(gè)被攻擊的網(wǎng)站的大概部署狀況.這個(gè)網(wǎng)站主要是nginx+mysql+php,有兩臺(tái)服務(wù)器分別放了web和數(shù)據(jù)庫(kù),web只對(duì)外開(kāi)啟了80端口操作系統(tǒng)是centos,而數(shù)據(jù)庫(kù)服務(wù)器則在內(nèi)網(wǎng),攻擊者的手段其實(shí)很簡(jiǎn)單,用webbench網(wǎng)站壓力測(cè)試工具發(fā)送大量的請(qǐng)求到服務(wù)器,之前的時(shí)候發(fā)送每一個(gè)請(qǐng)求之后數(shù)據(jù)庫(kù)就會(huì)相應(yīng),然后讀取內(nèi)容最終顯示,造成數(shù)據(jù)庫(kù)和web之間大量的交換數(shù)據(jù),甚至導(dǎo)致mysql達(dá)到連接數(shù)上限,請(qǐng)求被拒絕,而且攻擊者時(shí)間挺多的,他不停地?fù)Q浮動(dòng)ip,因此直接用防火墻封鎖ip沒(méi)意義.

剛開(kāi)始我的做法是,用php取得攻擊者的agent頭,判斷是不是webbench來(lái)訪,如果是就die掉,不在請(qǐng)求數(shù)據(jù)庫(kù),確實(shí)挺有效,數(shù)據(jù)庫(kù)不會(huì)再超出限制了,但是對(duì)方頻繁的發(fā)送請(qǐng)求過(guò)來(lái),導(dǎo)致網(wǎng)絡(luò)帶寬被嚴(yán)重消耗,看來(lái)得想想其他辦法,最終想到了一個(gè)解決方法且實(shí)際測(cè)試發(fā)現(xiàn)可行,因此分享給大家,其實(shí)我的做法原理很簡(jiǎn)單:用php取得用戶agent頭判斷是否是webbench來(lái)源,如果是的話就在服務(wù)器上寫(xiě)一個(gè)shell文件,這個(gè)文件的內(nèi)容就是封鎖IP的規(guī)則,

然后再用chmod函數(shù)修改一下這個(gè)文件讓其可執(zhí)行,再用cron服務(wù)讀取這個(gè)文件執(zhí)行,把ip封鎖掉,整個(gè)過(guò)程全部自動(dòng)化完成不需要人為干預(yù),另外在封鎖的時(shí)候給我發(fā)一封email通知我有個(gè)倒霉蛋被干掉了,這樣就行了.

具體實(shí)現(xiàn)代碼如下:

IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') {

    $_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']);

    IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) {

        $p='/home/www/webbench.sh';

        $_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow';

        <span style="color: #ff0000;">File_Put_Contents($p,"#!/bin/bash\niptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;\n",LOCK_EX);

</span>     Chmod($p,0755);

        chown($p,'www');

        <span style="color: #ff0000;">Function sMail($to,$tit,$msg) {

            IF(Filter_var($to,FILTER_VALIDATE_EMAIL)==''){

                throw new Exception('郵箱地址錯(cuò)誤!');

            }

            $tit='=?UTF-8?B?'.Base64_Encode($tit).'?=';

            $msg = str_replace("\n.","\n..",$msg);      //Windows如果在一行開(kāi)頭發(fā)現(xiàn)一個(gè)句號(hào)則會(huì)被刪掉,要避免此問(wèn)題將單個(gè)句號(hào)替換成兩個(gè)句號(hào)

            Return Mail($to,$tit,$msg,'From:No-reply@adm.bossadm.com.tw'."\n".'Content-Type:text/html;charset=utf-8');

        }

        sMail('see7di@gmail.com','【W(wǎng)ebBench又開(kāi)始了t】!',date('Y-m-d H:i:s',time())." {$_SERVER['REMOTE_ADDR']}");</span>

        Header('Location:http://127.0.0.1');

        Die();

    }

}

后來(lái)我又做了一次調(diào)整,把發(fā)email的部份寫(xiě)入了shell文件內(nèi),不再用php發(fā)email,因?yàn)槟菚?huì)灌爆你的信箱,把上邊的代碼修改成:

IF(isSet($_SERVER['HTTP_USER_AGENT']) And Trim($_SERVER['HTTP_USER_AGENT'])!='') {

    $_SERVER['HTTP_USER_AGENT']=StrToLower($_SERVER['HTTP_USER_AGENT']);

    IF(StriStr($_SERVER['HTTP_USER_AGENT'],'webbench')!==False) {

        $p='/home/www/webbench.sh';

        $_SERVER['REMOTE_ADDR']=isSet($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'unknow';

        File_Put_Contents($p,"#!/bin/bash\niptables -I INPUT -s {$_SERVER['REMOTE_ADDR']} -j DROP;\necho \"{$_SERVER['REMOTE_ADDR']} - `date`\" | mail -s \"WebBench-www.7di.net\" see7di@gmail.com\n",LOCK_EX);

        Chmod($p,0755);

        chown($p,'www');

        Header('Location:http://127.0.0.1');

        Die();

    }

}

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過(guò)難過(guò)
    • 5 囧
    • 3 圍觀圍觀
    • 2 無(wú)聊無(wú)聊

    熱門(mén)評(píng)論

    最新評(píng)論

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)