漏洞原理
RCE为两种漏洞的缩写,分别为Remote Command/Code Execute,远程命令/代码执行
PHP代码注入也叫PHP代码执行(Code Execute)(Web方面),是指应用程序过滤不严,用户可以通过HTTP请求将代码注入到应用中执行。代码注入(代码执行)类似于SQL注入漏洞。SQLi是将SQL语句注入到数据库中执行,而代码执行则是可以把代码注入到应用中最终由服务器运行它。这样的漏洞如果没有特殊的过滤,相当于直接有了一个Web后门(可以在服务器上执行任意命令)的存在。
PHP代码注入与SQL注入区别:
双方的注入方式是类似的,都是构造语句绕过服务器的过滤去执行。
区别在于SQL注入是将语句注入到数据库中执行,而PHP代码执行则是通过将代码注入到应用中,最终由服务器运行
造成PHP代码注入前提条件:
程序中含有可以执行PHP代码的函数或者语言结构
传入该函数或语言结构的参数是客户端可控,可以直接修改或造成影响,且应用程序过滤不严。
漏洞危害
Web应用如果存在代码执行漏洞时非常危险的,这样的漏洞如果没有特殊的过滤,相当于直接有一个WEB后门的存在。可以通过代码执行漏洞继承Web用户权限,执行任意代码。如果服务器没有正确配置或Web用户权限比较高的话,我们可以读写目标服务器任意文件内容,甚至控制整个网站以及服务器。
PHP中常见的代码执行函数和语句
PHP中有很多函数和语句都会造成PHP代码执行漏洞。本文以PHP为例子来说明,代码执行漏洞。
● eval() 将字符串当作php 代码执行
● assert() 同样会作为PHP 代码执行
● preg_replace() 当php版本小于7时,当为 /e 时代码会执行
● call_user_func() 回调函数,可以使用is_callable查看是否可以进行调用
● call_user_fuc_array() 回调函数,参数为数组
● create_function() 创建匿名函数
● array_map() 为数组的每个元素应用回调函数
● array_filter() 依次将 array 数组中的每个值传递到 callback函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含,在返回的结果数组中。数组的键名保留不变。
● usort() 使用自定义函数对数组进行排序
一句话木马就是利用的代码执行漏洞:
<?php @eval($_POST[cmd]);?>
eval()
作用: eval()函数会将字符串作为PHP代码执行。
该字符串必须是合法的 PHP 代码。eval函数自带输出功能,不需要再使用echo进行输出。
例子:
<?php
$str="phpinfo();";
eval($str);
?>
在网站根目录下新建codei文件夹,在该文件夹下新建文件eval.php,并写入如上代码
![](https://img-blog.csdnimg.cn/img_convert/7d3ce0d6f04e26aed1eac7f7e6ff0ee4.png)
打开浏览器访问该文件,网页显示如下
![](https://img-blog.csdnimg.cn/img_convert/5a2e95de0be9f8875430d1fb9a6ece31.png)
我们如下修改代码,网页显示如下
<?php
$str="echo md5 (123456);";
eval($str);
?>
![](https://img-blog.csdnimg.cn/img_convert/a2abe5c24b86bfdb172e792554dcc86c.png)
总结:通过以上两个例子,我们发现eval函数会将它的参数字符串按照PHP代码去执行
Q:那么eval函数的漏洞体现在哪里呢?
A:我们可以看到$str中的str是一个动态的变量,那如果这个动态的变量$str客户端可控,客户端可控意思就是客户端用户通过一些特殊的方法,这些方法可能是正常的业务,也可能是一些比较不正常的做法,然后造成$str客户端可控。简单来说,客户端可控就是用户的操作会影响到$str的值。
那么我们修改一下代码,让$str可控,代码如下,其中的全局变量$_GET也可以是$_REQUEST等其他预定义超全局数组变量(预定义超全局数组作用:包含了GET参数,POST参数还有COOKIE参数,也就是说get方式,post方式还有