某公司內部 7 台 CentOS 伺服器,各擁固定公網 IP,雙網卡 (公網 + 內網),前端由硬體防火牆統一分發流量,**僅對外開放 80 連接埠**,其餘全部封鎖。SSH 管理採用「跳板機」模式:先連線內網 Windows 跳板機,再經由 SSH 連線各 Linux 主機,且每台主機 iptables 僅允許跳板機內網 IP 存取 SSH (22 連接埠)。
/admin、/phpmyadmin、/backup、/config 等敏感路徑,尋找洩漏檔案或後台入口。此類攻擊均走 HTTP (80 連接埠),若不攔截將導致 500/502 錯誤、服務中斷。
核心邏輯:PHP 即時分析請求特徵 → 符合封鎖條件 → 寫入 Shell 腳本 → Crontab 以 Root 權限執行 iptables 封鎖 → 郵件通知管理員。
<?php
/**
* 自動封鎖惡意 IP 機制
* 部署步驟:
* 1. 將此代碼放入專案全域 require 的配置檔 (如 common.inc.php)
* 2. 建立可寫入的 shell 腳本路徑 /home/wwwroot/bossAdm_Web/webbench.sh
* 3. crontab -e 加入:*/1 * * * * root /home/wwwroot/bossAdm_Web/webbench.sh
* 4. service crond restart
*/
// --- 封鎖 WebBench 壓測工具 ---
if (isset($_SERVER['HTTP_USER_AGENT'])) {
$ua = strtolower(trim($_SERVER['HTTP_USER_AGENT']));
if (stripos($ua, 'webbench') !== false && !empty($_SERVER['REMOTE_ADDR'])) {
doLock($_SERVER['REMOTE_ADDR']);
exit('Forbidden');
}
}
// --- 封鎖敏感路徑掃描 (建議放在自定義 404.php,並配置 Apache ErrorDocument 404 /404.php) ---
$sensitive_paths = [
'/admin', '/sign', '/reg', '/tiki-', '/join', '/config', '/backup', '/www',
'/manage', '/password', '/install', '/phpmyadmin', '/webadmin', '/inc',
'/user', '/upload', '/setup', '/sys', '/cert'
];
if (isset($_SERVER['REQUEST_URI'])) {
$uri = strtolower($_SERVER['REQUEST_URI']);
foreach ($sensitive_paths as $path) {
if (stripos($uri, $path) !== false) {
doLock($_SERVER['REMOTE_ADDR']);
exit('Forbidden');
}
}
}
/**
* 執行封鎖:寫入 shell 腳本,由 crontab root 執行 iptables
*/
function doLock(string $ip): void {
$script = '/home/wwwroot/bossAdm_Web/webbench.sh';
$cmd = "#!/bin/bash\n";
$cmd .= "iptables -I INPUT -s {$ip} -j DROP;\n";
$cmd .= "echo \"{$ip} - \" `date` \" | mail -s \"Auto-Block Alert\" admin@example.com;\n";
$cmd .= "cat /dev/null > {$script};"; // 執行後自我清空,避免重複執行
file_put_contents($script, $cmd, LOCK_EX);
chmod($script, 0755);
chown($script, 'www'); // 確保 www 用戶可寫入,root 可執行
}
?>
webbench.sh 由 PHP 動態生成,內容如上。Crontab 每分鐘檢查並執行:
# /etc/crontab
*/1 * * * * root /home/wwwroot/bossAdm_Web/webbench.sh
原理: PHP 無權直接執行 iptables (需 root),故寫入腳本,由已具 root 權限的 Crontab 定期執行,實現權限提升與解耦。
伺服器需安裝 mailx 或 postfix 並配置 SMTP 轉發,確保 mail -s "Subject" admin@example.com 能正常發送。
作者採用「一次性開放 3389 (RDP)」設計:
全程約 1 分鐘,極大縮小暴露面。