#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)

题目地址:http://ctf5.shiyanbar.com/10/web1/
#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)
文章图片

首先还是查看页面源代码,发现注释有一个提示:
#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)
文章图片

当传入的username值经md5加密后等于0,就会返回某样东西!
如何绕过md5函数呢?可以参考下面这篇文章。
https://blog.csdn.net/dyw_666666/article/details/82348564
我们可以用QNKCDZO绕过。
#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)
文章图片

访问 http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer
得到以下代码:

$unserialize_str = $_POST['password']; $data_unserialize = unserialize($unserialize_str); if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???') { print_r($flag); }

知识扩展:
1) PHP序列化与反序列化
serialize() 对单一的已序列化的变量进行操作,将其转换回反序列化 PHP 的值。
返回的是转换之后的值,可为 integer、float、string、array 或 object。
如果传递的字符串不可解序列化,则返回 false,并产生一个 E_NOTICE。
unserialize() 恢复原来的变量,还原已经序列化的对象。
比如:
$b=array('user'=>"admin",'pass'=>"admin"); $a = serialize($b); var_dump($a); $b = unserialize($a); var_dump($b);

结果:
string(52) "a:2:{s:4:"user"; s:5:"admin"; s:4:"pass"; s:5:"admin"; }"array(2) { ["user"]=> string(5) "admin" ["pass"]=> string(5) "admin" }

(a代表array,s代表string,b代表bool,而数字代表个数/长度)
2) php弱类型
== : 比较运算符号,不会检查条件式的表达式的类型
===:恒等计算符,同时检查表达式的值与类型
当php进行一些数学计算的时候,当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
var_dump(0 == '0hhhhh'); //true var_dump(0 == 'abcdefg'); //true var_dump(1 == '1ooooo'); //true

bool类型的true跟任意字符串可以弱类型相等
true == "aaa" //true true == 111//true true == 0//false

从这道题的代码中我们可以得到下面的结论:
  1. 我们需要构造序列化的password填入,代码意思是把post提交的password值经过"反序列化"得到一个数组,要求数组里的user和pass都等于某个值时就打印flag。
  2. 加上代码提示布尔型
  3. bool类型的true跟任意字符串可以弱类型相等。因此我们可以构造bool类型的序列化数据,无论比较的值是什么,结果都为true。
Payload:
【#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)】password: a:2:{s:4:"user"; b:1; s:4:"pass"; b:1; }
#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)
文章图片

    推荐阅读