所有文章 > 技术杂货铺 > Typescript命令注入:示例及预防
Typescript命令注入:示例及预防

Typescript命令注入:示例及预防

使用 Typescript 等尖端技术的一大好处就是可以体验实验的感觉。这就像我们小时候早早收到礼物一样。我们迫不及待地想要尝试、扩展它,看看它能做什么。

然而,这也带来了一些问题。社区还很年轻,文档很少。此外,一些粗糙之处可能会影响我们的生产力和体验。当然,还有安全性和漏洞。

在本文中,我们将深入探讨命令注入这一主题,这是网络上常见的漏洞之一,我们将找到保护工作安全的方法。首先,我们将探讨注入的基本概念。接下来,您将看到 JavaScript 中命令注入的一些示例。然后,我们将提供一些缓解措施。

设置基础

首先,让我们准备一个简单的样板项目。然后你可以试用一下并保存它,以便以后检查你的工作。

首先确保已安装 NodeJS。你可以在 macOS 中运行以下命令来执行此操作:

curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg</a>.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"

或者,您可以使用Brew通过以下命令进行安装:

brew install nodejs

现在,创建一个 NodeJS 项目非常简单。只需创建一个名为“nodejs_typescript_sample”的文件夹(您可以随意命名此文件夹)并导航到该文件夹​​。进入后,创建一个名为“app.js”的文件(这次我们建议您这样命名)并粘贴以下代码:

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World');
});

server.listen(port, hostname, () => {
console.log(`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

#你可能也喜欢这些API文章!
搜索、试用、集成国内外API!
幂简集成API平台已有 4749种API!
API大全