Koki.
返回博客

SQL 注入入门:从一条引号开始

3 分钟阅读

SQL 注入是 Web 安全最经典、也最适合新手的漏洞。它不需要任何高深工具,只靠一条引号

一次正常的登录

你在登录框输入 admin / 123456,后端(不安全的写法)会这样拼查询:

SELECT * FROM users WHERE username = 'admin' AND password = '123456'

查询返回空 → 登录失败。逻辑没问题。

一条引号改变一切

现在把用户名改成:' OR '1'='1

后端拼出来的查询变成:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''

拆开看:第一个引号提前闭合了 username 的字符串,后面的 OR '1'='1' 被数据库当成了代码执行。而 '1'='1' 永远为真——于是 username = '' 是假也没关系,假 OR 真 还是真,密码验证被完全绕过

想亲手试试?安全专区有「SQL 注入动手实验」,模拟登录框里点一下 payload 就能看到查询怎么被改写。

还有一招:注释符

用户名输入 admin'---- 在 SQL 里是注释):

SELECT * FROM users WHERE username = 'admin'--' AND password = ''

-- 后面全部变成注释——密码条件被直接删掉,只验证用户名就登录成功。这就是传说中的「万能密码」。

现实中的注入远不止登录框

  • 搜索框:' UNION SELECT password FROM users--(联合查询偷数据)
  • URL 参数:?id=1 OR 1=1(拖出全表数据)
  • 报错信息泄露表结构,盲注逐字符猜解数据

2008 年至今,SQL 注入始终稳居 OWASP 十大 Web 风险榜单,许多大型数据泄露事件(包括知名票务平台、游戏公司)的根源就是它。

怎么防?参数化查询

把输入当数据,而不是代码

# 参数化查询:? 是占位符,输入永远只当数据
cursor.execute(
    "SELECT * FROM users WHERE username = ? AND password = ?",
    (username, password),
)

预编译语句把查询结构和数据分开处理,无论输入里有多少引号,都只是一个字符串。这也是所有注入类漏洞(XSS、命令注入、模板注入)的共同修复思路:永远不要信任输入,永远不要拼接执行。

下一步

  1. 安全专区的动手实验玩一遍两种 payload
  2. PortSwigger Academy 的 SQLi 免费实验室,从「WHERE 子句注入」开始
  3. 自己写一个脆弱的小网站,再用参数化查询把它修好——教别人是最好的学习

koki.asia bootloader v1.0

0%

CLICK / ESC TO SKIP