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);
?>

接著,我們仔細看這段程式碼做了啥~


1. $_GET['page']: 

從網址列取得一個叫 page 的參數,例如使用者輸入網址:http://example.com/index.php?page=about.php 那麼 $page 的值就會是 "about.php"。 


2. include($page): 

PHP 會試圖載入 $page 所代表的檔案,然後把裡面的程式碼當作目前這支程式的一部分執行。


其實簡單來說,就是:

在關鍵操作中,把使用者輸入直接全盤接收,然後拿去使用了 OAQ


備註:所以讀到這邊的讀者應該不難發現,什麼是糟糕的實踐方式了吧 ><

 

好了,接下來問題來了,我可以改這個參數值,然後可以執行檔案... 啊可以幹嘛?



然後呢?可以拿來幹嘛?


還記得我們先前可以修改一些 HTTP Header,然後讓他被寫進 access.log 裡嗎~


這時候,我們就可以:


試試看剛剛寫進 access.log 的資料能否被執行!



結合以上,我們可以怎麼做呢? 


1. 修改 User-Agent,改成如下:

<?php
echo system($_GET['cat']);
?>


2. 根據先前的範例,我們可以嘗試改一下 Url:

http://example.com/index.php?page=../../../../var/log/apache2/access.log&cat=ls


3. 如果成功執行,以下的程式碼就會被執行:
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

留言

這個網誌中的熱門文章

資安基礎惡補 - 網路篇 - DNS

SSL/TLS 協定知多少 - 基礎篇

About Me - 關於我的一切