作者CMJ0121 (不要偷 Q)
看板NetSecurity
标题[闲聊] 2017.W46 - No SQL Injection in No SQL ?
时间Tue Nov 14 22:14:53 2017
2017.W46 - No SQL Injection in No SQL?
> 虽然 No-SQL 已死(?) 但这问题还蛮有趣的
## 前言 ##
最近在查资料 突然看到一篇文章[0]
提到 mongo DB 的 SSJI (Server-Side JavaScript Injection) 进而 RCE 攻击
也顺便学一下 NoSQL 的一些语法跟概念
## 内容 ##
NoSQL [1] 是一种不同於传统关联式资料库[2] 的一种资料储存型态
跟一般 DB 相较起来 更强调 Key-Value 形式的资料储存
在大量资料的状况下更可以平行处理
以 mongo DB[3] 为例 他提供多种类似 SQL 的语法[4]
像是 $where 後面就可以接 NoSQL 语法的条件
可能是简单的条件成立
"this.credits == this.debits || this.credits > this.debits"
或者是函数的方式
function() {
return obj.credits - obj.debits <
0; }
更甚之 可以使用巢状式的
$and: [ { price: {
$ne:
1.99 } }, { price: {
$exists:
true } }
而在研究者提出来的 SSJI to RCE 文章中
主要是提到 mongodb 提供了 run() [5] 这个内部使用的函数
这个函数可以被用来执行系统指令
透过一连串的分析之後 run() -> nativeHelper.apply(run_, arguments) -> nativeHelper.apply({"x": 135246144})
最後就可以在 NoSQL 的查询语法中 执行恶意的 JavaScript
藉由分析 source code [6] 来建立相关的 payload
OWASP [7] 也针对 NoSQL 来提供简单判断是否存在 SQL Injection 的方式
除了上面那种透过 nativeHelper 执行恶意 payload 之外
也可以简单 [8] 地透过上面提到的巢状指令来做 SQL Injection
[0]:
https://blog.scrt.ch/2013/03/24/mongodb-0-day-ssji-to-rce/
[1]:
https://zh.wikipedia.org/wiki/NoSQL
[2]:
https://en.wikipedia.org/wiki/Relational_database
[3]:
https://www.mongodb.org/
[4]:
https://docs.mongodb.com/manual/reference/operator/query/where/
[5]:
https://docs.mongodb.com/manual/reference/method/run/
[6]:
https://github.com/mongodb/mongo
[7]:
https://www.owasp.org/index.php/Testing_for_NoSQL_injection
[8]:
http://cyrilwang.blogspot.tw/2012/06/nosql-no-injection.html
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.122.171
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/NetSecurity/M.1510668896.A.CBC.html