反序列化
引入
[Web/基础/反序列化]反序列化轻量总结_web反序列化 魔术方法白名单-CSDN博客
【Web方向】 3-0 PHP反序列化基础语法知识(续更中…)_o:1:“s”:1:{s:4:“test”;s:29:“”;}代码解释-CSDN博客
序列化(串行化):是将变量转换为可保存或传输的字符串的过程;
反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用;
这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性;
常见的php序列化和反序列化方式主要有:serialize,unserialize
反序列化中常见的魔术方法
1 |
|
反序列化绕过
protected和private绕过
如果变量前是protected,则是\x00*\x00类名的形式
如果变量前是private,则是\x00类名\x00的形式
绕过:
①:php7.1+反序列化对类属性不敏感,将protected改成public
②:手动将序列化后的形式改为protected或者private的标准形式,结合urlencode和base64编码进行操作
_wakeup绕过
原理:
当序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过__wakeup 的执行
示例:O:4:"Dino":**1**:{s:1:"a";s:4:"misc";}
改为O:4:"Dino":**2**:{s:1:"a";s:4:"misc";}
通过值的引用可以使$a的值与$b的值相等
例题1
1 |
|
在29行程序调用反序列化方法时,会自动执行__weakup()函数,而显然weakup方法会加密上传的序列化参数中的passwd,而sha1是不可逆加密算法,目前也没有合适的sha1碰撞的方式,故考虑到绕过__weakup()函数;
php的特性,当序列化后对象的参数列表中成员个数和实际个数不符合时会绕过 __weakup(); 因而先构造
O:6:”HaHaHa”:2:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:4:”wllm”;}
改成
O:6:”HaHaHa”:3:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:4:”wllm”;}
例题ez_unserialize
打开网页没看到题目,用御剑后台扫描一下
看到一个robots.txt
关于robots.txt,
robots协议也称爬虫协议、爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读取robots.txt文件来识别这个页面是否允许被抓取。 但是,这个robots协议不是防火墙,也没有强制执行力,搜索引擎完全可以忽视robots.txt文件去抓取网页的快照。 如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又称元数据)。
从robots文件中得知存在/cl45s.php,遂进入该目录下打开该文件,获得代码
?p=O:4:”wllm”:2:{s:5:”admin”;s:5:”admin”;s:6:”passwd”;s:3:”ctf”;}