悟空云课堂丨代码安全第五期:OS命令注入漏洞
该栏目为中科天齐全新规划的悟空云课堂,旨在科普软件安全相关知识,助力企业有效防范软件安全漏洞,提升网络安全防护能力。本期主题为OS命令注入漏洞的相关介绍。
一、什么是OS命令注入?
软件在构造OS命令时使用了外部输入的数据,如果没有对外部输入中可能影响OS命令的特殊元素进行过滤,或是过滤不充分/不正确,就有受到OS命令注入攻击的风险。
OS命令注入缺陷允许攻击者直接在操作系统执行各种命令,当缺陷存在于网页应用等无法直接访问操作系统的软件中时,会造成一些脆弱性问题。而当该缺陷存在于有高级权限的软件中时,攻击者可通过缺陷获得高级权限,从而造成极大的危害。
二、OS命令注入两种常见的子类型有哪些?
1、应用程序通过用户输入的参数来构造OS命令。
例如,程序可能使用system(“nslookup [HOSTNAME]”)来运行nslookup命令,其中的HOSTNAME由用户输入。由于没有检查HOSTNAME中是否存在命令分隔符,攻击者可将想执行的命令通过分隔符加在HOSTNAME中,当系统执行完nslookup后就会执行攻击者的命令;
2、应用程序将输入的整个字符串作为一个OS命令。
例如,通过exec([COMMAND])来执行命令,其中COMMAND由用户输入,此时攻击者可以通过命令分隔符注入命令。
三、OS命令注入漏洞会造成哪些后果?
关键词:执行未经授权的代码或命令; DoS:崩溃,退出或重启; 读取文件或目录; 修改文件或目录; 读取应用数据; 修改应用数据; 隐藏活动。
攻击者可以执行未经授权的命令,然后可以使用这些命令来禁用软件,或者读取和修改攻击者无权直接访问的数据。由于目标应用程序直接执行命令而不是攻击者,因此任何恶意活动似乎都来自应用程序或应用程序的所有者。
四、如何防范修补OS命令注入漏洞?
从架构和设计的角度来说:
1、要用最小权限去运行程序,不要给予程序多余的权限,最好只允许在特定的路径下运行,可以通过明确的路径运行命令;
2、尽可能使用库或框架:使用不允许此弱点出现的经过审核的库或框架,或提供更容易避免此弱点的构造。尽可能地使用库调用,而不是调用外部进程来完成所需功能。
3、减少被攻击面:对于那些被用于生成待执行命令的数据,尽可能避免其被外部可控的数据污染。
从实现的角度来说:
1、虽然使用动态生成的查询字符串,代码或命令将控制和数据混合在一起是有风险的,但有时它可能是不可避免的。正确引用参数并转义这些参数中的任何特殊字符。最保守的方法是转义或过滤所有未通过极其严格的白名单的字符(例如不是字母数字或空格的所有内容)。如果仍然需要一些特殊字符,例如空格,则在转义/过滤步骤之后将每个参数包装在引号中;
2、如果只允许运行有限的命令,使用白名单方式过滤。
五、OS命令注入漏洞样例: