和二进制漏洞中常用的ROP技术类似
标签:
0x00 序列化与反序列化序列化:
serialize()把东西转换为字节序列的过程称为东西的序列化
反序列化:
unserialize()把字节序列恢复为东西的过程称为东西的反序列化
这里就是转化成7个字节序列
s:strings类型,7:7个字节。
a:数组类型
i:int型
把数据类型压缩到字符中
这里我在前面文章中已经学习过:
https://www.cnblogs.com/wangtanzhi/p/12193930.html
protected 声明的字段为掩护字段,在所声明的类和该类的子类中可见,但在该类的东西实例中不偏见。因此掩护字段的字段名在序列化时,字段名前面会加上\0*\0的前缀。这里的 \0 暗示 ASCII 码为 0 的字符(不偏见字符),而不是 \0 组合。这也许解释了,为什么如果直接在网址上,通报\0*\0username会报错,因为实际上并不是\0,只是用它来取代ASCII值为0的字符。必需用python传值才可以。 private?声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的东西实例中均不偏见。因此私有字段的字段名在序列化时,类名和字段名前面城市加上\0的前缀。字符串长度也包孕所加前缀的长度。此中 \0 字符也是计算长度的。举个栗子:
<?php class?test{ ????private?$test1?=?"wtz2020"; ????public?$test2?=?"wtz2020"; ????protected?$test3?=?"wtz2020"; } $test?=?new?test();//实例化一个东西 echo?serialize(test); ?>ps:我们在写序列化时根基模板:
<?php class x{ } $x = new x(a);//a凡是在上面类中找到 echo serialize($x) ?> 0x02 缝隙素质unserialize函数的变量可控
php文件中存在可操作的类,类中有魔术要领
反序列化东西中存在魔术要领,而且魔术要领中的代码可以被控制,缝隙按照差此外代码可以导致各类打击,如代码注入,SQL注入,目录遍历等等。
在反序列化中,我们所能控制的数据就是东西中的各个属性值,所以在PHP的反序列化有一种缝隙操作要领叫做 "面向属性编程" ,即?POP( Property Oriented Programming)。和二进制缝隙中常用的ROP技术类似。在ROP中我们往往需要一段初始化gadgets来开始我们的整个操作过程,然后继续挪用其他gadgets。在PHP反序列化缝隙操作技术POP中,对应的初始化gadgets就是__wakeup()?或者是__destruct()?要领, 在最抱负的情况下能够实现缝隙操作的点就在这两个函数中,但往往我们需要从这个函数开始,逐步的跟进在这个函数中挪用到的所有函数,直至找到可以操作的点为止
下面列举些在跟进其函数挪用过程中需要存眷一些很有价值的函数。
如果在跟进措施过程中发明这些函数就要打起精神,一旦这些函数的参数我们能够控制,就有可能呈现高危缝隙.
0x04 魔术要领 __construct()当一个东西创建时被挪用 _destruct()当一个东西销毁时被挪用 __toString()当一个东西被看成一个字符串使用 __sleep() 在东西在被序列化之前运行 __wakeup将在序列化之后当即被挪用这些就是我们要存眷的几个魔术要领了,如果处事器能够接收我们反序列化过的字符串、并且未颠末滤的把此中的变量直接放进这些魔术要领里面的话,就容易造成很严重的缝隙了。
0x05缝隙挖掘技巧通过审计这些包来找到可操作的 POP链。
找PHP链的根基思路.
1.在各大风行的包中搜索 __wakeup() 和 __destruct() 函数.
2.追踪挪用过程
3.手工结构 并验证 POP 链
4.开发一个应用使用该库和自动加载机制,来测试exploit.
我们这里写一个php反序列化导致代码执行
魔术要领使用
**_destruct()**
当一个东西销毁时被挪用
这里我们只要结构payload:
序列化是我们之前结构好的就不写了
就能控制echo出的变量,导致代码执行
这里我们需要大白要一一对应:
好比:
在实际应用中,我们可以通过这种类似的要领来写入webshell,但是有时没有魔法要领使用,那么我们该怎么办呢?
操作要领如下:
寻找不异的函数名,把敏感函数和类联系在一起。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30678.html