[HUBUCTF 2022 新生赛]checkin

文章讨论了PHP中一个没有类的反序列化问题,强调了如何利用关联数组和弱比较在`info`参数中同时传递`username`和`password`进行验证。作者解释了为何选择关联数组而非单独变量输入。
摘要由CSDN通过智能技术生成

这题和常规的反序列化的题的区别是没有类,在常规的序列化题目中,一般都存在一个或者多个的类来使用魔术方法调用,这题的反序列化的用法在于传入username和passward时的序列化

先看代码

<?php
show_source(__FILE__);
$username  = "this_is_secret"; 
$password  = "this_is_not_known_to_you"; 
include("flag.php");//here I changed those two 
$info = isset($_GET['info'])? $_GET['info']: "" ;
$data_unserialize = unserialize($info);
if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
    echo $flag;
}else{
    echo "username or password error!";

}

?>

代码中没有给username和passward,并且说他把密码和用户名都改了,所以应该不是要获取,先往下看;

$info = isset($_GET['info'])? $_GET['info']: "" ;

这一句中,isset是 很熟悉的,用来判断传参 的参数是否存在的,但是这里不同,用到了三元运算符,(条件)?(值1):(值2);

当条件成立时,执行值1;否则执行值2;

if ($data_unserialize['username']==$username&&$data_unserialize['password']==$password){
    echo $flag;

if语句,是比较反序列化后的值,和传入的值,并且是弱比较,那么这里就要在info参数传入username和passward两个变量,再进行==的弱比较

当值为true时,比较返回true,成立;那么要同时传入两个参数并且进行序列化输出,可以用到php关联数组,把变量作为键,把需要赋的值当作值,在访问键的时候就等于访问值

(这里提一下,可能有疑问为什么要用关联数组传入,不能一个变量一个变量的传入,我的理解是题目中给的传参的参数就是info,所以只能用过info传入两个变量,那么就通过数组传入进行执行)

<?php
$a=array('username'=>true,'passward'=>true);
echo serialize($a);
>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值