元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
注入攻击与防御
SQL注入原理与利用
SQL注入防御策略
NoSQL注入技术分析
命令注入漏洞实战
ORM框架注入问题
注入攻击自动化检测
▶
认证与会话安全
会话固定与会话劫持
密码存储与加密策略
多因素认证机制
OAuth2.0安全实践
JWT安全攻防
认证逻辑漏洞挖掘
▶
XSS攻击与防御
XSS攻击原理与分类
存储型XSS实战案例
DOM型XSS高级利用
XSS过滤器绕过技术
CSP内容安全策略
前端框架XSS防护
▶
CSRF与点击劫持
CSRF攻击原理演示
CSRF Token防御实践
点击劫持技术剖析
SameSite Cookie策略
框架内置防护机制
跨域资源安全策略
▶
文件安全攻防
文件上传漏洞利用
安全文件类型验证
路径遍历漏洞实战
文件包含漏洞防御
Office文档攻击解析
云存储安全配置
▶
其他Web攻击技术
SSRF漏洞利用与防御
XXE漏洞攻防实战
反序列化漏洞原理
业务逻辑漏洞挖掘
HTTP请求走私攻击
Web缓存投毒攻击
发布时间:
2025-03-23 12:50
↑
☰
# NoSQL注入技术分析 ## NoSQL注入概述 NoSQL注入是一种针对非关系型数据库的安全漏洞,攻击者通过在应用程序的输入参数中插入恶意代码,利用NoSQL数据库的特性来实现未授权的数据访问或操作。与传统的SQL注入相比,NoSQL注入具有其独特的攻击方式和利用技巧。 ## NoSQL数据库特性 ### 1. 文档型数据库 以MongoDB为例,数据以BSON(二进制JSON)格式存储: ```javascript // 用户文档示例 { "_id": ObjectId("507f1f77bcf86cd799439011"), "username": "admin", "password": "e10adc3949ba59abbe56e057f20f883e", "email": "admin@example.com", "role": "administrator" } ``` ### 2. 查询语法 NoSQL数据库通常使用类似JSON的查询语法: ```javascript // MongoDB查询示例 db.users.find({ username: "admin", password: "123456" }) ``` ## 常见注入类型 ### 1. 对象注入 在基于Node.js和MongoDB的应用中: ```javascript // 不安全的查询 app.post('/login', (req, res) => { db.users.find({ username: req.body.username, password: req.body.password }) }) ``` 攻击payload: ```json { "username": {"$ne": null}, "password": {"$ne": null} } ``` ### 2. 数组注入 ```javascript // 不安全的查询 db.users.find({ username: username, password: {$in: [password]} }) ``` 攻击payload: ```json { "username": "admin", "password": {"$in": ["", null, "password", "123456"]} } ``` ### 3. 正则表达式注入 ```javascript // 不安全的查询 db.users.find({ username: {$regex: username} }) ``` 攻击payload: ```json { "username": {"$regex": "^admin", "$options": "i"} } ``` ## 高级攻击技术 ### 1. JavaScript注入 MongoDB支持在查询中执行JavaScript代码: ```javascript // 危险的查询 db.users.find({ $where: "this.username == '" + username + "'" }) ``` 攻击payload: ```javascript ' || sleep(5000) || ' ``` ### 2. 聚合管道注入 ```javascript // 不安全的聚合查询 db.users.aggregate([ {$match: {username: username}}, {$project: {password: 0}} ]) ``` 攻击payload: ```json { "username": {"$gt": ""}, "$project": {"password": 1} } ``` ### 3. 命令注入 ```javascript // 危险的系统命令执行 db.eval("db.getCollection('users').find()") ``` ## 注入检测方法 ### 1. 手动测试 - 测试操作符注入($ne, $gt, $where等) - 测试JavaScript代码执行 - 测试特殊字符处理 - 检查错误响应 ### 2. 自动化工具 - NoSQLMap - OWASP ZAP - Burp Suite Professional - Custom Scripts ## 防御策略 ### 1. 输入验证 ```javascript // 类型检查 const isValidObjectId = (id) => { return ObjectId.isValid(id); }; // 格式验证 const isValidUsername = (username) => { return /^[a-zA-Z0-9_]{3,16}$/.test(username); }; ``` ### 2. 参数化查询 ```javascript // 使用Mongoose Schema const UserSchema = new Schema({ username: { type: String, required: true, match: /^[a-zA-Z0-9_]{3,16}$/ }, password: { type: String, required: true } }); // 安全的查询 User.findOne({ username: username }).select('-password'); ``` ### 3. 安全配置 ```javascript // MongoDB安全配置 mongoose.connect('mongodb://localhost/db', { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, autoIndex: false, poolSize: 10, serverSelectionTimeoutMS: 5000, socketTimeoutMS: 45000, family: 4 }); ``` ## 最佳实践 ### 1. 数据访问层 ```javascript // 数据访问层封装 class UserDAO { static async findByUsername(username) { if (!isValidUsername(username)) { throw new Error('Invalid username format'); } return await User.findOne({username}).exec(); } static async createUser(userData) { const user = new User(userData); await user.validate(); return await user.save(); } } ``` ### 2. 错误处理 ```javascript // 统一错误处理 app.use((err, req, res, next) => { logger.error('Database error:', err); res.status(500).json({ error: 'Internal server error' }); }); ``` ### 3. 安全审计 ```javascript // 操作日志记录 const auditLog = async (operation, collection, query) => { await AuditLog.create({ operation, collection, query: JSON.stringify(query), timestamp: new Date(), user: req.user.id }); }; ``` ## 实际案例分析 ### 案例1:认证绕过 易受攻击的代码: ```javascript app.post('/login', async (req, res) => { const user = await db.users.findOne({ username: req.body.username, password: req.body.password }); if (user) { // 登录成功 } }); ``` 攻击payload: ```json { "username": "admin", "password": {"$ne": ""} } ``` 安全修复: ```javascript app.post('/login', async (req, res) => { if (!isValidUsername(req.body.username)) { return res.status(400).json({error: 'Invalid username'}); } const user = await User.findOne({username: req.body.username}); if (user && await bcrypt.compare(req.body.password, user.password)) { // 登录成功 } }); ``` ### 案例2:数据泄露 易受攻击的代码: ```javascript app.get('/users', async (req, res) => { const query = JSON.parse(req.query.filter); const users = await db.users.find(query); res.json(users); }); ``` 攻击payload: ```json {"$where": "function() { return this.password != null; }"} ``` 安全修复: ```javascript app.get('/users', async (req, res) => { const page = parseInt(req.query.page) || 1; const limit = Math.min(parseInt(req.query.limit) || 10, 100); const users = await User.find() .select('username email') .skip((page - 1) * limit) .limit(limit); res.json(users); }); ``` ## 总结 NoSQL注入是现代Web应用中不容忽视的安全威胁。与传统SQL注入相比,NoSQL注入具有其独特的攻击方式和防御难点。开发者需要: 1. 理解NoSQL数据库的特性和安全风险 2. 实施严格的输入验证和参数化查询 3. 使用安全的ORM/ODM框架 4. 实施最小权限原则 5. 建立完善的安全审计机制 通过采用本文介绍的防御策略和最佳实践,可以有效降低NoSQL注入风险,构建更安全的应用系统。同时,要注意持续关注新的攻击方式和防御技术,不断更新安全措施。