Node.js中安全調用系統命令的方法(避免注入安全性漏洞),node.js安全性漏洞

來源:互聯網
上載者:User

Node.js中安全調用系統命令的方法(避免注入安全性漏洞),node.js安全性漏洞

在這篇文章中,我們將學習正確使用Node.js調用系統命令的方法,以避免常見的命令列注入漏洞。

我們經常使用的調用命令的方法是最簡單的child_process.exec。它有很一個簡單的使用模式;通過傳入一段字串命令,並把一個錯誤或命令處理結果回傳至回呼函數中。

這裡是你通過child_process.exec調用系統命令一個非常典型的例子。

複製代碼 代碼如下:
child_process.exec('ls', function (err, data) {
    console.log(data);
});

不過,當你需要在你調用的命令中添加一些使用者輸入的參數時,會發生什嗎?顯而易見的解決方案是把使用者輸入直接和您的命令進行字串合并。但是,我多年的經驗告訴我:當你將串連的字串從一個系統發送到另一個系統時,總有一天會出問題。

複製代碼 代碼如下:
var path = "user input";
child_process.exec('ls -l ' + path, function (err, data) {
    console.log(data);
});

為什麼連接字串會出問題?

嗯,因為在child_process.exec引擎下,將調用執行"/bin/sh"。而不是目標程式。已發送的命令只是被傳遞給一個新的"/bin/ sh'進程來執行shell。 child_process.exec的名字有一定誤導性 - 這是一個bash的解譯器,而不是啟動一個程式。這意味著,所有的shell字元可能會產生毀滅性的後果,如果直接執行使用者輸入的參數。

複製代碼 代碼如下:
[pid 25170] execve("/bin/sh", ["/bin/sh", "-c", "ls -l user input"], [/* 16 vars */]

比如,攻擊者可以使用一個分號";"來結束命令,並開始一個新的調用,他們可以使用反引號或$()來運行子命令。還有很多潛在的濫用。

那麼什麼是正確的調用方式?

execFile / spawn

像spawn和execFile採用一個額外的數組參數,不是一個shell環境下可以執行其他命令的參數,並不會運行額外的命令。

讓我們使用的execFile和spawn修改一下之前的例子,看看系統調用有何不同,以及為什麼它不容易受到命令注入。

child_process.execFile

複製代碼 代碼如下:
var child_process = require('child_process');

var path = "."
child_process.execFile('/bin/ls', ['-l', path], function (err, result) {
    console.log(result)
});

啟動並執行系統調用
複製代碼 代碼如下:
[pid 25565] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */]

child_process.spawn

使用 spawn 替換的例子很相似。
複製代碼 代碼如下:
var child_process = require('child_process');

var path = "."
var ls = child_process.spawn('/bin/ls', ['-l', path])
ls.stdout.on('data', function (data) {
    console.log(data.toString());
});

啟動並執行系統調用

複製代碼 代碼如下:
[pid 26883] execve("/bin/ls", ["/bin/ls", "-l", "."], [/* 16 vars */

當使用spawn或execfile時,我們的目標是只執行一個命令(參數)。這意味著使用者不能運行注入的命令,因為/bin/ls並不知道如何處理反引號或pipe或;。它的/bin/bash將要解釋的是那些命令的參數。它類似於使用將參數傳入SQL查詢(parameter),如果你熟悉的話。

但還需要警告的是:使用spawn或execFile並不總是安全的。例如,運行 /bin/find,並傳入使用者輸入參數仍有可能導致系統被攻陷。 find命令有一些選項,允許讀/寫任意檔案。

所以,這裡有一些關於Node.js運行系統命令的指導建議:

避免使用child_process.exec,當需要包含使用者輸入的參數時更是如此,請牢記。
盡量避免讓使用者傳入參數,使用選擇項比讓使用者直接輸入字串要好得多。
如果你必須允許使用者輸入參數,請廣泛參考該命令的參數,確定哪些選項是安全的,並建立一個白名單。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.