命令注入_代码执行漏洞和命令注入漏洞

1.代码执行漏洞

简介

代码执行漏洞是由于程序未对用户提交的参数进行过滤(方便开发人员进行系统主题模板的调用或者灵活地逻辑判断 ),直接将传入的参数当成脚本代码来执行的漏洞, 当这些代码中的参数可控的时候,恶意用户就可以插入自己想要执行的代码/命令,这些代码被执行之后就造成了漏洞。

测试代码:

这里我们可疑发现code参数是可以通过eval函数进行执行的,所以直接将code参数改为自己需要的代码,这里插入的是phpinfo函数,运行结果如下。

命令注入_代码执行漏洞和命令注入漏洞_第1张图片

这是最基础的代码执行漏洞,有点类似于sql注入的原理。

PHP中的代码执行漏洞函数

这里说一下php中常用的代码执行漏洞的函数:

  1. mixed eval( string $code) 把字符串 code 作为PHP代码执行。但是这个函数需要如下条件才可以使用:

1.代码不能包含打开/关闭 PHP tags。比如不能传入:''。但仍然可以用合适的 PHP tag 来离开、重新进入 PHP模式。比如 'echo "In PHP mode!"; ?>In HTML mode!
  1. bool assert ( mixed $assertion [, string $description ] )

assert()函数在PHP语言中是用来判断一个表达式是否成立,返回true or false。如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

eval()与assert()导致的代码执行漏洞大多原因是因为载入缓存或者模版以及对变量的处理不严格导致。例如直接将一个外部可控的参数拼接到模版里面,然后调用这两个函数去当作PHP代码执行。具体情况如上述的测试代码演示所示。

函数使用不当造成的代码执行漏洞

在php执行中,开发者想对输入进行过滤,但是调用的函数过滤不当也会造成代码执行漏洞

例如:call_user_func()、call_user_func_array ()、 array_map ()等几十个函数都可以调用其他函数的功能。其中一个参数为调用的函数名,如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想执行的代码(一般用phpinfo()做测试),下面具体说一下过程:

1.call_user_func( callable $callback[, mixed $parameter[, mixed $...]] )函数第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。该类函数的功能是调用函数,多用在框架中动态调用函数。所以一些小的程序出现这种方式的代码执行会很少。2.array_map( callable $callback, array $array1[, array $...] )返回数组,是为 array1 每个元素应用 callback函数之后的数组。callback 函数形参的数量和传给array_map() 数组数量,两者必须一样。

2.命令执行漏洞

简介

在编写PHP代码的过程中经常会有一些额外的需求,比如调用一个在系统中已经存在的命令,这时就需要调用一些函数来执行这些命令, 如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等。而当执行代码中的参数可控的时候,恶意用户就可以插入自己想要执行的代码或者命令,这些代码被执行之后就造成了漏洞。

命令执行和代码执行漏洞都是大同小异的,所以放在一起进行总结。

命令执行漏洞的典型危害

某电商的12GB用户信息数据包在网络上外泄,泄露的数据包中包括了用户名、密码、邮箱、QQ号、电话号、身份证信息等,其内部数据多达数千万条。某电商通过官方微信公众号针对此事件进行了证实与回应,此次用户信息泄露,源于Struts 2的安全漏洞,同时已迅速完成了系统修复。

其造成的安全隐患如下:

1. 继承Web服务程序的权限去执行系统命令或读写文件2. 反弹shell3. 控制整个网站甚至服务器4. 进一步内网渗透

php中常造成命令执行漏洞的函数

1. string system( string $command[, int &$return_var] )函数执行 command 参数所指定的命令,并且输出执行结果。2. string exec( string $command[, array &$output[, int &$return_var]] )exec() 执行 command 参数所指定的命令。3. string shell_exec( string $cmd)通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。4. void passthru( string $command[, int &$return_var] )执行外部程序并且显示原始输出。5. ``反引号例如`ls`,反引号的内容会被当做系统命令执行,其中内部就是执行了shell_exec()函数进行处理。6. void pcntl_exec( string $path[, array $args[, array $envs]] )pcntl是php的多进程处理扩展,在处理大量任务的情况下会使用到,pcntl需要额外安装。$path为可执行程序路径(/bin/bash)。$args表示传递给$path程序的参数。例如pcntl_exec(“/bin/bash" , array("whoami"));8. resource proc_open( string $cmd, array $descriptorspec, array &$pipes[, string $cwd[, array$env[, array $other_options]]])执行一个命令,并且打开用来输入/输出的文件指针。类似 popen() 函数,但是 proc_open() 提供了更加强大的控制程序执行的能力。

这两个漏洞怎么找:

一般这两个漏洞常见于两点,一个是类似于struct2、springboot这些常见的框架中,还有一种就是在业余人员编写的程序中,没有对输入的参数进行过滤,同时也没有对参数进行控制,让这些参数成为攻击代码(命令)在服务器中进行执行。

你可能感兴趣的:(命令注入)