$sql = "SELECT * FROM users WHERE username='$name' AND password='$pwd'";
$query = mysql_query($sql);
if (mysql_fetch_array($query)) {
header('Location: manager.php'); // 登錄成功跳轉
}
無任何過濾,直接拼接參數。
輸入:
username: ' OR 1=1#
password: 任意
拼接後 SQL:
SELECT * FROM users WHERE username='' OR 1=1#' AND password='xxx'
# 為 MySQL 註釋符,後內容被忽略;1=1 恆真,WHERE 子句永遠成立;SELECT * FROM users,返回第一行(通常是管理員),直接登入後台。原始 SQL 中參數被單引號包裹:username='$name'。攻擊者輸入的 ' 閉合前引號,OR 1=1 注入新邏輯,# 註釋掉尾部殘留引號與密碼條件。
若 magic_quotes_gpc=On,單引號被轉義為 \',上述 Payload 失效。但數字型參數無引號包裹仍可繞過:
$sql = "SELECT * FROM users WHERE uid=$uid"; // 無引號
-- 攻擊:uid=1 OR 1=1
intval(),字符串 mysqli_real_escape_string();SELECT/INSERT/UPDATE,無 DROP/FILE/GRANT。
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->execute([$_POST['username'], $_POST['password']]);
if ($stmt->fetch()) { /* 登錄成功 */ }
本文旨在幫助開發者理解注入原理以編寫安全代碼,嚴禁用於非授權滲透測試。