如何获取谷歌新闻API密钥(分步指南)
Kotlin命令注入:示例及预防
本文旨在提供有关命令注入及其对现代网络影响的资源。我们将讨论什么是命令注入,并探索一些 Kotlin 示例。最后,我们将介绍如何使用我们的示例项目缓解此漏洞。
为此,我们将使用 Spring Boot 和 Kotlin 作为我们的首选堆栈构建一个示例项目。如果您没有使用其中任何一种的经验,请不要担心。您应该能够掌握技术堆栈特性之外的主要概念。
尽管如此,我们建议您花一些时间熟悉该语言并探索Spring 教程,我们将使用它作为示例项目的基础。
跳跃之前
在进行命令注入之前,让我们确保您已设置好环境。首先使用 start.spring.io 工具在 Spring boot 中制作一个演示站点。
注意:我们假设您的环境已准备好使用 Java,并且您有一个 IDE 来编写代码。如果情况如此,并且您想直接进入正题,请随意跳过本节。
现在请前往 https://start.spring.io并设置我们的项目。不要忘记选择 Spring Web 作为依赖项、Gradle 作为管理器以及 Kotlin 作为首选语言。
下载后,进入 src/main/kotlin/com/example/demo 文件夹并创建一个名为 HomeController.kt 的类文件。在那里你可以输入以下代码:
package com.example.blog
import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping
@Controller class HomeController {
@GetMapping("/")
fun home(model: Model): String {
model["title"] = "Blog"
return "home"
}
}
然后继续到 src/main/resources/templates 文件夹以及相应的页眉和页脚模板。请注意,我们选择了 mustache 模板语法;但是,您可以按照自己喜欢的语法进行制作。
header.mustache
<html>
<head>
<title>{{title}}</title>
</head>
<body>
footer.mustache
</body>
</html>
home.mustache
{{> header}}
<h1>{{title}}</h1>
<p>This is a test blog.</p>
{{> footer}}
这就是您现在所需要的全部内容。
您可以在终端中输入“gradle bootRun”并在 localhost:8080 上查看您的网站,从而继续运行您的代码。
博客主页。
如果您想在阅读本文之前更好地了解幕后发生的情况,请转到 Spring Boot 教程页面。
解释命令注入
为了解释什么是命令注入,我们需要讨论一下 Web 应用程序中的注入。
您可能听说过开发人员和网络圈子中有人讨论 SQL 注入。简而言之,注入是一种攻击者试图劫持用户输入的攻击。通过使用特定字符或字符串,攻击者可以绕过应用程序并操纵或获取对应用程序数据库的访问权限。
这种攻击及其相关的漏洞在 21 世纪初期成为网络安全的流行语,因为它看似简单但实际上却具有破坏性而臭名昭著。
命令注入或代码注入是一种特殊的注入攻击,攻击者将 JavaScript 或 Java 代码注入服务器以夺取对服务器的控制权。随后,浏览器或应用程序运行时会错误地将此恶意代码解释为有效代码,因为它无法区分开发人员想要的代码和攻击者的代码。
考虑到应用程序执行的任何攻击者的任意代码都可以绕过任何安全措施,甚至可能完全放弃服务器,这种情况尤其危险。
值得庆幸的是,以字符串为参数并在系统上执行命令的代码在大多数开发项目中并不是标准。大多数情况下,最佳实践不鼓励开发人员使用 exec 或 directory.execute 之类的函数,除非绝对必要。
尽管如此,必须意识到您在项目中使用的某些库可能包含这些功能并使您的平台面临风险。
命令注入示例
现在您知道了什么是命令注入以及它如何进入您的操作系统,让我们看一个例子。
curl http://localhost:3000/index?image=prof.png;nc%20-l%205656%20|/bin/bash
在此示例请求中,您可以看到攻击者正在尝试运行以下命令:
nc -l 5656 | /bin/bash
这个名为“netcat”的命令可以代表攻击者在我们的服务器上运行任意代码并彻底破坏它。
我们假设您的应用程序正在使用上述某个易受攻击的函数。在这种情况下,可以认为攻击者只需将命令附加到请求中即可访问您的服务器命令行。
@Controller class HomeController {
@GetMapping("/index")
fun home(model: Model, image: String): String {
model["title"] = "Blog"
// Exec sample
val result: String = exec("git log --oneline " + image, stdIn = "yes")
model["image"] = result
return "home"
}
}
命令注入漏洞
为了缓解此漏洞,我们需要确保不使用可以执行命令的函数,除非绝对必要。毕竟,如果没有访问点,就没有风险。因此,我们的第一道防线——预防——对这种威胁非常有效。
此外,请务必对提供的任何用户输入应用输入清理机制。一般来说,限制和规范应用程序提供的所有用户输入路径。例如,寻找将动态输入更改为固定选择的方法,并使用安全列表来验证所有输入。
最后,使用 StackHawk 等安全分析工具定期扫描应用程序是否存在漏洞。StackHawk 可以测试应用程序、服务和 API 是否存在安全漏洞和威胁。它还可以通知您的团队,以便他们有效地解决这些问题。
结论
在为 Web 创建引人入胜且功能丰富的解决方案的过程中,专注于截止日期和里程碑的开发人员很容易忽视安全性。对于专注于以尽可能低的成本快速产生结果的项目来说,安全性和稳健性是事后考虑的方面。不幸的是,这就是市场接受的现实,作为爆炸性增长潜力的可接受权衡。
然而,对于构建当今网络的开发人员来说,抵制这些趋势至关重要。同样,负责构建未来基础设施和工具的工程师必须意识到这些决策的影响。
有时,修复、补丁和缓解策略的正确实施可能非常复杂。如果您的平台非常大,情况尤其如此。