在不提供「檔案上傳」功能的網站中,**日誌注入(Log Injection)結合本地檔案包含(LFI, Local File Inclusion)**漏洞,是駭客最常使用的「無中生有」入侵手法。
這種攻擊的本質是:「雖然我不能上傳檔案,但我能逼你的伺服器幫我寫一個檔案。」
以下為您詳細拆解這個攻擊的原理與流程:
所有的網頁伺服器(如 Apache, Nginx)在有人訪問時,都會把訪問記錄寫入日誌檔(Log Files)。日誌內容通常長這樣:
- "GET /index.php HTTP/1.1" - User-Agent: Mozilla/5.0...
這裡面的 GET /index.php(網址)和 User-Agent(瀏覽器資訊),完全是由使用者(也就是駭客)可以任意控制的輸入內容。
駭客在你的練習網頁上,發現了一個可以讀取內部檔案的漏洞(通常是因為程式碼沒有過濾參數)。例如網址長這樣:http://your-site:8080/index.php?page=/etc/passwd如果畫面上真的顯示了系統密碼檔的內容,代表這個網頁有 LFI 漏洞。
因為網站沒有上傳功能,駭客故意對網站發送一個必定會失敗或特殊的請求,並把惡意程式碼(例如 PHP 的木馬後門程式)塞在網址或 User-Agent 欄位裡。
http://your-site:8080/<?php phpinfo(); ?>(網站會回應 404 找不到網頁)。<?php eval($_POST['cmd']); ?>。此時,伺服器的網頁程式雖然回應錯誤,但系統日誌(access.log)已經把這段 PHP 程式碼老老實實地寫進檔案裡了。
伺服器本身的 access.log 只是個純文字檔,放在那裡不會有事。但此時,駭客利用第一步發現的 LFI 漏洞,強迫網頁程式去讀取這個日誌檔:http://your-site:8080/index.php?page=/var/log/nginx/access.log
因為網頁程式(如 PHP 解析器)被叫去執行這個檔案,當它一行一行讀取日誌,讀到駭客剛剛寫入的 <?php eval($_POST['cmd']); ?> 時,這段代碼就會在伺服器背景被執行!