
本文面向开发者与安全学习者,介绍在可控实验环境中通过构造 union-based sql 注入绕过简单登录验证的原理与方法,强调仅限合法授权测试,并同步提供修复方案。
本文面向开发者与安全学习者,介绍在可控实验环境中通过构造 union-based sql 注入绕过简单登录验证的原理与方法,强调仅限合法授权测试,并同步提供修复方案。
在本地搭建的 PHP 登录系统中,若后端未对用户输入做任何过滤或参数化处理,攻击者可通过精心构造的恶意输入篡改 SQL 查询逻辑。您提供的代码存在典型的一阶、无过滤字符串拼接漏洞:
$query = "SELECT username,password from utenti where username='" . $_POST['user'] . "';";
该语句直接将 $_POST['user'] 拼入查询,使攻击者可闭合单引号并注入任意 SQL 片段。
✅ 合法演示:绕过密码校验(仅限授权环境)
为达成“无需密码登录”目标,可利用 UNION ALL 注入伪造结果集,使查询返回任意用户名 + 空密码组合,从而满足后续 PHP 的明文比对逻辑($row['password'] == $_POST['pass']):
推荐测试 Payload(用户名字段输入):
' UNION ALL SELECT username, '' FROM utenti WHERE ''='
执行后实际生成的 SQL 为:
SELECT username,password FROM utenti WHERE username='' UNION ALL SELECT username, '' FROM utenti WHERE ''='';
✅ 效果说明:
- 第一部分 WHERE username='' 返回空结果;
- UNION ALL 后部分返回表中所有 username,且 password 字段恒为空字符串 '';
- 当您在密码框中也提交空值(或任意值,因 PHP 比对的是 $_POST['pass']),即可触发 if ($row['password'] == $_POST['pass']) 成立,进入后台页面。
⚠️ 重要提醒:此操作仅允许在您完全拥有权限的本地/测试环境执行。对非授权系统实施此类操作违反《网络安全法》及各国计算机犯罪相关法律,属违法行为。
? 正确修复方案(立即应用)
绝对禁止字符串拼接 SQL!应采用以下任一安全方式:
-
首选:预处理语句(Prepared Statements)
$stmt = $link->prepare("SELECT username, password FROM utenti WHERE username = ?"); $stmt->bind_param("s", $_POST['user']); $stmt->execute(); $result = $stmt->get_result(); -
辅助加固:输入验证 + 密码哈希校验
- 使用 password_verify() 替代明文比对;
- 对用户名进行正则过滤(如 /^[a-zA-Z0-9_]{3,20}$/);
- 移除 @ 抑制符,启用错误日志而非暴露敏感信息。
-
纵深防御
- 数据库账户最小权限原则(如登录模块仅授予 SELECT 权限);
- 启用 WAF 规则拦截常见注入特征(如 UNION SELECT、' OR '1'='1);
- 定期使用 OWASP ZAP 或 sqlmap --risk=1 进行合规性扫描。
安全不是功能的附加项,而是系统设计的第一原则。每一次成功的漏洞复现,都应导向一次更健壮的代码重构。










