SQL注入是每一位做Web安全的人绕不过去的坎。前不久OWASP Top 10更新后,SQL注入被挤出了前三,但如果你去问任何一个红队成员或者应急响应工程师,他们大概率还是会告诉你:这依然是最常见的Web高危漏洞之一。我见过太多人搜“sql注入攻击与防御 pdf”来学习,但其实这类资料看得再多,都不如在靶场里亲手跑通一次注入链路来得有效。
这篇文章,我打算从一个实际渗透测试的视角,把SQL注入从原理、靶场搭建、手工注入流程、绕过思路到防御修复完整串一遍。里面会涉及DVWA、Pikachu、Burp靶场这类经常被搜索的练习环境,也会聊CISP-PTE考试里那类读取 /tmp/360/key 的经典考点,以及GitHub搜索语法、CMS老版本漏洞利用等大家搜索频率很高的方向。无论你是刚入门的安全新人,还是已经在做等保、护网、渗透测试的从业者,这篇内容应该都能给你一些“网上教程不会细讲”的东西。
1. SQL注入的本质是什么——一个请求如何变成数据库“执行令”
1.1 为什么说这是Web安全的“老熟人”
很多初学者会把SQL注入理解成“在输入框里输入几个特殊字符,然后就能拖库”,这个理解没错,但太表面了。SQL注入真正可怕的地方在于:它利用了程序在“代码”和“数据”之间的边界模糊。
数据库本身是不认识“这是合法输入”和“这是攻击语句”的。它只负责执行SQL语句。当程序员把用户输入的内容直接拼接进SQL语句时,数据库就会把输入的一部分当成SQL命令来执行。这就是为什么这么多年过去了,技术栈从PHP换到Java再换到Go,SQL注入依然是漏洞排行榜上的常客——因为“手工拼接SQL”这件事,在中小型项目里太普遍了。
我在实际项目中见过不少案例:某些建站CMS的旧版本,一个搜索框、一个文章ID参数,甚至一个排序字段,都可能成为注入点。CMS用户量大、插件多、二次开发频繁,如果核心程序修了但插件没跟上,漏洞依然存在。这也是“sql注入&cms”这个组合词搜索热度一直居高不下的原因。
1.2 一次普通查询如何沦为注入点:从代码层面拆解
假设后端有一段非常典型的PHP代码,作用是“根据用户传入的ID展示文章详情”:
php复制$id = $_GET['id'];
$sql = "SELECT * FROM articles WHERE id = " . $id;
$result = mysqli_query($conn, $sql);
这段代码看起来没什么问题。用户访问 article.php?id=1,就拿文章ID为1的内容。但如果你把 id 的值从单纯的数字改成这段内容呢:
sql复制1 UNION SELECT username, password FROM users
拼接出来的完整SQL语句就变成了:
sql复制SELECT * FROM articles WHERE id = 1 UNION SELECT username, password FROM users
你没看错,数据库会老老实实地执行这条语句——先查文章ID为1的文章,再把users表里的用户名和密码合在一起返回给页面。这就叫数据变成了指令。
用一个生活化的类比:这就好比你在银行填取款单,柜员把你的“备注”栏目原封不动地念给内部系统听。你填“备注:转账给张三”,系统就转给张三;你填“备注:转账给张三,顺便把余额改成999999”,系统可能就照做了。问题不在银行系统,而在柜员不该把你的备注当成系统指令来执行。
1.3 为什么有些注入“打不进去”:三种过滤策略
很多人会困惑:我照着教程输入 ' 或者 1 OR 1=1,为什么有些网站没反应?因为看到的那是过滤过的,或者说,目标代码本身处理方式不同。常见的处理方式基本分三类:
**第一类:简单替换。**开发人员把单引号、双引号、OR、AND 这些关键字直接替换成空字符串。听起来很安全,但替换逻辑通常只做一次。输入 OORR,替换掉中间的 OR 之后剩下什么?正好是 OR。这就是所谓“过滤不彻底”的典型。
**第二类:黑名单关键词过滤。**拦截 select、union、from、information_schema 等。但黑名单的问题是,攻击者可以用大小写混写(UnIoN)、内联注释(/*!UNION*/)、等价函数(mid代替substr)等方式绕过。所以只有黑名单、没有白名单和参数化,效果非常有限。
**第三类:参数化查询(PreparedStatement)。**这是目前公认最有效的防御方式。SQL语句的结构和参数分开传给数据库,数据库先“定好型”,再往里填值。这时候你输入 ' OR '1'='1,它也会当成一个字符串值,而不是SQL逻辑。
一句话总结:能防住注入的不是过滤多严格,而是代码结构上是否允许数据和指令分离。 后面第六部分我会展开细说防御。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 靶场选择与本地环境搭建——不是为了“打靶”而打靶
2.1 Pikachu、DVWA、Burp靶场各自适合什么阶段
热搜词里这几个靶场几乎同时出现,说明大家都在纠结“我该从哪个开始练”。我的建议很简单:全部装,但按顺序用。
| 靶场 | 语言 | 难度分级 | 适合场景 | 我的评价 |
|---|---|---|---|---|
| DVWA | PHP | Low/Medium/High/Impossible | 入门练习、理解原理 | 分级设计很科学,可以直观 |
