Authentication Bypass
当登录验证使用字符串拼接构造 SQL 时,攻击者可以通过注入特殊字符改变 SQL 语义:
-- 原始 SQL
SELECT * FROM users WHERE username='输入' AND password='输入'
-- 注入后
SELECT * FROM users WHERE username='admin'--' AND password='任意'
↑
注释掉了密码验证!
用户名: admin'-- 密码: 任意
用户名: ' OR '1'='1 密码: ' OR '1'='1
用户名: ' OR 1=1-- 密码: 任意
等待输入...
有漏洞的后端代码:
// ❌ 字符串拼接,存在注入漏洞
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)
SELECT * FROM users WHERE username='admin'--' AND password='xxx'
↑
-- 是SQL注释
后面的内容被忽略
SELECT * FROM users WHERE username='' OR '1'='1' AND password='' OR '1'='1'
↑ ↑
永远为真 永远为真
返回所有用户!