利用pearcmd实现裸文件包含
利用pearcmd实现裸文件包含
在 ctf 中,常常有这样一类题:
题目很简单,一般围绕一个 include 函数展开。
例:
ctfshow 元旦水友赛 easy_include

这类题目没有提供文件上传点,因此不能使用常规方法上传一句话实现命令执行。
裸文件包含是一种针对这类题目的解题手法。
这里引入大佬的文章:https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
后面我的研究很多都是基于这篇文章的。
由于没有文件上传点,我们只能利用靶机本身的一些特殊文件的特性写入一句话实现命令执行。
常规的用法是日志文件包含,日志文件有以下特点
- 用户的请求会导致某些日志的跟新
- 用户请求中的某些参数会写入日志里(如User-Agent)
- 日志文件的默认位置一般是确定的
但是在 ctf 环境中,题目大多为 docker 环境,docker 环境下的日志会有很多变数(具体参考上面大佬的文章)
那么,docker 环境下,有没有什么更加普适性的方法来实现文件包含+命令执行呢?
接下来就要引出一个docker环境下很大概率会有的一个工具—— pear包管理系统
pear包管理系统
pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定
--with-pear才会安装。不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在
/usr/local/lib/php。
PEAR(PHP Extension and Application Repository)
这是一个PHP 的包管理系统,用于安装和管理 PHP 扩展和库。
PEAR 包管理器通常使用 pear 命令来执行各种操作,例如安装、更新和删除 PHP 包。
关键命令 config-create
我们关注这样一条命令
pear config-create <directory> <filename>
这个命令使用了 config-create 模式,表明要创建一个配置文件
:指定配置文件将保存的目录路径。
:指定要创建的配置文件的名称。
其中,如果我们把写成一句话木马,文件名写成 /tmp/cmd.php
这样,pear就会在 tmp 目录下创建一个包含一句话木马的配置文件。此时,我们再利用 ctf 题目本身的文件包含,包含这个一句话就能实现远控了。
那么,怎么调用到这个 pear 命令行工具呢?
pearcmd.php
pearcmd.php 的默认路径是 /usr/local/lib/php/pearcmd.php
这个文件的第64行 调用了一个 readPHPArgv() 方法来获取参数
https://github.com/AppStateESS/phpwebsite/blob/master/lib/pear/pearcmd.php

这个方法在 Getopt.php 的第273行定义
https://github.com/AppStateESS/phpwebsite/blob/master/lib/pear/Console/Getopt.php
function readPHPArgv()
{
global $argv;
if (!is_array($argv)) {
if (!@is_array($_SERVER['argv'])) {
if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
return PEAR::raiseError("Console_Getopt: Could not read cmd args (register_argc_argv=Off?)");
}
return $GLOBALS['HTTP_SERVER_VARS']['argv'];
}
return $_SERVER['argv'];
}
return $argv;
}
这个函数先尝试获取
$argv,如果不存在就再尝试$_SERVER['argv'],后者我们可通过query-string控制。
$argv 是命令行输入的参数,在ctf场景几乎用不到这个条件。
关键是这个 $_SERVER['argv'],这是我们可以控制的
$_SERVER['argv']
大佬原文的 0x06 的部分提到了这个参数的读取原理
https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html
docker环境下的 php.ini 会默认开启 register_argc_argv 这个配置

开启这个配置之后,我们get请求的参数就会被读取进 $_SERVER['argv'] 里
像这样

我们能在 phpinfo 里看到这个 $_SERVER['argv'] 的值

利用链
假设题目为:
<?php include($_GET['file']); ?>
那么我们可以构造如下请求(方便演示,这里写入 phpinfo )
/test.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php<?=phpinfo()?>+/tmp/hello.php
此时,服务端接收到的 $_SERVER[‘argv’] 参数就会是这种形式

这里有个坑:请求里的尖括号会被url编码
可以使用burp抓包,并直接修改回原来的符号
由于包含了 pearcmd.php ,那么接收到的参数就会传入pear工具,等价于执行以下命令:
pear config-create /&file=/usr/local/lib/php/pearcmd.php<?=phpinfo()?> /tmp/hello.php
执行这条命令后,会在 /tmp目录下创建一个hello.php的文件,这个文件里面就会带有上面那条命令里的第二个参数(含有一句话木马的字符串)
执行成功后一般会返回如下页面

此时再文件包含生成的 /tmp/hello.php,即可执行 phpinfo() 命令
/test.php?file=/tmp/hello.php

坑点:如果包含文件后发现尖括号被编码了,像这样
那么就不要用浏览器发起请求,直接用 burp 抓包修改回尖括号
同理,phpinfo 换成经典一句话,就可以实现命令执行。
总结
- 文件包含 pearcmd.php
- get 请求传入 参数列表(1. config-create模式 2. 一句话木马 3. 生成文件的位置)
- 文件包含生成的一句话木马文件,实现命令执行
利用pearcmd实现裸文件包含的更多相关文章
- [web安全] 利用pearcmd.php从LFI到getshell
有一段时间没写blog了,主要是事多,加上学的有些迷茫,所以内耗比较大.害,沉下心好好学吧. 漏洞利用背景: 允许文件包含,但session等各种文件包含都已经被过滤了.ctf题中可以关注regist ...
- Vulnhub系列:Tomato(文件包含getshell)
这个靶机挺有意思,它是通过文件包含漏洞进行的getshell,主要姿势是将含有一句话木马的内容记录到ssh的登录日志中,然后利用文件包含漏洞进行包含,从而拿到shell 0x01 靶机信息 靶机:To ...
- ctfshow_web入门 文件包含 学习
文件包含 额,这是一个做题带学习的一个笔记 算是半做题,半学习的笔记吧,所以能写的方法和注解都会写.难免先得啰嗦 由于截图都是白色背景,所以使用夜间模式(右上角哦~)观看比较易于区分图片与浏览器背景 ...
- phpMyAdmin 4.8.x 本地文件包含漏洞利用
phpMyAdmin 4.8.x 本地文件包含漏洞利用 今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用 ...
- php伪协议,利用文件包含漏洞
php支持多种封装协议,这些协议常被CTF出题中与文件包含漏洞结合,这里做个小总结.实验用的是DVWA平台,low级别,phpstudy中的设置为5.4.45版本, 设置allow_url_fopen ...
- php文件包含漏洞(利用phpinfo)复现
利用docker复现该漏洞,访问http://192.168.80.156:8080/phpinfo.php,可以看到页面出现phpinfo页面 再访问http://192.168.80.156:8 ...
- 利用PHP应用程序中的远程文件包含(RFI)并绕过远程URL包含限制
来源:http://www.mannulinux.org/2019/05/exploiting-rfi-in-php-bypass-remote-url-inclusion-restriction.h ...
- php://filter(文件包含漏洞利用)及php://input
1. php://filter 文件包含漏洞:https://blog.csdn.net/fageweiketang/article/details/80699051 筛选过滤应用: 1. 字符串过滤 ...
- PHP文件包含漏洞(利用phpinfo)复现
0x01 简介 PHP文件包含漏洞中,如果找不到可以包含的文件,我们可以通过包含临时文件的方法来getshell.因为临时文件名是随机的,如果目标网站上存在phpinfo,则可以通过phpinfo来获 ...
- 配合php伪协议利用文件包含漏洞
文章来源: https://blog.csdn.net/zpy1998zpy/article/details/80598768?utm_medium=distribute.pc_relevant.no ...
随机推荐
- 创业:大模型RAG系统三个月的开发心得和思考
1. 前言 自从和员外上家公司离职后,我们就自己搞公司投入到了RAG大模型的AI产品应用的开发中,这中间有一个春节,前后的总时间大概是三个月左右,在这三个月期间,基本是昼夜兼程啊,到今天3月底结束,产 ...
- 使用OHOS SDK构建opus
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/xiph/opus 进入 ...
- C 语言入门:如何编写 Hello World
C 语言简介 C 语言是由 Dennis Ritchie 于 1972 年在贝尔实验室创建的一种通用编程语言.尽管年代久远,它仍然是一款非常流行的语言.它之所以受欢迎的主要原因是它是计算机科学领域的基 ...
- Docker学习路线5:在 Docker 中实现数据持久化
Docker 可以运行隔离的容器,包括应用程序和其依赖项,与主机操作系统分离.默认情况下,容器是临时的,这意味着容器中存储的任何数据在终止后都将丢失.为了解决这个问题并在容器生命周期内保留数据,Doc ...
- 知识图谱增强的KG-RAG框架
昨天我们聊到KG在RAG中如何发挥作用,今天我们来看一个具体的例子. 我们找到一篇论文: https://arxiv.org/abs/2311.17330 ,论文的研究人员开发了一种名为知识图谱增强的 ...
- C 语言宏 + 内联汇编实现 MIPS 系统调用
目录 内联汇编 宏函数 宏定义 Syscall 内联汇编 编译测试 笔者最近作业要求练习 MIPS 汇编,熟悉 MIPS 汇编代码与 C 语言代码的对应关系.然而 SPIM/MARS 仿真器不能链接共 ...
- ES6中新增的Set、Map两种数据结构
如果要用一句话来描述,我们可以说 Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构 什么是集合?什么又是字典? 集合是由一堆无序的.相关联的,且不重复的内存结构[数学中称为元素]组成的组 ...
- vue截取video视频中的某一帧
在vue中如何做到给视频拍照,留住那一帧的美好呢? 且看代码 <template> <div> <video src="../assets/video.mp4& ...
- 如何使用XSSFWorkbook读取文本薄?
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/18146625 出自[进步*于辰的博客] 1.文件兼容类 ...
- 实际项目中一般使用到的git知识
1.项目上线分支管理流程 图片压缩太厉害有些模糊 700k 压缩到20多k 清晰些的图片地址https://project.zdzspace.cn/test-vuekey 2.一些常用的git命令 g ...
