zoukankan      html  css  js  c++  java
  • php序列化与反序列化

    jarvisoj上的一道题

    http://web.jarvisoj.com:32784/

    是关于php序列化以及反序列化引起的问题,我看wp和各种百度理解的

    大神的wp  https://chybeta.github.io/2017/07/05/jarvisoj-web-writeup/#PHPINFO

    题目给直接给出了源代码

    ini_set('session.serialize_handler', 'php');

    这句话是关键,漏洞产生在php_serializephp解析方式上。

    如果我们通过php_serialize的方式构造序列化语句,然后通过php的方式解析序列化语句,就会出现问题。原因是在使用php_serialize构造过程中,可以在字符串变量中储存 | 符号,但是如果按照php的方式解析的话,会把 | 之前的语句当做数组的键,之后的语句当做值,这时我们就可以按照这个特性来构造执行对象的命令。(这里不是很明白,实验后大概就是可以利用这个来执行一些权限允许的命令,以后再碰到这样的题目就应该可以有更深的理解了)

    这里没有某个值是用来接受我们传入的数据,并储存到$_SESSION中的。通过查看phpinfo页面可以看到session.upload_progress.enabled是被打开了的也就是允许上传文件。

    当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session

     

    这里就实现了上面的文字描述的内容

    再写个php,弄出序列化后的内容,将mdzz赋值为想要序列化的内容

     

    先求出print_r(scandir(dirname(__FILE__)));序列化后的内容,这个里面涉及到的函数全靠百度和官方文档...,大概意思是可以打印出web根目录下的所有文件名称

    O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}

    这是序列化后的内容。

    打开那个我们做的html上传任一文件,用burp截断,修改filename,这里需要在”前加上防止转义,并且在最前面加上|,这是session的格式。

    不太会用这个,图像就是不太清晰

    这时我们查看phpinfo界面,可以发现_SESSION["SCRIPT_FILENAME"]中标注了index.php所在的目录/opt/lampp/htdocs/,而我们想要的文件也在里面

    接下来就是去获取那个可疑文件的内容

    print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));将这个序列化,和前面一样上传,就可以得到该文件的内容,有关于file_get_contents()和file()的区别和作用,靠百度...我试了file()也是一样可以的。

    这时flag就出来了。

  • 相关阅读:
    linux之awk命令
    HDU 2097 Sky数 进制转换
    HDU 2077 汉诺塔IV
    HDU 2094 产生冠军 dfs加map容器
    HDU 2073 叠框
    HDU 2083 简易版之最短距离
    HDU 2063 过山车 二分匹配
    天梯 1014 装箱问题
    天梯 1214 线段覆盖
    天梯 1098 均分纸牌
  • 原文地址:https://www.cnblogs.com/GH-D/p/8243765.html
Copyright © 2011-2022 走看看