命令执行漏洞

命令执行漏洞原理

命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru()等函数,代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

 

命令执行漏洞应用例子:

日常的网络访问中,我们常常可以看到某些Web网站具有执行系统命令的功能,比如:有些网站提供ping功能,我们可以输入一个IP地址,它就会帮我们去尝试ping目标的IP地址,而我们则可以看到执行结果。
但是如果用户没有遵循网站的本意,而去输入精心构造的指令,可能会对网站本身的功能逻辑产生逆转,导致让目标网站执行恶意命令。

恶意用户通过将恶意系统命令拼接到正常命令中,让网站执行恶意命令

image

命令执行漏洞产生条件

  • 用户可控:可以控制输入的内容
  • 后台执行:用户输入的内容被当作命令执行

命令执行常用函数

一:反撇号:` `

` `输出并返回shell结果 相当于exec的效果

  1 payload:echo `whoami`

 

二:system()

system() 输出并返回最后一行shell结果

  1 payload:system('whoami')

三:passthru()

只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。

  1 payload:passthru('whoami')

四:exec()

不能输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面

  1 payload:exec($_POST['system'],$output);print_r($output);

五:shell_exec()

通过shell环境命令执行,并且将完整的输出以字符串的方式返回

  1 payload:shell_exec($_POST['system']);

六:其他函数

popen()、proc_open()、pcntl_exec()

注意事项:权限问题 => 权限和中间件运行有关 继承web运行权限

命令注入漏洞的危害跟web中间件运行的权限有关。由于web应用运行在web中间件上,所以web应用会“继承”web中间件的运行权限。如果存在命令注入漏洞的web应用运行在以系统管理员身份运行的web中间件上,那么通过web执行命令就相当于以管理员权限执行命令。

常用系统命令与功能:windows下同时执行多条命令语法格式

image

Windows下同时执行多条命令语法格式:

Comnand1 & Comnand2:

先后执行Comnand1和Comnand2,无论Comnand1执行是否成功
Comnand1 && Comnand2:

先后执行Comnand1和Comnand2,只有Comnand1执行成功时才执行Comnand2
Comnand1 || Comnand2:

先后执行Comnand1和Comnand1,只有Comnand1执行失败时才执行Comnand1
Comnand1 | Comnand2:

|是管道符,将Comnand1的执行结果传递给Comnand2

常用系统命令与功能:Linux下同时执行多条命令语法格式

image

Linux下同时执行多条命令语法格式:

Comnand1 ; Comnand2:

先后执行Comnand1和Comnand2,无论Comnand1执行是否成功
Comnand1 && Comnand2:

先后执行Comnand1和Comnand2,只有Comnand1执行成功时才执行Comnand2
Comnand1 || Comnand2:

先后执行Comnand1和Comnand1,只有Comnand1执行失败时才执行Comnand1
Comnand1 | Comnand2:

|是管道符,将Comnand1的执行结果传递给Comnand2

命令执行漏洞分类

1. web代码层命令执行:代码层过滤不严

商业应用的一些核心代码封装在二进制文件中,在Web应用中通过system函数来调用:
system("/bin/program --arg $arg");

 

2. 系统层面的漏洞造成命令注入

bash破壳漏洞(CVE-2014-6271)、MS08-67、永恒之蓝

 

3. 调用的第三方组件存在代码执行漏洞

WordPress中用来处理图片的ImageMagick组件
JAVA中的命令注入漏洞(struts2/ElasticsearchGroovy等)
vBulletin 5.x版本通杀远程代码执行

ThinkPHP命令执行

命令执行漏洞防御方式

  1. 尽量少用执行命令的函数或者直接禁用 ,在PHP下禁用高危系统函数,找到php.ini,查找到disable_functions,添加禁用的函数名
  2. 参数值尽量使用引号包括,并在拼接前调用addslashes函数进行转义
  3. 在使用动态函数之前,确保使用的函数是指定的函数之一
  4. 在进入执行命令的函数方法之前,对参数进行过滤,对敏感字符进行转义
  5. 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
原文地址:https://www.cnblogs.com/LeeeBoom/p/12378537.html