python网络安全 SQL注入

什么是 SQL 注入?

  • SQL 注入(SQL Injection, SQLi) 是指应用没有正确处理用户输入,攻击者可以构造恶意 SQL 语句,直接与数据库交互。
  • 危害:

    1. 窃取用户数据(用户名、密码、邮箱)。
    2. 绕过登录验证。
    3. 修改/删除数据库内容。
    4. 甚至拿下服务器权限。

经典示例

一个登录逻辑:

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' 永远为真,绕过验证,直接登录成功。

防御措施

  1. 使用预编译语句(Prepared Statements)
    • 例如 Python sqlite3MySQLdb 中的参数化查询。
  2. 输入过滤和转义
    • 对用户输入严格检查。
  3. 最小权限原则
    • 数据库用户只给必要权限。
  4. 错误信息隐藏
    • 不向用户暴露数据库错误信息。

什么是盲注(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 秒