什么是 SQL 注入?
- SQL 注入(SQL Injection, SQLi) 是指应用没有正确处理用户输入,攻击者可以构造恶意 SQL 语句,直接与数据库交互。
-
危害:
- 窃取用户数据(用户名、密码、邮箱)。
- 绕过登录验证。
- 修改/删除数据库内容。
- 甚至拿下服务器权限。
经典示例
一个登录逻辑:
SELECT * FROM users WHERE username = 'admin' AND password = '123456';
如果没有过滤输入,攻击者输入:
用户名: admin
密码: ' OR '1'='1
SQL 语句变成:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
结果:'1'='1' 永远为真,绕过验证,直接登录成功。
防御措施
- 使用预编译语句(Prepared Statements)
- 例如 Python
sqlite3或MySQLdb中的参数化查询。
- 例如 Python
- 输入过滤和转义
- 对用户输入严格检查。
- 最小权限原则
- 数据库用户只给必要权限。
- 错误信息隐藏
- 不向用户暴露数据库错误信息。
什么是盲注(Blind SQL Injection)?
普通 SQL 注入:页面直接返回数据库报错信息(容易发现)。
盲注:页面不显示错误,但会根据 SQL 结果返回不同的页面。
攻击者通过 布尔逻辑 或 时间延迟 来判断注入是否成功。
盲注的两种方式
布尔盲注(Boolean-based Blind SQLi)
通过条件语句让页面返回不同结果。
http://target.com/item.php?id=1' AND 1=1-- ✅ 页面正常
http://target.com/item.php?id=1' AND 1=2-- ❌ 页面异常
基于时间的盲注(Time-based Blind SQLi)
通过 SLEEP() 等函数让数据库延迟响应。
http://target.com/item.php?id=1' AND IF(1=1, SLEEP(5), 0)-- ⏳ 延迟 5 秒