LFI + Log Poisoning 的航行之旅 - 不只是 RCE
前言
一個奇怪的夢境
說來也奇妙,今天夢到自己被飛船接走了 o.o
醒來後說不上來的精力充沛 @@ 直覺要我繼續去寫部落格跟學資安(?)
![]() |
感謝 canva AI 產圖 |
最近我一直在探索自己的使命(?),同時也持續挑戰 OSCP Lab 👾
在閱讀「Common Web Attacks」的時候,無意間接觸到了「日誌中毒(Log Poisoning)」這個概念,讓我忍不住想更深入了解:
為什麼我們僅僅透過修改 HTTP Header,就可以污染伺服器的 log,甚至讓它被當成程式碼執行呢?
📋 一個簡單的日誌中毒 - Log Poisoning
先從簡單的攻擊前兆來看~
我們先來了解何謂 Log Poisoning 以及它的攻擊流程。
何謂 Log Poisoning?
用一句話簡單說明,就是:
Log Poisoning 就是把壞東西藏在日誌裡,再想辦法讓伺服器自己去讀它並執行。
Log Poisoning 攻擊流程
以 Apache 為例:
Apache 的 access.log 會自動記錄每次請求的資訊,只要有欄位是使用者可控的(例如 User-Agent, Referer, Request URL),我們就可以把壞壞的程式碼藏進去。
當我們可以把壞壞的程式碼放進 Apache 的 access.log 之後,接下來的目標就是...
找到一個有 LFI(Local File Inclusion)漏洞的入口點,並且包含這份被污染的 log 檔案,讓其中的惡意程式碼被伺服器「執行」而不是單純「顯示」。
我們在這邊提到了「LFI」,也就是所謂的「本機檔案包含漏洞(Local File Inclusion)」。
LFI - Log File Inclusion 本機檔案包含漏洞 💣
LFI 是一種常見的 Web 安全漏洞,攻擊者通常會透過修改 URL 中的參數,使伺服器包含任意路徑下的檔案,甚至是系統內部的敏感檔案。
舉例來說,如果一個網站有這樣的一段 PHP 程式碼:
<?php $page = $_GET['page']; include($page); ?>
在關鍵操作中,把使用者輸入直接全盤接收,然後拿去使用了 OAQ
備註:所以讀到這邊的讀者應該不難發現,什麼是糟糕的實踐方式了吧 ><
好了,接下來問題來了,我可以改這個參數值,然後可以執行檔案... 啊可以幹嘛?
然後呢?可以拿來幹嘛?
還記得我們先前可以修改一些 HTTP Header,然後讓他被寫進 access.log 裡嗎~
這時候,我們就可以:
試試看剛剛寫進 access.log 的資料能否被執行!
結合以上,我們可以怎麼做呢?
1. 修改 User-Agent,改成如下:
<?php echo system($_GET['cat']); ?>
system(ls)如果指令能成功被執行,基本上我們就成功了~
在使用任何與指令相關的函數,都要格外小心啊!
當然,除了指令相關,還有指令、SQL 相關操作等等都是 👀
身為開發者,我們可以這樣做:💪
1. 不要直接使用來自用戶的輸入,可以選擇:白名單(只能選某些值)、嚴格驗證 + 過濾 。
2. 開啟錯誤日誌記錄,但不要在網頁顯示詳細錯誤,避免讓攻擊者藉由錯誤訊息猜出內部結構。
3. 移除 production 環境中不需要的函式,以 PHP 為例,像是: exec、shell_exec、system、passthru、eval 等。
4. 為網頁增加 Web Application Firewall(WAF) 幫助攔截常見惡意請求,像是 ../../、<script> 等敏感特徵。
參考資料
PortSwigger Lab: https://portswigger.net/web-security/file-path-traversal/lab-simple
OWASP Top 10 Cheat Sheets: https://cheatsheetseries.owasp.org/IndexTopTen.html
留言
張貼留言