简介:本文详细解析SQL注入攻击的原理、分类及实战测评方法,通过真实案例演示注入过程,并提供防御策略与工具推荐,帮助开发者提升系统安全性。
SQL注入(SQL Injection)是Web应用中最常见的安全漏洞之一,攻击者通过在用户输入中插入恶意SQL代码,篡改数据库查询逻辑,从而获取、修改或删除敏感数据。其本质是未对用户输入进行充分过滤或参数化处理,导致SQL语句被恶意拼接。
假设一个登录系统使用以下SQL查询验证用户:
SELECT * FROM users WHERE username = '$username' AND password = '$password';
若攻击者输入username=admin' --,密码任意,则SQL变为:
SELECT * FROM users WHERE username = 'admin' --' AND password = '...';
--是SQL注释符,后续条件被忽略,攻击者直接以admin身份登录。
DROP TABLE users;)。根据攻击方式,SQL注入可分为以下几类,每种需采用不同的测评方法。
原理:通过构造错误输入,观察数据库报错信息获取结构。
示例:
admin',若返回You have an error in your SQL syntax,说明存在注入点。admin' AND 1=CONVERT(int, (SELECT @@version))--,通过错误信息获取数据库版本。测评步骤:
',观察是否返回数据库错误。AND 1=1(正常)和AND 1=2(异常)验证注入点。原理:通过页面返回的True/False差异推断数据。
示例:
admin' AND LEN(DB_NAME())>5--admin' AND ASCII(SUBSTRING(DB_NAME(),1,1))>97--测评工具:
--technique B参数进行布尔盲注。原理:通过延迟响应判断条件真假。
示例:
admin' AND IF(1=1, SLEEP(5), 0)-- # 延迟5秒返回admin' AND IF(SUBSTRING((SELECT password FROM users LIMIT 1),1,1)='a', SLEEP(5), 0)--
适用场景:当错误信息被隐藏时(如仅返回“用户不存在”)。
原理:利用UNION合并多个查询结果获取数据。
步骤:
ORDER BY 1--逐步增加数字,直到页面报错。admin' UNION SELECT 1,2,3--,观察哪些列显示在页面上。admin' UNION SELECT null,username,password FROM users--注意事项:
NULL填充不显示的列。curl或wget构造恶意请求。功能:自动检测、利用SQL注入漏洞。
常用命令:
sqlmap -u "http://example.com/login" --data="user=admin&pass=test" --level=5 --risk=3sqlmap -u "http://example.com/id?id=1" --technique=BEU --dump
参数说明:
--level:检测深度(1-5)。--risk:风险等级(1-3,越高越可能破坏数据)。--technique:指定注入技术(B-布尔,E-错误,U-联合查询等)。流程:
admin'*。admin' AND ${payload}。SQLi类型的Payload列表进行测试。
$username = mysqli_real_escape_string($conn, $_POST['username']);$password = hash('sha256', $_POST['password']); // 密码哈希存储
原理:将SQL语句与数据分离,避免拼接。
示例(Python):
import pymysqlconn = pymysql.connect(host='localhost', user='root', password='', db='test')cursor = conn.cursor()username = "admin"password = "test"# 安全方式:参数化查询cursor.execute("SELECT * FROM users WHERE username = %s AND password = %s", (username, password))
root或sa等高权限账户。漏洞:订单查询接口未过滤order_id参数。
攻击:输入1 OR 1=1获取所有订单,修改price字段。
修复:改用参数化查询,限制order_id为数字。
漏洞:登录页面存在时间盲注。
攻击:通过SLEEP(5)逐字符提取管理员密码。
修复:启用错误日志隐藏,部署WAF拦截异常请求。
通过系统化的测评与防御,可显著降低SQL注入风险,保护企业数据安全。