🔐 实验一:登录绕过

Authentication Bypass

📖 原理说明

当登录验证使用字符串拼接构造 SQL 时,攻击者可以通过注入特殊字符改变 SQL 语义:

-- 原始 SQL
SELECT * FROM users WHERE username='输入' AND password='输入'

-- 注入后
SELECT * FROM users WHERE username='admin'--' AND password='任意'
                                       ↑
                              注释掉了密码验证!

🧪 漏洞演示

💡 尝试以下 Payload:

用户名: admin'-- 密码: 任意

用户名: ' OR '1'='1 密码: ' OR '1'='1

用户名: ' OR 1=1-- 密码: 任意

执行的 SQL:

等待输入...

🔬 漏洞代码分析

有漏洞的后端代码:

// ❌ 字符串拼接,存在注入漏洞
const sql = `SELECT * FROM users 
  WHERE username='${username}' 
  AND password='${password}'`

db.prepare(sql).get()

安全的后端代码:

// ✅ 参数化查询,注入无效
const sql = 'SELECT * FROM users WHERE username=? AND password=?'

db.prepare(sql).get(username, password)

🎯 攻击原理详解

Payload: admin'--

SELECT * FROM users WHERE username='admin'--' AND password='xxx'
                                          ↑
                                   -- 是SQL注释
                                   后面的内容被忽略

Payload: ' OR '1'='1

SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
                                        ↑              ↑
                                   永远为真        永远为真
                                   返回所有用户!

🛡️ 防御要点