首页 > 其他分享 >利用pearcmd实现裸文件包含

利用pearcmd实现裸文件包含

时间:2024-05-11 13:41:21浏览次数:28  
标签:文件 包含 pear argv SERVER pearcmd php

利用pearcmd实现裸文件包含

在 ctf 中,常常有这样一类题:

题目很简单,一般围绕一个 include 函数展开。

例:

ctfshow 元旦水友赛 easy_include

image-20240511014152812

这类题目没有提供文件上传点,因此不能使用常规方法上传一句话实现命令执行。

裸文件包含是一种针对这类题目的解题手法。

这里引入大佬的文章: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

image-20240511114700499

这个方法在 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 这个配置

image-20240511115527862

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

像这样

image-20240511115919454

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

image-20240511124018497

利用链

假设题目为:

<?php include($_GET['file']); ?>

那么我们可以构造如下请求(方便演示,这里写入 phpinfo )

/test.php?+config-create+/&file=/usr/local/lib/php/pearcmd.php<?=phpinfo()?>+/tmp/hello.php

此时,服务端接收到的 $_SERVER[‘argv’] 参数就会是这种形式

image-20240511130104687

这里有个坑:请求里的尖括号会被url编码

可以使用burp抓包,并直接修改回原来的符号

由于包含了 pearcmd.php ,那么接收到的参数就会传入pear工具,等价于执行以下命令:

pear config-create /&file=/usr/local/lib/php/pearcmd.php<?=phpinfo()?> /tmp/hello.php

执行这条命令后,会在 /tmp目录下创建一个hello.php的文件,这个文件里面就会带有上面那条命令里的第二个参数(含有一句话木马的字符串)

执行成功后一般会返回如下页面

image-20240511131215178

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

/test.php?file=/tmp/hello.php

image-20240511131548455

坑点:如果包含文件后发现尖括号被编码了,像这样

image-20240511131851970

那么就不要用浏览器发起请求,直接用 burp 抓包修改回尖括号

同理,phpinfo 换成经典一句话,就可以实现命令执行。

总结

  1. 文件包含 pearcmd.php
  2. get 请求传入 参数列表(1. config-create模式 2. 一句话木马 3. 生成文件的位置)
  3. 文件包含生成的一句话木马文件,实现命令执行

标签:文件,包含,pear,argv,SERVER,pearcmd,php
From: https://www.cnblogs.com/endermanneer/p/18186330

相关文章

  • 如何批量删除多个不同路径的文件但又保留文件夹呢
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、我准备了三个文件夹(实际操作的时候可能是上百个文件夹,无所谓),里面都放了两个图片2、然后打开工具,使用文件批量复制的模块,勾选“复制时先清空…”的选项,注意,第一栏“要复制的文件和文件夹”里面为空,这样就想相......
  • 如何批量复制多个文件到多个目录中(批量复制文件,多对多文件高效操作的方法)
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z现在开始说具体操作1、首先,我准备了3个文件夹和两个可爱的图片:当然,在实际使用的时候肯定不止这些,我这里只是演示一下下。2、然后打开这个工具,按下CTRL+5,切换到文件批量复制的功能模块。把两种图片选中后,拖......
  • tar文件header的格式和构造
    Header定义//standardarchiveformat-standardtar-ustarstructTarHeader{charname[100];//0-99charmode[8];//100-107charuid[8];//108-115chargid[8];//116-123charsize[12];//124-135charm......
  • 通过tftp或SSH中scp命令在linux服务器和linux开发板之间传输文件
    V1.02024年5月11日发布于博客园目录传送文件tftp协议★SSH协议scp命令SSH在Linux中连接另一个Linux配置开发板初始配置网络配置DNS文件配置脚本文件参考文档传送文件tftp协议#从电脑的TFTP主目录传送文件(比如a.txt)到开发板参数-g获取-r指定文件名tftp-g<......
  • 高端制造业,该选择怎样的文件外发控制系统才真正安全?
    高端制造业的类型多样,包括航空航天、新能源汽车、工业机器人、工业母机、激光加工等多个重要产业链。高端制造业是衡量一个国家核心竞争力的重要标志,也是制造业发展的必然过程。中国要实现由工业大国迈向工业强国的战略转型,就需要大力发展全球领先的高端制造产业。高端制造业技......
  • 文件IO学习【三】
    目录系统IO接口说明概念解释标准IO和系统IO的区别常用系统IO函数介绍打开文件关闭文件文件读取文件写入位置偏移系统IO接口说明概念解释由于Linux系统下“一切皆文件”,也就是Linux系统下的数据和程序都是以文件的形式存储的,所以Linux内核会提供一组操作文件的函数接口,这组函数......
  • SpringBoot整合Mybatis时mapper文件和xml文件的位置
    xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置mybatis.mapper-locations=classpath:mapper/*.xml或mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目......
  • Nginx 做静态文件服务器,多系统互相访问文件权限校验配置
    问题背景:接到个需求,客户有两个系统要互相访问文件,文件服务器是通过nginx搭建的,原来的访问地址如下:http://abc.cn/file/fa1a8d99a47b4c8c9d59152728af9930.docx客户说这个不安全,任何人都能访问,一定要做权限校验接到这个需求我觉得安全隐患不是很大,因为文件名是随机的,nginx也不支......
  • Django 静态文件管理与部署指南
    title:Django静态文件管理与部署指南date:2024/5/1017:38:36updated:2024/5/1017:38:36categories:后端开发tags:WebOptCDN加速DjangoCompressWebpackStaticDeployCICD-ToolsSecStatic第一章:介绍Django静态文件的概念和重要性在Web开发中,静态文件......
  • 重命名文件(%使用)
    这个脚本会遍历当前目录下所有以.txt结尾的文件,并将它们的后缀名修改为.md。forfilein*.txt;domv--"$file""${file%.txt}.md"done${file%.txt}是Shell中的参数替换语法,它表示从变量$file的末尾匹配删除.txt字符串。这样,${file%.txt}就是将变量$file......