这题和常规的反序列化的题的区别是没有类,在常规的序列化题目中,一般都存在一个或者多个的类来使用魔术方法调用,这题的反序列化的用法在于传入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);
>