命令执行漏洞是指攻击者可以随意执行系统命令,在B/S架构和C/S架构都存在,是高危漏洞之一。
命令执行漏洞原理:
当应用需要调用一些外部程序去处理内容的情况下,就会用到需要执行系统命令的函数。如PHP中system、exec、shell_exec等,如果用户可以控制命令执行函数中的参数,将可以注入恶意系统命令道正常的命令中,造成命令执行漏洞。
命令执行漏洞成因:
代码层过滤不严格:
商业应用需要执行命令,商业应用的一些核心代码可能封住在二进制中,在web应用中通过system函数调用。
调用第三方组件存在的代码执行漏洞:
如wordpess,可以选择imagemagick这个常用的图片处理组件,处理用户上传图片时造成的命令执行。例如JAVA中stryts2、elasticsearch groovy等。
命令执行漏洞的防御:
不执行外部的应用程序或命令
尽量使用自定义函数或函数库实现外部应用程序或命令的功能。在执行system、eval等命令执行功能的函数前,要确认参数内容。
使用escapeshellarg函数处理相关参数
escapeshellarg函数会将用户引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“’”,双引号“"”会被转义为“"”,分号“;”会被转义为“;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中包括的单引号或双引号,使其无法对当前执行进行截断,实现防范命令注入攻击的目的。
使用safe_mode_exec_dir执行可执行的文件路径
将php.ini文件中的safe_mode设置为On,然后将允许执行的文件放入一个目录,并使用safe_mode_exec_dir指定这个可执行的文件路径。这样,在需要执行相应的外部程序时,程序必须在safe_mode_exec_dir指定的目录中才会允许执行,否则执行将失败。
存在命令执行的函数讲解见博客:《命令执行函数讲解》