PHP反序列化逃逸[入门篇]

渗透技巧 2年前 (2022) admin
542 0 0

题记

世界上任何书籍都不能带给你好运,但是它们能让你悄悄成为你自己。——赫尔曼·黑塞


php反序列化是ctf中常见的考点,包括反序列化逃逸,phar反序列化等知识,这边文章主要介绍反序列化逃逸。

序列化和反序列化的过程


首先我们来看一下序列化和反序列化的过程

在本地写一个简单的php类,输出它序列化后的数据以及反序列化后对象中的变量

PHP反序列化逃逸[入门篇]


序列化数据的格式


O:4:"test":2:{s:4:"user";s:5:"admin";s:6:"passwd";s:6:"123456";}

O:对象4:test名称长度2:两个变量s:字符串

例如s:4就代表后面引号的字符有4个,系统在读取时就只会读取这4个,如果我们手动修改把字符数改为5个就会引起报错因为会把后面的引号读进来作为字符从而缺少引号而产生异常。但我们可以修改提交的数据让多出的字符恰好等于后面的部分,比如将原本的”admin”改成admin”;s:6:”passwd”;s:6:”123456″;},这样序列化的数据就变成了O:4:”test”:2:{s:4:”user”;s:5:”admin”;s:6:”passwd”;s:6:”123456″;}“;s:6:”passwd”;s:6:”123456″;},原本正常的后面部分就被我们插入的数据替换了,实现了数据可控。


而这种逃逸一般出现在替换方式的字符过滤中

例如我们编写这样一段代码:

PHP反序列化逃逸[入门篇]

“;s:6:”passwd”;s:6:”123456″;}共29个字符,经过filter函数替换过滤后每个or变成and多出一个字符,29个or替换成and多出29个字符恰好将后面的”;s:6:”passwd”;s:6:”123456″;}挤出去,而我们提交的”;s:6:”passwd”;s:6:”123456″;}恰好替换成功,反序列化后输出passwd变量的值正常说明逃逸成功。

例题

再来看一个ctf例题:

Ctfshow web1_此夜圆

PHP反序列化逃逸[入门篇]

通过代码审计可知若想取得flag,所提交的password要等于yu22x,但password在下面以变量的形式写死了。又看到filter函数将Firebasky替换成Firebaskyup,每次替换会增加两个字符,又存在序列化和反序列化的过程,基本断定是反序列化逃逸

首先逃逸点肯定在uname,将我们自己构造的password字段逃逸进来,我们先本地看一下class a序列化后的数据:

O:1:"a":2:{s:5:"uname";s:0:"";s:8:"password";i:1;}

需要我们逃逸出去的部分是”;s:8:”password”;i:1;},同时修改password修改成字符yu22x逃逸进来,添加进来的部分就是”;s:8:”password”;s:5:”yu22x”;}

共30个字符,需要15个Firebasky替换成Firebaskyup,构造payload:

FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}

Get方式传参给1得到flag

PHP反序列化逃逸[入门篇]

以上就是PHP反序列化符逃逸的入门内容,更多请关注Drt安全公众号其它相关文章


0x0 师傅不加个群嘛


PHP反序列化逃逸[入门篇]

     微信群后台回复获取进群链接


欢迎 点赞 + 在看并分享本公众号 给更多师傅们哈

❤️

—————-往期精选—————–
树莓派内网穿透总结

文件系统取证分析-卷的效验分析
简单聊一聊对微信小程序渗透测试的思路

信息收集之-你不知道的骚思路

练习内网渗透的时候的一个靶场练习


原文始发于微信公众号(Drt安全战队):PHP反序列化逃逸[入门篇]

版权声明:admin 发表于 2022年11月27日 下午1:17。
转载请注明:PHP反序列化逃逸[入门篇] | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...