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

题目地址:http://ctf5.shiyanbar.com/10/web1/

西普实验吧ctf-web-天网管理系统(序列化与反序列化)_第1张图片

 首先还是查看页面源代码,发现注释有一个提示:

西普实验吧ctf-web-天网管理系统(序列化与反序列化)_第2张图片

当传入的username值经md5加密后等于0,就会返回某样东西!

如何绕过md5函数呢?可以参考下面这篇文章。

https://blog.csdn.net/dyw_666666/article/details/82348564

我们可以用QNKCDZO绕过。

西普实验吧ctf-web-天网管理系统(序列化与反序列化)_第3张图片

访问 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:

password: a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
西普实验吧ctf-web-天网管理系统(序列化与反序列化)_第4张图片

你可能感兴趣的:(#,——【,Code,Audit】,★,CTF)