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)
暂无评论,来发表第一条吧