• 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就出来了。

  • 相关阅读:
    51nod 1051【基础】
    HDU5971【瞎搞】
    Lightoj1018 【状压DP】
    HDU2604【矩阵快速幂】
    HDU1501【简单DP】
    HDU3555【数位DP】
    Lightoj1037【状压DP】
    51nod 1099【贪心】
    HDU5950【矩阵快速幂】
    51nod 1049【经典】
  • 原文地址:https://www.cnblogs.com/GH-D/p/8243765.html
Copyright © 2020-2023  润新知