最近客戶的網站,被駭客攻擊,網站被綁架。緊急救援的結果,發現客戶的主機上有不少惡意檔案。
而且檔案還偽裝成圖檔。駭客做了惡意內容的 php 檔案,但副檔名改用 .jpg,在創建一個 .php 做引入。混在大量圖檔內根本難以發現。
<?php // 引入惡意的 php 檔案 include("2.jpg"); ?>
一但有了一次攻擊,就要幾乎把整個網站翻遍尋找惡意的程式。只要有遺漏,他還是可以透過先前留下的惡意檔案繼續感染。為了避免這樣的情形,必須有效的增加防守的範圍。
如果有使用 Apache 主機,大家對這樣的畫面不陌生吧,只要不做 index 檔案,所有的資料一覽無遺。
改寫的基本邏輯可以參考這篇:
Apache Rewrite with Htaccess 理解與技巧
節錄重點,編寫邏輯使用標準表達式:
RewriteRule [match_uri] [rewrite_uri] [flags]
常用 flags:
[L]:Last,代表成功執行這個 Rule 後就會停止,不繼續往下執行。
[NC]:Non Case-sensitive,代表 match_uri 不比對大小寫差異。
[QSA]:Query String Append,代表保留網址尾端帶的 GET 參數,沒使用 flag 的預設是會把參數去掉的。
[QSD]:Query String Discard,與 QSA 相反的作用,apache v2.4 才有。
[R]: Redirect,代表用轉址的方式轉到新的網址,預設是 302 Status Code,如:[R=301],也可以回傳 400、200、404 等的 Status Code,通常會跟 [L] 一起代表結束,也是除錯常用的 Flag
[DPI]: 不要再接續的 Rule 中結尾中加上 PathInfo,會在「五、一些小特性」的段落說明。
[F]: Forbdien 就是不給看啦!※ more flags: http://httpd.apache.org/docs/2.4/rewrite/flags.html
以下使用 .htaccess 來加強防範
# .htaccess 放在網站根目錄,所有的資料夾目錄都會變成 403
# disable directory browsing
Options All -Indexes
只允許訪問圖檔和影片檔,可以避免從外部觸發惡意程式,允許類別外的檔案都會變成 403 error:
# 放在作用的資料夾,例如 /images/
Order deny,allow
Deny from all
<Files ~ ".(svg|mp4|jpe?g|png|gif|js)$">
Allow from all
</Files>
不讓前端訪問某個資料夾。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# 所有 inc/ 內的檔案變成 forbidden
RewriteRule ^inc/ - [F,L]
# 只允許前端訪問 js 資料夾的 .js
RewriteRule ^js/[a-zA-Z0-9]+\.(?!js$) - [F,L]
</IfModule>