
掌握ChatGPT插件與自定義GPT
Server running at http://${hostname}:${port}/
);
});
完成后,您可以轉到終端并使用以下命令運行代碼:
node app.js
訪問 http://localhost:3000,您應該會看到一條消息“Hello World”。
很簡單,對吧?
好的,現在讓我們來談談命令注入。
為了簡單解釋命令注入,我們需要討論一下 Web 應用程序中的注入。
您可能聽過人們在安全組和網絡上的網站上談論 SQL 注入。簡單來說,注入就是攻擊者試圖劫持用戶輸入。通過使用特定字符或字符串,攻擊者可以繞過應用程序并操縱或獲取對應用程序數據庫的訪問權限。
這種攻擊及其相關的漏洞在 21 世紀初成為網絡安全的流行語,因為它看似簡單但實際上卻具有破壞性而臭名昭著。
命令注入或代碼注入是一種特殊的注入攻擊,攻擊者將 JavaScript 或 Java 代碼注入服務器以控制服務器。隨后,瀏覽器或應用程序運行時會錯誤地將此惡意代碼解釋為有效代碼,因為它無法區分開發人員想要的代碼和攻擊者的代碼。
考慮到應用程序執行的任何攻擊者的任意代碼都可以繞過任何安全措施,甚至可能完全放棄服務器,這種情況尤其危險。
值得慶幸的是,以字符串為參數并在系統上執行命令的代碼在大多數開發項目中并不是標準。在大多數情況下,最佳實踐不鼓勵開發人員在必要時使用“exec”或“directory.execute”等函數。
盡管如此,必須意識到您在項目中使用的某些庫可能具有這些功能并使您的平臺面臨風險。
現在您已經更好地了解了什么是命令注入以及它能對您的操作系統產生什么影響,讓我們看一個簡單的例子。
假設您的受害應用程序使用了一個使用前面提到的“child_process”模塊的函數(例如,“exec”Node.js 函數或“eval”JavaScript 函數),攻擊者只需將命令附加到請求中即可訪問您的服務器命令行。
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
// Get parameter. In this case, the image name.
const image = req.query.image;
// Execute the command
exec(git log --oneline ${image}
, (err, output) => {
// Respond with HTTP 500 if there was an error
if (err) {
res.status(500).send(err);
return;
}
// output the HTTP response
res.send(output);
});
});
module.exports = router;
下面就是一個很好的例子:
curl http://localhost:3000/index?image=prof.png;nc%20-l%205656%20|/bin/bash
在此請求中,攻擊者試圖運行以下命令:
nc -l 5656 | /bin/bash
這個名為“netcat”的命令可以代表攻擊者在您的服務器上運行任意代碼并使其癱瘓。
好吧,那么我們能做些什么呢?
那么,抵御這種威脅的第一道防線也是最有效的,那就是完全廢除使用在低級執行命令的功能。
除非絕對必要,否則請避免使用 eval()、exec()、setTimeout()、setInterval() 以及任何其他允許動態代碼的函數。
此外,請避免使用 new Function(),原因此時應該很明顯了。
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
// Get parameter. In this case, the image name.
const image = req.query.image;
// Execute the command
execFile(git log --oneline ${image}
, (err, output) => {
// Respond with HTTP 500 if there was an error
if (err) {
res.status(500).send(err);
return;
}
// output the HTTP response
res.send(output);
});
});
module.exports = router;
此外,請確保對應用程序允許的任何用戶輸入采用輸入清理機制。一般來說,限制和規范應用程序提供的所有用戶輸入途徑至關重要。例如,尋找將動態輸入更改為固定選擇的方法。并確保將所有輸入列入安全列表以防范已知攻擊。
此外,避免在 JavaScript 中使用代碼序列化。是的,這確實存在,但你不應該忽視它。
最后,我們建議使用 StackHawk 等安全分析工具,并定期掃描應用程序是否存在注入漏洞。StackHawk 的先進軟件可測試您正在運行的應用程序、服務和 API,以查找您的團隊引入的安全漏洞以及可利用的開源安全漏洞。
借助 StackHawk,應用程序安全可以跟上當今工程團隊的步伐。在拉取請求中查找漏洞并快速推出修復程序,而以前的安全工具則在等待某人啟動手動掃描。
開發強大且安全的應用程序從未如此簡單和便捷。Typescript 等現代語言和 NodeJS 等多功能平臺為尋求構建未來的工程師提供了前所未有的強大功能。然而,在擁有所有這些多功能性和強大功能的同時,保持高標準的安全性和彈性以應對不斷演變的網絡威脅至關重要。
保持對這些開發堆棧的廣泛專業知識每年都變得越來越必要。如今,團隊必須比以前接受更多的培訓和專業化。這就是為什么保持高標準并使用像 StackHawk 這樣的強大解決方案至關重要。
無論您是試圖找出解決問題的方法的開發人員,還是研究可以提高產品價值的資產的經理,安全性都必須是您的首要任務。
文章來源:Typescript Command Injection: Examples and Prevention