[HOME] 首页 [DASH] 仪表盘 [ATK] 攻击模拟 [RES] 资源库 [DOC] 术语表 [TEST] 安全测验 [MSG] 留言板 [ADMIN] 管理后台 [USER] 登录 / 注册

SQL 注入:从原理到实战绕过技术

SQL 注入概述


SQL 注入(SQL Injection)是一种将恶意 SQL 代码插入到应用程序查询语句中的攻击技术。当应用程序对用户输入处理不当时,攻击者可以操纵数据库查询,获取未授权数据,甚至删除整个数据库。


原理详解


假设一个 PHP 登录查询:


// 存在漏洞的代码
$sql = "SELECT * FROM users WHERE username='".$username."' AND password='".$password."'";

正常输入:username=admin, password=123 → 查询正常执行


恶意输入:username=admin'-- , password=anything
→ 实际执行:SELECT * FROM users WHERE username='admin'-- ' AND password='anything'
→ -- 后的内容被注释掉,密码验证被绕过!


实战绕过技术


1. 注释符绕过


  • -- (注意空格)

  • #

  • / /


2. 逻辑绕过


  • ' OR '1'='1

  • ' OR 1=1--


3. UNION 注入


利用 UNION 联合查询获取其他表的数据:
admin UNION SELECT username,password FROM users--

4. 宽字节注入


利用 MySQL 的字符集特性,绕过 addslashes() 过滤:
  • 输入:%df' or 1=1--

  • 产生:運' or 1=1--(吃掉反斜杠)


防御措施


1. 使用预处理语句(Prepared Statements):参数化查询,代码与数据分离
2. 输入验证:白名单验证输入格式
3. 最小权限原则:数据库账户只授予必要的权限
4. 错误信息处理:生产环境关闭详细错误信息
5. WAF:使用 Web 应用防火墙进行辅助防护


// 安全写法(PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stmt->execute([$username, $password]);

MSG 评论 (0)

暂无评论,来发表第一条吧