前言

昨天在易霖博搞的网络安全与执法竞赛看到的一道web题,实际上就是用两个原题凑起来的。。

不过后面的一关没见过这里简单记录一下

第一关

打开是个登录界面,和BJDCTF的简单注入一模一样,连密码都一样。。

第二关

登录后得到

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL); include 'flag.php'; //defines $flag class B {
function __destruct() {//当一个对象销毁时被调用或者脚本结束时调用
global $flag;
echo $flag;
}
} if (isset($_POST['payload'])) {
ob_start();//打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面,可选得回调函数用于处理输出结果信息。
$a = unserialize($_POST['payload']);
if ($a === False) {
ob_end_clean();//清空(擦除)缓冲区并关闭输出缓冲
}
throw new Exception('Something tragic happened');//抛出一个错误
}
?>

还是原题 Websec level 30

payload:

a:2:{i:0;O:1:"B":0:{}i:0;i:1;}

详细可以参考:

[https://kangwoosun.github.io/webhacking/2020/03/28/Websec/]

[https://www.evonide.com/breaking-phps-garbage-collection-and-unserialize/#comments]

[https://www.evonide.com/fuzzing-unserialize/]

以下是个人的浅薄理解

如果传入一个序列化的数组,并且这个数组中存在两个或多个key相等的变量,那么反序列化的时侯将删除首先输入的变量。因此,如果将类 B 对象作为value冗余,则将调用析构函数,而不会导致反序列化错误,即先解析 O:1:"B":0:{} 生成一个对象,然后在向后解析又遇到 i:0 于是将前一个 i:0 的值改为1,就相当于消灭了之前生成的对象于是触发__destruct函数,之后也是冗余的关系使得反序列化的结果返回的是 array(0=>1) ,不为False,于是不会进入到ob_end_clean(),最后输出flag

这题如果直接传入

O:1:"B":0:{}

是不会输出flag,因为虽然这样反序列化得到的a是一个对象不等于False,但是之后会通过throw new 抛出一个错误,它这里的抛出错误就类似于下了一个断点一样,使得脚本程序的运行停止在了这里,并没有结束,所以反序列化后的B对象仍然存在,不会触发__destruct

Websec level 30的更多相关文章

  1. blade and soul pvp guide

    PvP PvP in Blade and Soul is categorized into two types, a personal PvP called Arena and a large-sca ...

  2. Python全栈开发day7

    一.Python生成器/迭代器 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/env python # -*- coding:utf-8 -*- def shaw(n):     ...

  3. Windows平台下使用ffmpeg和segmenter实现m3u8直播点播

    1.安装windows media service 实现 流媒体服务器功能   2.windows media编码器 实现 直播推流   3.使用 vlc 将 mms://127.0.0.1/live ...

  4. WP8 对音视频格式支持的完整说明

    Supported media codecs for Windows Phone http://msdn.microsoft.com/en-us/library/windowsphone/develo ...

  5. ELK日志分析系统(转)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://467754239.blog.51cto.com/4878013/1700828 ...

  6. Linux ffmpeg命令的介绍与使用

    ffmpeg使用语法 ffmpeg [[options][`-i' input_file]]... {[options] output_file}... 如果没有输入文件,那么视音频捕捉(只在Linu ...

  7. ELK 部署

    文章转载: http://www.open-open.com/doc/view/df156a76a824402482d1d72cd3b61e38 http://www.open-open.com/li ...

  8. 搭建HTTP Live Streaming直播系统

    最近,需要将苹果的HTTP Live Streaming系统搭建起来.完全没有头绪,故第一步就是学习. 一.学习资料 官网资料 1. http://developer.apple.com/resour ...

  9. 基于HTTP Live Streaming(HLS) 搭建在线点播系统

    1. 为何要使用HTTP Live Streaming 可以参考wikipedia HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTTP的流媒体 网络传输协议.是 ...

随机推荐

  1. 如何通过 JavaCSV 类库来优雅地(偷懒)读写 CSV 文件?

    欢迎关注笔者的公众号: 小哈学Java, 专注于推送 Java 领域优质干货文章!! 个人博客: https://www.exception.site/essay/how-to-create-read ...

  2. Visio2013 专业版激活码和激活工具 亲测有效

    Visio2013密钥 专业版:Visio Professional 2013 KEY C2FG9-N6J68-H8BTJ-BW3QX-RM3B3 2NYF6-QG2CY-9F8XC-GWMBW-29 ...

  3. HTML 基础(六)

    一.脚本 JavaScript 是 HTML 页面具有更强的动态和交互性 <script> 标签 <script> 标签用于定义客户端脚本,<script> 元素既 ...

  4. CSS3实现3D转换

    实现效果: 当鼠标悬停在图片上面时,图片发生翻转,文案出来,鼠标取消之后就又恢复 实现代码: <!DOCTYPE html> <html lang="en"> ...

  5. Javascript-什么是递归?

    递归? 程序调用自身的编程技巧就称之为递归(recursion),就是再运行的过程中调用自己,本质上就是循环. 构成递归的条件有: Ⅰ.不能无限制的调用本身,必须有一个出口,化为简单的状况处理(非递归 ...

  6. O - Layout(差分约束 + spfa)

    O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...

  7. Java并发基础07. ThreadLocal类以及应用技巧

    在前面的文章(6. 线程范围内共享数据)总结了一下,线程范围内的数据共享问题,即定义一个 Map,将当前线程名称和线程中的数据以键值对的形式存到 Map 中,然后在当前线程中使用数据的时候就可以根据当 ...

  8. Vertica的这些事(五)——-谈谈vertica的flex-table

    Json格式对于现在所有的软件开发者都不陌生,很多数据格式都用他来存储,我们来看一下vertica是怎么处理json数据的.这就是vertica的flex table! 首先创建一个json文件: { ...

  9. IntelliJ IDEA 激活码 [已购买,分享给码友]

    一.前言 笔者在网上找了一圈,各种方法都试过了,之前那种在网上随便找个注册码,过了一段时间就被封了,想了想还是经常用的和朋友一起购买了,方便日后使用 二.下载最新的 IDEA 其实也可以从老版本直接升 ...

  10. Pointer Lock API(1/3):Pointer Lock 的总体认识

    前言 指针锁定(Pointer Lock),以前也叫鼠标锁定,提供了基于鼠标随时间的移动(如deltaΔ)的输入方法,不仅仅是视窗区域鼠标的绝对位置.指针锁定让你能够访问原始的鼠标移动,将鼠标事件的目 ...