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

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

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

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

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

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

我们可以用QNKCDZO绕过。

访问 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;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟敛寒林o

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值