PHP8 MongoDB腳本注入攻擊

2024-04-08 10:15 更新

如果您使用的是 JavaScript,請(qǐng)確保任何跨越 PHP 的變量 - to-JavaScript 邊界在 MongoDB\BSON\Javascript 字段中傳遞,而不是插值到 JavaScript 字符串。在查詢(xún)、mapReduce 和 group 命令中使用子句時(shí),以及您可能在任何其他時(shí)候都會(huì)出現(xiàn)這種情況 將 JavaScript 傳遞到數(shù)據(jù)庫(kù)中。scope$where

例如,假設(shè)我們有一些 JavaScript 來(lái)問(wèn)候數(shù)據(jù)庫(kù)中的用戶(hù) 原木。我們可以做到:

<?php
$m = new MongoDB\Driver\Manager;

// Don't do this!!!
$username = $_GET['field']; 

$cmd = new \MongoDB\Driver\Command( [
    'eval' => "print('Hello, $username!');"
] );

$r = $m->executeCommand( 'dramio', $cmd );
?>

但是,如果惡意用戶(hù)傳入一些 JavaScript 怎么辦?

<?php
$m = new MongoDB\Driver\Manager;

// Don't do this!!!
$username = $_GET['field']; 
// $username is set to "'); db.users.drop(); print('"

$cmd = new \MongoDB\Driver\Command( [
    'eval' => "print('Hello, $username!');"
] );

$r = $m->executeCommand( 'dramio', $cmd );
?>

現(xiàn)在 MongoDB 執(zhí)行 JavaScript 字符串。 這種攻擊很容易避免:用來(lái)傳球 從 PHP 到 JavaScript 的變量:"print('Hello, '); db.users.drop(); print('!');"args

<?php
$m = new MongoDB\Driver\Manager;

$_GET['field'] = 'derick';
$args = [ $_GET['field'] ];

$cmd = new \MongoDB\Driver\Command( [
    'eval' => "function greet(username) { print('Hello, ' + username + '!'); }",
    'args' => $args,
] );

$r = $m->executeCommand( 'dramio', $cmd );
?>

這會(huì)向 JavaScript 作用域添加一個(gè)參數(shù),該參數(shù)將用作參數(shù) 對(duì)于函數(shù)?,F(xiàn)在如果 有人試圖發(fā)送惡意代碼,MongoDB會(huì)無(wú)害地打印。greetHello, '); db.dropDatabase(); print('!

使用參數(shù)有助于防止惡意輸入被 數(shù)據(jù)庫(kù)。但是,您必須確保代碼不會(huì)轉(zhuǎn)過(guò)來(lái) 并執(zhí)行輸入!最好首先避免在服務(wù)器上執(zhí)行任何 JavaScript。

強(qiáng)烈建議您遠(yuǎn)離 ? $where 子句,因?yàn)樗鼤?huì)顯著影響性能。哪里 可能,使用普通查詢(xún)運(yùn)算符或 ? 聚合 框架。

作為 ? MapReduce 的替代品,它使用 JavaScript,請(qǐng)考慮使用 ? 聚合 框架。與 Map/Reduce 不同,它使用慣用語(yǔ)言來(lái) 構(gòu)造查詢(xún),而無(wú)需編寫(xiě)和使用速度較慢的 JavaScript Map/Reduce所需的方法。

自 MongoDB 3.0 以來(lái),不推薦使用 ? eval 命令,也應(yīng)避免使用。


以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)