php注入漏洞主要分为sql注入、命令注入和文件包含等类型,其中sql注入最为常见。区分union查询、盲注和报错注入的关键在于观察应用程序对数据库查询结果的反馈方式:union注入利用select语句拼接直接获取数据;盲注通过布尔值或时间延迟间接推断数据;报错注入则利用数据库错误信息泄露数据。

Union注入如何直接提取数据
Union注入适用于页面能正常显示查询结果的情况。攻击者通过构造特殊的输入,使原始查询与一个额外的SELECT语句结合,从而从其他表中提取数据。这种方法要求两个SELECT语句的列数相同,且数据类型兼容。

$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $sql);
while($row = mysqli_fetch_assoc($result)) {
echo $row['username'] . "<br>";
}
当输入为 1 UNION SELECT 1, username, password FROM admin-- - 时,如果程序未做过滤,将直接返回管理员的用户名和密码。前提是知道表结构和列数。
盲注如何通过逻辑判断获取数据
盲注适用于页面不直接显示数据库查询结果,但会根据查询真假返回不同内容(如成功/失败页面)或产生时间延迟的情况。它分为基于布尔值的盲注和基于时间的盲注。攻击者需要逐位猜测数据,效率较低但隐蔽性强。

$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
echo "User exists";
} else {
echo "User not found";
}
当输入为 1 AND SUBSTRING(password, 1, 1) = 'a' 时,如果返回“User exists”,说明密码第一位是'a';否则不是。通过不断调整字符,可以逐步还原出完整数据。
报错注入如何利用错误信息泄露数据
报错注入适用于页面不直接显示查询结果,但会显示详细的数据库错误信息的情况。攻击者通过构造特殊的输入,使数据库执行某些操作并返回错误信息,从而泄露数据。常见的报错注入函数包括 EXTRACTVALUE() 和 UPDATEXML()。
当输入为 1 AND EXTRACTVALUE(1, CONCAT(0x7e, (SELECT password FROM users LIMIT 1))) 时,如果数据库支持且配置允许,将返回类似 “XPATH syntax error: '~password_value~'” 的错误信息,从而泄露密码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











