#PHP反序列化原理:未对用户输入的序列化字符串进行检测,导致攻击者可以控制反序列化过程,从而导致代码执行,SQL注入,目录遍历等不可控后果。在反序列化的过程中自动触发了某些魔术方法。当进行反序列化的时候就有可能会触发对象中的一些魔术方法。serialize() //将一个对象转换成一个字符串unserialize() //将字符串还原成一个对象
在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数。
序列化 serialize()
反序列化 unserialize()
什么意思? JSON格式应该都知道吧
# 开发人员这里有字典 利用json函数转换成json格式dic = {'name':'ajie','age':'18'}json { "name" : "ajie", "age" : "18"}
序列化 函数也是这种操作方法。
看代码
serialize() 函数
$key = "name";echo serialize($key)输出:s:4:"name";什么意思? s 在代码中代表字符串,4 变量长度 ,name 是变量名
unserialize() 函数
$key = "s:4:"name";";echo serialize($key)// name
如果说 该漏洞是反序列化 url传参就是这种数值 x:x:"xxx";
如图所示:
本地靶场测试
# 主页面代码<?php header('content-type:text/html;charset=utf-8');error_reporting(0);include "flag.php";$KEY = "ajie";$str = $_GET['str'];if (unserialize($str) === "$KEY"){ flag();}show_source(__FILE__);// class ABC{// public $test;// function __construct(){// $test =1;// echo '调用了构造函数
';// }// function __destruct(){// echo '调用了析构函数
';// }// function __wakeup(){// echo '调用了苏醒函数
';// }// }// echo '创建对象a
';// $a = new ABC;// echo '序列化
';// $a_ser=serialize($a);// echo '反序列化
';// $a_unser = unserialize($a_ser);// echo '对象快要死了!';?># flag 代码<?php function flag(){ echo "flag{abcdgr}";}?>
观察源代码 发现 key的值是固定的 ajie str变量在url中通过GET方式去获取 又因为使用了反序列化函数 所以对字符进行比较 成功则返回flag。
在撸一把CTF反序列化小真题压压惊
https://ctf.bugku.com/challenges#flag.php
访问url 提示hint 所以url 后面使用hint进行字符接收
无论怎么输入 都无法点击 这个是很好在url 后面加上?hint再去访问
分析源码 观察 其实思路和刚才的那个一模一样 只不过要细心
变量 KEY在最下面 然后 利用代码将其转换
s:21:"ISecer:www.isecer.com";
哎 肿末回事?没反应呢 都说了仔细审题 cookie 需要对cookie 进行数据更改 打开burp
哎 不是说更改cookie就可以获取flag?? 你骗我??
ctf 之所以难呢 是因为审题不细心 php代码执行流程是从上到下依次执行 这个KEY在最后面 所以先执行cookie 哪里 再去对key进行赋值 所以 cookie哪里获取的值是空 这次再去尝试就可以获取flag