漏洞原理到利用 之 unserialize反序列化漏洞

humbie   ·   发表于 2022-10-15 16:26:08   ·   学习杂记

类比单机游戏,序列化就是存档(记录当前状态),反序列化就是读档(还原存档时的状态)。
类:class:实现某种功能的集合。序列化和类是在一起的,类如同游戏本体,序列化相当于存档。
对象:概念,特殊的数据类型。showsource指读取文件内容并高亮显示,\_FILE__表示本文件路径。
serialize序列化函数,把对象存成字符串。(其他数据类型也可以,但一般存对象)
O:7:”chybeta”:1:{s:4:”test”;s:3:”123”;}
表示的是对象:名字长7:”名字”:变量数:{字符型变量:名长:名;字符型值:值长:值}。(数字型值为i表示)
unserialize反序列化,把上面那种字符串变回对象。
(反序列化漏洞一般很少挖,因为比较繁琐,而且只能白盒)
魔术方法(方法就是在类里的函数,而且都是下划线开头):满足条件执行XXX的代码。
__construct方法构造函数,是魔术方法,创建类(new时)则自动运行,反序列化不允许。
__wakeup是反序列化时执行的方法。
__destruct是析构函数,程序结束自动执行。
魔术方法就是因为没被调用但是触发了条件就执行的函数。
其他魔术方法可以搜索。
靶场是CTF:
CTF题一般都喜欢把flag放在flag.php或者flag.html等等文件内,可以先在url里添加flag.php,看看回显判断存不存在该文件。
(目录扫描也可以发现flag文件)
看到双下划线,就是魔术方法,可以搜索看他的功能。
highlight_file(a,b)高亮并显示文件a,但是如果第二个变量b(默认为false)为true,就不会输出了。
$this->source表示定义新的类里的变量source,且它需要从外部加载。
题目中想办法把对象中的source变成flag.php。
题中通过反序列化,把todos的cookie值改为序列化过的对象,其中前32位是后面所有位的md5。
构造序列化对象使他的source为flag.php。
此时需要输出才行。
<?=$todo?>是PHP特殊写法,PHP通用。(利用<?=语句?>)
特殊写法一句马:<?=eval(end($_REQUEST))?>end表示默认取数组的最后一位,所以这个一句马随便写密码。
输出是todos里的todo,而todo由foreach数组遍历而来,所以要把todos搞成数组。
利用$s=[$s]把s变量变成对象,从而构造反序列化的数组。
注意抓包传cookie时要用URL编码。

打赏我,让我更有动力~

0 条回复   |  直到 2022-10-15 | 500 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.