概述
RCE漏洞又叫远程代码执行漏洞,攻击者可以直接向后台服务器远程执行系统命令或者代码,从而对服务器进行控制。出现这种漏洞一般是系统在设计上需要给用户提供远程命令操作的接口,比如ping操作等一系列的命令,设计者在完成该功能时没有做好严格的安全控制,则可能导致攻击者通过他也想不到的命令从后台直接执行控制整台服务器。在这里我通过一些访问控制针对性的绕过来深入学习。
常见命令执行函数
命令执行
system() | 执行外部程序,并显示输出 |
---|---|
shell_exec() | 通过shell环境执行命令(Linux环境) |
exec() | 执行外部程序,不回显 |
passthru() | 执行外部程序,并显示原始输出 |
`命令 ` | 反引号可以在php代码中直接执行系统命令,回显加echo |
{命令,} | 花括号里面的内容也能够执行 |
代码执行
eval() | 传入参数作为php代码执行,原理:?><?=即需要加上分号结尾 |
---|---|
assert() | 传入参数直接当做代码执行不需要分号结尾 |
call_user_func() | 传入参数作为代码执行函数的参数如:call_user_func(“assert”,$_POST[‘cmd’]); |
create_function() | 创建匿名函数执行代码 |
array_map() | 将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组 |
call_user_func_array() | 将传入的参数作为数组的第一个值传递给代码执行函数比如:call_user_func_array(“assert”, a r r a y ) ; / / array);// array);//array[0]=$cmd; |
绕过技巧
突破长度限制
<?php
$param = $_REQUEST['param'];
if(strlen($param) < 17 && stripos($param,'eval') === false && stripos($param,'assert') === false)
{
eval($param);
}
看到这个代码可以发现想要实现命令执行感觉不是一件简单的事情,它过滤了两大命令执行函数,并且限制了代码执行长度,我们也就只能导出个phpinfo()函数查看如下
方法1
但是我们肯定不能局限于这里,想要能够实现更多的代码从而达到对服务器的控制,这里就可以考虑到一个Linux命令执行的特性:反引号 `命令` 将代码执行转变为命令执行
利用eval执行echo `$_GET[1]这条命令,并且绕过了过滤最后再将get参数传入到linux命令执行并回显
方法2
可以利用函数file_put_contents对文件进行写入,使用追加的方式将base64编码写入文件如图所示
利用burp suite将base64编码写入
然后调用
方法3
可以通过php特性,可变长参数修改http包为post接收,利用请求体接收url传参