
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.3 命令注入
2.3.1 命令注入的概念
命令注入指当应用程序所执行命令的内容或部分内容来源于不可信赖的数据源时,程序本身没有对这些不可信赖的数据进行正确、合理的验证和过滤,导致系统执行了恶意命令。在Java应用程序中,若敏感函数的参数(如Runtime.getRuntime().exec(String command)中的command参数,该参数可为OS命令)由用户控制,则极易造成命令注入。本节分析命令注入产生的原因、危害以及修复方法。
2.3.2 命令注入的危害
命令注入利用应用程序的输入可以执行一些特殊的OS命令。例如,使用cpuinfo命令查看系统信息,使用shutdown命令关闭服务器。CVE中也有一些与之相关的漏洞信息,如表2-3所示。
表2-3 与命令注入相关的漏洞信息

2.3.3 实例代码
本节使用实例的完整源代码可参考本书配套资源文件夹,源文件名:CWE78_OS_Command_Injection__Property_01.java。
1)缺陷代码

上述代码的第31行使用了getProperty()函数获取用户的账户名称,在第46行将获取的账户名称和变量osCommand进行拼接,并直接执行了拼接的结果。攻击者可在用户的账户名称中存入特殊的OS命令进行操作,如删除文件、关闭主机等命令,从而造成命令注入。
2)修复代码

上述修复代码的第62行直接对变量data进行赋值,使敏感函数的参数值不由用户控制,当程序执行exec()函数时,参数来源于程序内部,这样就避免了命令注入。
2.3.4 如何避免命令注入
(1)程序对非受信的用户输入数据进行净化,删除不安全的字符。
(2)创建一份安全字符串列表,限制用户只能输入该列表的数据。
(3)不要让用户直接控制eval()、exec()、readObject()等函数的参数。
(4)使用源代码静态分析工具进行自动化检测,可以有效发现源代码中的命令注入问题。