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

[安洵杯 2019]easy_serialize_php

时间:2023-09-24 11:33:50浏览次数:33  
标签:php img serialize 安洵 SESSION 2019 键值 序列化 payload

[安洵杯 2019]easy_serialize_php

分析源码:

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

第一部分:

image-20230919102318308

首先获取get方式传入的"f"的值,然后是一个过滤函数,将几个关键的字符串替换为空

第二部分:

image-20230919102523059

这里是指如果用户没有POST传值,则SESSION这个数组会有两个默认的键值,extract()函数为从数组中将变量导入当前的符号表,这里的extract()可以进行变量覆盖,当我们POST传入SESSION["test"]=666时,此时的_SESSION数组中就只剩我们传入的值了

第三部分:

image-20230919103154895

这里通过get取得img_path的值,如果没有获取到,则将'guest_img.png'进行base64编码,然后存入_SESSION数组作为'img'的值,如果获取到则对传入的值进行base64编码之后在进行sha1哈希计算存入

第四部分:

image-20230919103519132

这里首先对_SESSION数组进行序列化之后再通过filter()函数过滤,然后下面对传入的'f'变量的值进行判断,根据提示,我们传入phpinfo

image-20230919104136925

这里我们发现了关键的文件d0g3_f1ag.php,推测flag就在这个文件当中,要想办法读到这个文件的内容,关键的操作就在最后一个判断中,若传入show_image则对刚才序列化之后通过过滤的数据再进行反序列化,然后再读取img的内容再进行base64解码,所以这里要构造解码之后的值为d0g3_f1ag.php

解题思路

这里首先可以尝试从传入img_path的值入手,但是发现并没有对sha1逆向的操作,所以这条路走不通,那么第二条路就只能POST传入_SESSION数组的键值来构造,这里因为考虑到有过滤,所以应该使用反序列化字符逃逸来构造payload

1、键值逃逸

该方法通过在传入的键“值”上构造一个会被过滤的字符串,然后在之后的键值中构造恶意payload,这里先给出完整payload:

_SESSION[user]=flagflagflagflagflagphp&_SESSION[function]=";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:6:"hacker";s:4:"hack";}

我们在自己的环境之中测试,加上输出的代码

image-20230919105748430

结果如下

image-20230919105828504

这里的a表示数组,3表示有三个键值对,这里可以看到我们传入的flagflagflagflagflagphp被过滤了,但是php在进行反序列化的时候会严格按照前面的长度来读取,所以此时user的值就变成了";s:8:"function";s:65:",然后第二个键值就变成了我们构造的img以及d0g3_f1ag.php的base64编码。

我们payload的最后还加了;s:6:"hacker";s:4:"hack";}是因为前面的定义了整个数组的长度为3,所以这里要补上一个键值,而payload最后的花括号“}”是为了把原本的img的键值给”挤出去“,在进行反序列化的时候前面的部分已经满足了要求,所以最后的";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}就被丢弃了

2、键名逃逸

该方法原理和上面类似,不过过滤的位置变成了键名,然后在对应的值的位置构造恶意paylaod,完整的payload如下:

_SESSION[flagphp]=;s:8:"anything";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}

结果如下:

image-20230919112403189

此时第一个键名为";s:55:,第一个键值为任意值,注意长度不要写错就行。之后的s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";为本题固定的payload

最后的花括号}在这里是因为这次我们实际上只POST了一个键值对,程序自己有一个img的键值对,所以在进行序列化之后,前面的总长度定义为2,但是在反序列化的时候,我们恶意构造的payload已经满足了反序列化的要求,所以后面的";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}会被丢弃掉

以上方法均可读取到d0g3_f1ag.php

image-20230919113404887

然后再利用上述方法继续逃逸即可得到flag

image-20230919113708397

所以本题flag为:flag{8fbcf44d-d361-41ab-b415-afc6b1532579}

标签:php,img,serialize,安洵,SESSION,2019,键值,序列化,payload
From: https://www.cnblogs.com/h40vv3n/p/17725758.html

相关文章

  • 在Visual Studio2019中使用C#语言连接Sql Server数据库
    1、首先在visualstudio里面创建好自己的表服务资源管理器-->连接数据库:然后选择sqlserver数据库文件,并自定义数据库名称,显示不存在点击创建即可;2、创建自己的程序对应的字段的表3、连接数据库操作1、引入连接数据库需要使用的using关键字2、编写Connection代码语句这......
  • visual studio2019创建管理系统的数据库
    1、打开服务资源管理器然后选择sqlserver数据库文件:自定义数据库名称:显示不存在之后,选择创建即可,然后就看到服务资源管理器这里出现:2、右键表-->添加新表然后新建一个名为UserTable的表,存放用户数据信息,字段名为:UId、UName、UPhone、UAddress、UPassword:然后点击左......
  • 用户加载界面设计--基于C#和Visual Studio2019
    1、设定窗体位置为屏幕中心、修改窗体为无边框形式修改右下角的这里:修改为(屏幕中心打开):修改右下角这里:修改为(无边框形式):然后再调整修改页的大小(自由拉伸即可):之后调整边框背景颜色:为窗体重命名:2、打开工具箱,拖出一个Label标签在这里可以修改Label的字体样式:设置......
  • 「解题报告」CSP - S 2019
    总分:100+55+10+32+12+40=249。[CSP-S2019]格雷码题目描述通常,人们习惯将所有\(n\)位二进制串按照字典序排列,例如所有2位二进制串按字典序从小到大排列为:00,01,10,11。格雷码(GrayCode)是一种特殊的\(n\)位二进制串排列法,它要求相邻的两个二进制串间恰好有一位......
  • P7200 [COCI2019-2020#1] Lutrija
    发现相邻的奇数只能恰好差\(2\)(偶质数只有\(2\))。而大于\(3\)的三个连续奇数至多有两个是质数,因为有一个能被\(3\)整除。对于357这三个数,我们可以构造成3527以归入下面的构造方法。所以相邻的奇数最多只有两个。但我们可以放偶质数\(2\)。显然,放多个\(2\)肯......
  • Buuctf——[ZJCTF 2019]NiZhuanSiWei
    审题进入题目链接发现是白盒审计<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf")){echo"&l......
  • 【英语作文】观点类作文写法(2019上海春考·共享衣物)
    题目假如你是明后中学的李华,你的朋友李楠给你写了一封信,告诉你他要开发一个新的APP,用这个软件共享衣服,想要征集大家的看法:你是否愿意共享你的衣服给出理由。brainstorm(立场选择)支持的理由:在追逐潮流的当下减少浪费、节约资源保护环境、鼓舞有环保意识的人积极投身实践......
  • Buuctf——[RoarCTF 2019]Easy Calc
     有waf,不能出现非数字参数值。使用%20num可以绕过waf(AbusingPHPquerystringparsertobypassIDS,IPS,andWAF(secjuice.com))过滤了单双引号,可以用chr()函数构造字符串?%20num=var_dump(scandir(chr(46))) ?%20num=show_source(chr(47).chr(102).chr(49).chr(97).ch......
  • shiro-721 CVE-2019-12422
    漏洞描述ApacheShiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。ApacheShiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base......
  • 2019, XII Samara Regional Intercollegiate Programming Contest
    \(ProblemA.RoomsandPassages\)倒着处理每个位置正数的最前部的位置。如果是正数,显然答案为后一个位置的答案\(+1\)。如果是负数且前面出现过相应的正数,答案要对这个区间长度\(-1\)的取\(min\)。voidsolve(){intn=read();vector<int>a(n+2),cnt(n+2,-1)......