天天看點

由伺服器IP判斷說起的攻防——站長安全顧問系列話題一

來自黑客防線 

前兩天有個自己買伺服器建站的朋友遇到了麻煩,找我幫忙處理些問題。在整個過程中我感覺有些實用的價值,于是發出來和廣大伺服器管理者朋友們一起讨論讨論,也希望各位朋友将自己遇到的問題發表出來,一起讨論。

該朋友的伺服器腳本系統是自己寫的,又有電子商務的支付平台,是以在針對安全方面,他花了些力氣,做了一些防護,大體是這樣的:

腳本攻擊尋常的手段有三個:

第一是利用注入,找到管理者密碼,然後登陸背景,再通過修改上傳格式的方式,獲得webshell,進而考慮提權,獲得伺服器控制權限。

第二是通過下載下傳資料之類的辦法,找管理者帳戶,再登陸、修改、上傳、提權。

第三是直接找上傳漏洞,跳過注入、背景擷取這一步,直接拿到webshell。

針對這三個方面,朋友的應對政策是這樣的:

針對第一種攻擊:卡死注入!方法當然大同小異:代碼稽核、防注入系統。這是常見手法。

針對第二種攻擊:使用SQL資料庫,不在web目錄,當然下載下傳資料庫是沒有辦法的。也是常見手法。

針對第三種攻擊:嚴格審計上傳。網站設定成可以上傳,但是上傳檔案類型有限制,IIS解析也隻解析正常檔案類型,最後再給上傳目錄做一個不能讓腳本運作的權限,簡單搞定。也不希奇。

或許很多伺服器管理者會說:這些我們都做了,但是不排除出現特殊情況,比如腳本系統的注入0day,當遇到這樣的情況的時候,以上三點防護可能就沒有用了,這時候我們該如何應對?——正好,這個朋友就遇到了這樣的問題。不知道為什麼,他的系統在防護後,還是被注入了。搞他站的人,也不做破壞,更不動他的支付平台,就時不時的登陸一下他的管理背景,寫上一句“某某到此一遊……”,人都能氣死。

遇到這個情況以後,朋友修改了自己的系統,除了做更加嚴格的防禦外沒有别的辦法,是以才找上我。

知道這個事後,我也沒認真問情況,随手丢了一套IP判斷的腳本給他。這套腳本的功能主要是用來判斷來訪IP,同時對提前定義的信任IP進行比對稽核,如果來訪IP是信任IP,則正常打開,如果不是則跳轉到其他頁面。

程式大體是這樣的:

number.inc檔案内容:

<!--#include file="ip.inc"-->

<%

        sip1=split(ip1,".")

        num1=cint(sip1(0))*256*256*256+cint(sip1(1))*256*256+cint(sip1(2))*256+cint(sip1(3))-1

        sip2=split(ip2,".")

        num2=cint(sip2(0))*256*256*256+cint(sip2(1))*256*256+cint(sip2(2))*256+cint(sip2(3))-1

        sip3=split(ip3,".")

        num3=cint(sip3(0))*256*256*256+cint(sip3(1))*256*256+cint(sip3(2))*256+cint(sip3(3))-1

        sip4=split(ip4,".")

        num4=cint(sip4(0))*256*256*256+cint(sip4(1))*256*256+cint(sip4(2))*256+cint(sip4(3))-1

        sip5=split(ip5,".")

        num5=cint(sip5(0))*256*256*256+cint(sip5(1))*256*256+cint(sip5(2))*256+cint(sip5(3))-1

        sip6=split(ip6,".")

        num6=cint(sip6(0))*256*256*256+cint(sip6(1))*256*256+cint(sip6(2))*256+cint(sip6(3))-1

        sip7=split(ip7,".")

        num7=cint(sip7(0))*256*256*256+cint(sip7(1))*256*256+cint(sip7(2))*256+cint(sip7(3))-1

        sip8=split(ip8,".")

        num8=cint(sip8(0))*256*256*256+cint(sip8(1))*256*256+cint(sip8(2))*256+cint(sip8(3))-1

%>

banip.inc檔案内容:

<!--#include file="number.inc"-->

        ip=request.servervariables("remote_addr")

        sip=split(ip,".")

        num=cint(sip(0))*256*256*256+cint(sip(1))*256*256+cint(sip(2))*256+cint(sip(3))-1

        if  ((num=num1) or (num=num2) or (num=num3) or (num=num4) or (num=num5) or (num=num6) or (num=num7) or (num=num8) or (num=num9)) then

        else

        response.redirect "http://www.hacker.com.cn/"

        end if

ip.inc檔案内容:

ip1="*.*.*.*"

ip2="*.*.*.*"

ip3="*.*.*.*"

ip4="*.*.*.*"

ip5="*.*.*.*"

ip6="*.*.*.*"

ip7="*.*.*.*"

ip8="*.*.*.*"

ip9="*.*.*.*"

ip10="*.*.*.*"

其中IP.inc檔案中可定義信任IP,定義好了,再在需要IP稽核的頁面,調用此系統就可以。效果是如果不是信任IP,則跳轉到我們提前定義的頁面。

安穩了幾天,這個朋友又來找我,說再次被搞了,而且通過日志和相關痕迹,很确定依然是通過背景進來,又寫上了“某某到此一遊……”。聽到這個我倒是很開心,畢竟這套系統不是那麼好突破的,突破了就說明挺強——根據以前測試的結果,這套系統除了通過修改資料包,進行IP欺騙以外,沒有别的辦法可以突破。

模拟一下入侵的過程:

入侵者利用原來的系統裡的記錄,找到至少一個信任IP(資料庫、日志等地方都可能洩露admin的ip),然後打開背景管理頁面,用資料包修改工具,直接修改資料標頭,讓伺服器的腳本判斷失誤,認為入侵者來自信任IP,進而正常登陸背景,潇灑的留言後走人……

挺好,這個入侵者很有意思,技術也不錯,至少資料收集、注入、抓包、上傳是沒得說。

我來了興趣,連上了朋友伺服器,用bak的腳本檔案恢複成幹淨狀态,然後取消了IP判斷系統,用了一下IIS設定——其實有一個方式是大家忽略的,很簡單,卻很實用,那就是IIS的通路控制政策。

我們可以設定背景隻允許某一個、幾個IP通路,非授權IP是沒有使用背景的權限的,這樣不管怎麼注入,不管拿到了多麼進階的背景帳戶和密碼,注入都将一無用處!而這個方法,是IIS層面上的,不是腳本上的,安全性要高得多。

抓幾個簡單的圖,IIS的通路控制清單設定在這裡:

相信這幾步大家肯定都能看明白,隻是平時有可能忽略了而已。設定上這個以後,該伺服器直到現在都是安穩的,看來起了一點點效果。

好了,整體過程就是這樣,抛出的磚頭是:第一次我用的IP判斷腳本系統,有沒有其他辦法可以突破?第二次我用的IIS的IP判斷系統,能不能突破?怎麼突破?

希望有思路或者經曆過的朋友,都來參與讨論一下,引來幾個玉,讓我們也提升一把!=。=