编码员征服安全。分享与学习系列 - 操作系统命令注入

发布日期:2019年02月07日
作者:Jaap Karan Singh
案例研究

编码员征服安全。分享与学习系列 - 操作系统命令注入

发布日期:2019年02月07日
作者:Jaap Karan Singh
查看资源
查看资源

只要应用程序允许用户向外壳输入信息,但不采取任何行动来验证输入的字符串是否有效,就会发生操作系统命令注入攻击。这使攻击者能够将命令直接投放到托管应用程序的操作系统中,而且是在为被攻击的应用程序设置的任何权限级别。  

操作系统命令注入攻击可以由入门级和不太熟练的黑客执行,这使得它们成为安全团队遇到的最常见的弱点之一。值得庆幸的是,有不少非常有效的方法来防止它们的成功。在这一集里,我们将学习。

       它们是如何工作的

       为什么它们如此危险

       你如何能把防御措施放在适当的位置来阻止他们。

攻击者如何使用操作系统命令注入?

攻击者为了发起操作系统命令注入攻击,必须做的第一件事是在应用程序中找到用户输入。用户填写的表格是潜在的好跳板。最聪明的攻击者还可以使用诸如cookies甚至HTTP头文件作为他们的启动点,这几乎是每个应用程序或网站都会使用的东西。

他们需要做的第二件事是弄清楚什么操作系统是应用程序的主机。鉴于只有少数几个选择,试错在这个阶段可以很好地发挥作用。大多数应用服务器要么是基于Windows的(Windows的味道通常并不重要),要么是某种类型的Linux盒子,或者可能是Unix。

在这一点上,黑客修改了输入,在看似无害的输入中注入了一个操作系统的命令。这可以欺骗主机操作系统,使其以应用程序的任何权限级别执行非预期的命令。

例如,以下命令可以被应用程序中的有效用户用来查看一个文件的内容,在这种情况下,就是每月一次的董事会会议的记录。

exec("cat " + filename)

在我们的例子中,这将执行以下命令并将会议记录返回给用户。

$ ./cat MeetingNotes.txt
7月份的会议上有三名执行委员会成员出席。会议讨论了新的预算项目,但没有采取任何行动或投票。

当攻击者在输入的末尾添加额外的命令时,就会发生这种情况,例如在Linux中用于列出目录内容的命令。在这种情况下,显示会议记录的原始命令仍然发生。但恶意用户也会被显示目录中的其他一切内容,以及他们可以在后续的操作系统命令注入攻击中使用哪些其他命令。他们输入

$ ./cat MeetingNotes.txt && ls

而得到的却是这个。

7月份的会议上有三名执行委员会成员出席。会议讨论了新的预算项目,但没有采取任何行动或投票。

MeetingNotes.txt
JuneMeetingNotes.txt
MayMeetingNotes.txt
format.c
misnull.c
notefault.c
trunc.c
writewhatwhere.c

正如你所看到的,在这个案例中,黑客不仅看到了目录的内容,而且还得到了一个他们可以使用的其他命令的菜单 " 他们现在知道他们可以在主机操作系统上执行的命令。

为什么操作系统命令注入攻击如此危险?

允许用户绕过目标应用程序的目的并使用它来运行操作系统命令是非常危险的。攻击者可以很容易地执行破坏性的行动,例如窃取机密数据或格式化整个服务器驱动器。攻击者可用的选择只受操作系统内允许的命令和他们使用这些命令的创造力的限制。

操作系统命令在与应用程序相同的权限级别上运行。以管理权限运行的应用程序意味着入侵它们的黑客可以运行每个操作系统命令。

操作系统命令注入的攻击模式是众所周知的,也是有记录的。一个易受攻击的应用程序和专业黑客一样容易受到脚本儿童的攻击。没有什么技能的攻击者可以尝试将操作系统命令剪切和粘贴到应用程序中,看看会发生什么。

针对操作系统的命令注入获得安全许可

有几个好的技术可以阻止操作系统的命令注入。第一步是以完成其功能所需的最少权限来运行应用程序。这并不能阻止攻击,但是如果真的发生了漏洞,损失就会降到最低。

大多数编程语言和框架为常见的操作系统方法提供了API调用,如列出目录内容、创建或读取硬盘上的文件。从你的环境中消除操作系统命令注入的一个完美方法是让所有应用程序使用这些API调用,而不是直接使用操作系统命令。

在无法做到这一点的情况下,在操作系统命令中使用用户输入之前,要对其进行验证。白名单可以用来确保只有一小部分可信的值可以被使用。从技术上讲,使用黑名单也可以做到这一点,但允许的命令可能少得多,所以白名单几乎总是更容易。不要忘记在你的白名单中包括有效的POST和GET参数,以及经常被忽视的用户输入载体,如cookies。

最后,如果没有可用的编程API,并且不能使用白名单,那么在操作系统命令中使用用户输入的任何特殊字符之前,使用消毒库来转义这些字符。

关于操作系统命令注入攻击的更多信息

要进一步阅读,你可以看一下OWASP关于操作系统命令注入攻击的文章。你也可以用Secure Code Warrior 平台的免费演示来测试你新发现的防御知识,该平台培训网络安全团队成为终极网络战士。要了解更多关于击败这个漏洞以及其他威胁的流氓画廊,请访问Secure Code Warrior 博客。

查看资源
查看资源

作者

Jaap Karan Singh

想要更多吗?

在博客上深入了解我们最新的安全编码见解。

我们广泛的资源库旨在增强人类对安全编码技术提升的方法。

查看博客
想要更多吗?

获取关于开发者驱动的安全的最新研究

我们广泛的资源库充满了有用的资源,从白皮书到网络研讨会,让你开始使用开发者驱动的安全编码。现在就去探索它。

资源中心

编码员征服安全。分享与学习系列 - 操作系统命令注入

发布日期:2019年02月07日
作者:Jaap Karan Singh

只要应用程序允许用户向外壳输入信息,但不采取任何行动来验证输入的字符串是否有效,就会发生操作系统命令注入攻击。这使攻击者能够将命令直接投放到托管应用程序的操作系统中,而且是在为被攻击的应用程序设置的任何权限级别。  

操作系统命令注入攻击可以由入门级和不太熟练的黑客执行,这使得它们成为安全团队遇到的最常见的弱点之一。值得庆幸的是,有不少非常有效的方法来防止它们的成功。在这一集里,我们将学习。

       它们是如何工作的

       为什么它们如此危险

       你如何能把防御措施放在适当的位置来阻止他们。

攻击者如何使用操作系统命令注入?

攻击者为了发起操作系统命令注入攻击,必须做的第一件事是在应用程序中找到用户输入。用户填写的表格是潜在的好跳板。最聪明的攻击者还可以使用诸如cookies甚至HTTP头文件作为他们的启动点,这几乎是每个应用程序或网站都会使用的东西。

他们需要做的第二件事是弄清楚什么操作系统是应用程序的主机。鉴于只有少数几个选择,试错在这个阶段可以很好地发挥作用。大多数应用服务器要么是基于Windows的(Windows的味道通常并不重要),要么是某种类型的Linux盒子,或者可能是Unix。

在这一点上,黑客修改了输入,在看似无害的输入中注入了一个操作系统的命令。这可以欺骗主机操作系统,使其以应用程序的任何权限级别执行非预期的命令。

例如,以下命令可以被应用程序中的有效用户用来查看一个文件的内容,在这种情况下,就是每月一次的董事会会议的记录。

exec("cat " + filename)

在我们的例子中,这将执行以下命令并将会议记录返回给用户。

$ ./cat MeetingNotes.txt
7月份的会议上有三名执行委员会成员出席。会议讨论了新的预算项目,但没有采取任何行动或投票。

当攻击者在输入的末尾添加额外的命令时,就会发生这种情况,例如在Linux中用于列出目录内容的命令。在这种情况下,显示会议记录的原始命令仍然发生。但恶意用户也会被显示目录中的其他一切内容,以及他们可以在后续的操作系统命令注入攻击中使用哪些其他命令。他们输入

$ ./cat MeetingNotes.txt && ls

而得到的却是这个。

7月份的会议上有三名执行委员会成员出席。会议讨论了新的预算项目,但没有采取任何行动或投票。

MeetingNotes.txt
JuneMeetingNotes.txt
MayMeetingNotes.txt
format.c
misnull.c
notefault.c
trunc.c
writewhatwhere.c

正如你所看到的,在这个案例中,黑客不仅看到了目录的内容,而且还得到了一个他们可以使用的其他命令的菜单 " 他们现在知道他们可以在主机操作系统上执行的命令。

为什么操作系统命令注入攻击如此危险?

允许用户绕过目标应用程序的目的并使用它来运行操作系统命令是非常危险的。攻击者可以很容易地执行破坏性的行动,例如窃取机密数据或格式化整个服务器驱动器。攻击者可用的选择只受操作系统内允许的命令和他们使用这些命令的创造力的限制。

操作系统命令在与应用程序相同的权限级别上运行。以管理权限运行的应用程序意味着入侵它们的黑客可以运行每个操作系统命令。

操作系统命令注入的攻击模式是众所周知的,也是有记录的。一个易受攻击的应用程序和专业黑客一样容易受到脚本儿童的攻击。没有什么技能的攻击者可以尝试将操作系统命令剪切和粘贴到应用程序中,看看会发生什么。

针对操作系统的命令注入获得安全许可

有几个好的技术可以阻止操作系统的命令注入。第一步是以完成其功能所需的最少权限来运行应用程序。这并不能阻止攻击,但是如果真的发生了漏洞,损失就会降到最低。

大多数编程语言和框架为常见的操作系统方法提供了API调用,如列出目录内容、创建或读取硬盘上的文件。从你的环境中消除操作系统命令注入的一个完美方法是让所有应用程序使用这些API调用,而不是直接使用操作系统命令。

在无法做到这一点的情况下,在操作系统命令中使用用户输入之前,要对其进行验证。白名单可以用来确保只有一小部分可信的值可以被使用。从技术上讲,使用黑名单也可以做到这一点,但允许的命令可能少得多,所以白名单几乎总是更容易。不要忘记在你的白名单中包括有效的POST和GET参数,以及经常被忽视的用户输入载体,如cookies。

最后,如果没有可用的编程API,并且不能使用白名单,那么在操作系统命令中使用用户输入的任何特殊字符之前,使用消毒库来转义这些字符。

关于操作系统命令注入攻击的更多信息

要进一步阅读,你可以看一下OWASP关于操作系统命令注入攻击的文章。你也可以用Secure Code Warrior 平台的免费演示来测试你新发现的防御知识,该平台培训网络安全团队成为终极网络战士。要了解更多关于击败这个漏洞以及其他威胁的流氓画廊,请访问Secure Code Warrior 博客。

我们希望得到您的许可,向您发送有关我们产品和/或相关安全编码主题的信息。我们将始终以最谨慎的态度对待您的个人资料,绝不会将其出售给其他公司用于营销目的。

提交
要提交表格,请启用 "分析 "cookies。完成后,请随时再次禁用它们。