XOOPS 網站的 uploads 是各模組存放圖片、附件等檔案的地方。早期站台有時把目錄權限設為 777;若模組的前端上傳檢查不夠嚴謹,攻擊者便可能把 PHP 木馬混進來,再從網址呼叫木馬,讓後續污染擴大。
替 uploads 加一道 Apache 的 <Directory> 防線,就能讓圖片、附件照常上傳與讀取,卻不讓 uploads 及其子目錄內的 PHP 類檔案透過 HTTP 執行。若攻擊鏈是「上傳 PHP 木馬 → 呼叫木馬網址 → 擴散」,請求在第二步就會收到 403,鏈路因此中斷。這是很實用的止血補強,但不能代替上傳檢查、漏洞修補與清除已植入的檔案;新站也不要因為有這道鎖,就把 uploads 預設設為 777。
設定步驟
1. 到 /etc/apache2/sites-available/ 找出目前網站正在使用的設定檔,例如 000-default-le-ssl.conf;各站檔名不同,不能隨便挑一份 .conf。不確定時先執行 sudo apache2ctl -S 查看啟用的 vhost,並備份要修改的設定檔。
2. 確認網站實際的 uploads 路徑。在該網站的 <VirtualHost *:443> 區塊內加入下列設定。以下 /var/www/html/uploads 只是範例,現場路徑不同就要修改。
<Directory "/var/www/html/uploads">
AllowOverride None
Options -Indexes
<FilesMatch "(?i:\.(?:php[0-9]*|phtml|pht|phtm|phar)(?:\.|$))">
Require all denied
</FilesMatch>
</Directory>
<Directory> 會涵蓋 uploads 和所有子目錄;<FilesMatch> 會擋常見 PHP 類副檔名、大小寫變化與 .php.jpg 這類多重副檔名。AllowOverride None 會讓此目錄下的 .htaccess 失效;如果原本有其他功能仰賴它,套用前先確認。HTTP *:80 若可直接提供檔案,也要在對應 vhost 加上同一段;若只負責轉向 HTTPS,則確認最終 HTTPS 請求回 403
3. 先檢查語法,看到 Syntax OK 才重載 Apache:
bash
sudo apache2ctl configtest
sudo systemctl reload apache2
現場驗證
在 uploads 頂層及一個子目錄,各放一支無害的測試檔 test.php:
php
<?php
echo "Hello world";
直接開啟測試網址,並分別測 GET、POST。套用防護後,兩個位置的 PHP 請求都應回 403,不能看到 Hello world;同時確認正常圖片可讀、附件及上傳功能仍可使用。測完立即刪除測試檔,不要把真正木馬放回公開目錄測試,這樣就完成Ubuntu阻擋uploads目錄內PHP腳本的HTTP存取設定工作。
工作心得撰寫:徐嘉裕 Neil hsu
留言
張貼留言