精華區beta NetSecurity 關於我們 聯絡資訊
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://www.ptt.cc/bbs/NetSecurity/M.1510668896.A.CBC.html