標籤:style width strong http 2014 檔案
一 什麼是webshell
“web”的含義是顯然需要伺服器開放web服務,“shell”的含義是取得對伺服器某種程度上操作許可權。webshell常常被稱為匿名使用者(入侵者)通過網站連接埠對網站伺服器的某種程度上操作的許可權。
簡單理解:webshell就是一個web的頁面,但是它的功能非常強大可以獲得一些管理員不希望你獲得的許可權,比如執行系統命令、刪除web頁面、修改首頁等。
webshell中由於需要完成一些特殊的功能就不可避免的用到一些特殊的函數,我們也就可以對著特徵值做檢查來定位webshell,同樣的webshell本身也會進行加密來躲避這種檢測。
二 webshell長什麼樣子
就是一張php webshell的,它的功能還是比較全的,如果你是網站管理員的話肯定是不希望普通使用者獲得下面的許可權的。
三 webshell檢測有哪些方法
如果你懷疑你的網站被人上傳了webshell或者你需要檢查一下需要上線的代碼中是否被嵌入了shell代碼,就需要對這些檔案進行掃描,那麼有哪些方法可以掃描出這些webshell呢?
下面列舉一下,也就是我們的webshell掃描工具中實現的功能。
1 求檔案的重合指數index of coincidence(縮寫為IC)
首先介紹一下什麼是IC?
IC是用來判斷檔案是否被加密的一種方法。它的計算公式是這樣的:
Σ(fi * (fi-1))/N(N-1) :fi 代表樣本中某個字母出現的比率,N代表字母出現在樣本中的個數
通過計算,我們可以得到以下兩個值:
english的IC值為0.0667,
english中一個完全隨機的字串的IC值為0.0385
那麼這兩個值有什麼意義呢?
簡單來說(english),
加密檔案的IC值接近0.0385
明文檔案的IC值接近0.0667
好了,那麼我們就可以計算每個檔案的IC值,如果這個檔案的IC值接近0.0385,那麼我們認為它是加密的,而一個web中加密的檔案一般就意味著它是個為了逃避檢測的webshell。
2 求資訊熵
資訊熵是一個數學上頗為抽象的概念,在這裡不妨把資訊熵理解成某種特定資訊的出現機率(離散隨機事件的出現機率)。一個系統越是有序,資訊熵就越低;反之,一個系統越是混亂,資訊熵就越高。資訊熵也可以說是系統有序化程度的一個度量。
熵是從整個集合的統計特性來考慮的,它從平均意義上來表徵信源的總體特徵,其公式為:
如果有一個系統S記憶體在多個事件S = {E1,…,En}, 每個事件的機率分布 P = {p1, …, pn},則每個事件本身的訊息為
Ie = ? log2pi
(對數以2為底,單位是位元(bit))
Ie = ? lnpi
(對數以e為底,單位是納特/nats)
如英語有26個字母,假如每個字母在文章中出現次數平均的話,每個字母的訊息量為
I_e = -\log_2 {1\over 26} = 4.7
而漢字常用的有2500個,假如每個漢字在文章中出現次數平均的話,每個漢字的資訊量為
I_e = -\log_2 {1\over 2500} = 11.3
整個系統的平均訊息量為
H_s = \sum_{i=1}^n p_i I_e = -\sum_{i=1}^n p_i \log_2 p_i
因此我們可以求每個檔案的資訊熵值,值越大,為webshell的可能性越高。
3、求檔案中的最長單詞
求一個檔案中的最長單詞是多長,比較異常的長單詞是很可疑的。如下面的第一位的有84070,毫無疑問他是加密後的一整串字串,極有可能是webshell
84070 /home/wwwroot/default/webshell/css.php
4、檔案的可壓縮比
檔案的壓縮比=壓縮檔後的大小/檔案的原始大小。
那麼什麼樣的檔案的壓縮比比較大呢?這就要說到壓縮演算法的本質:
壓縮的實質,在於消除特定字元分布上的不均衡,通過將短碼分配給高頻字元,而長碼對應低頻字元實現長度上的最佳化。
做了個簡單的實驗:將一個txt檔案中填充了一堆的a字元,總大小為345KB,用7z壓縮後為1K
那麼我們是否可以這樣理解,由base64編碼過的檔案,消除了非ascii的字元,這樣實際上base64編碼過的檔案的字元就會表現為更小的分布的不均衡,壓縮比就會變大。
5、特徵值匹配
這裡提到的特徵值匹配分為2個部分:第一個是匹配特徵函數和代碼,也就是說webshell中會用到的而一般檔案不會用到的函數和代碼。第二個是指匹配特定webshell中的特徵值。
第一種情況我們需要對這些函數和特徵代碼做整理,然後與檔案進行匹配。
第二種情況需要收集出現過的webshell,將其中的特徵碼提取出來。目前已知的庫位500個webshell的特徵庫,可以準確識別99%的已知的webshell。
6、檔案屬性
第一種:在web伺服器中,檔案一般的建立時間是幾種的,如果某些檔案的建立時間比較異常,那麼它就有可能是webshell。
第二種:在web攻擊過程中,有一種手法是利用mysql到出一句話木馬到web目錄中,那麼這個匯出的檔案有其特殊性,所有匯出的檔案的許可權都是666.那麼我可以這麼認定,許可權為666的檔案有可能是webshell。
四 樸素貝葉斯模型
以上幾種方法都有其準確率和誤判情況,經過測試,每個方法都能檢測出一部分webshell並且存在著一定程度的誤判,那麼如何將他們的檢測結果整合起來,來更準確的判定一個檔案是否webshell?
由於我們的檢測方法基本上是離散的,所以考慮使用樸素貝葉斯模型。
首先用數學語言描述一下我們的問題:
一個檔案的檢測結果有兩種:是webshell和不是wenshell。那麼檢測結果是webshell的機率我們用P(y=1)來表示,檢測結果不是webshell的機率我們用P(y=0)來表示。
假設我們的檢測方法有5種,那麼x = [x1,x2,x3,x4,x5].
假設我們檢測一個檔案後各個檢測方法的結果為:x1 = 1,x2=0,x3=0,x4=0,x5=1
那麼我們的目的是計算出P(y=1|x)和P(y=0|x)。也就是計算出該檔案是webshell和不是webshell的機率各是多少,機率更大的我們就做為最終結果。
下面我們推演一下:
首先是貝葉斯公式為:
那麼我們需要的P(y=1|x)為:
由於P(y=1|x)和P(y=0|x)中的分母都是一樣的,所以我們只要求出分子進行比較,那個值比較大就取那個值。
現在我們未知的值為p(x1=1|y=1),p(x2=0|y=1),p(x3=0|y=1),p(x4=0|y=1),p(x5=1|y=1),p(y=1)
這些值應該如何得到呢?
首先我們需要一個樣本,樣本中大量的web檔案,其中混有各種webshell,這些標籤我們是可以確定的,那麼下面我們要做的就是利用程式對這些樣本進行檢測,根據檢測結果計算出我們需要的值,比如:
p(x1=0|y=1):它代表的意思就是檢測的檔案是webshell,利用x1檢測方法的檢測結果為0(不是webshell)
如果結果為P(y=1|x)>P(y=0|x),我們就判定該檔案是webshell