实验吧Web-天网管理系统

在这里插入图片描述
这里说明要为用户名传入一个字符串,并且它经过md5加密后要等于0。源码是get方式提交username,但是我们提交好多次依旧不行,于是我们在用户名那一栏填入数字。
知识讲解:

1.在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如:
‘3’ == ‘3ascasd’结果为true。
2.intval():变量转成整数类型 如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。 如果字符串第一个是‘-’,则从第二个开始算起。 如果参数是浮点数,则返回他取整之后的值。
当然intval()返回的值在一个4字节所能表示的范围之内(-2147483648~2147483647),对于超过这个范围的值将用边界值代替。

解题思路:
因此只要找到一个字串加密后第一个字符为0即可,这里提供几个:240610708,aabg7XSs,aabC9RqS
在用户名处输入以上其中一个字符串,提交后出现提示: /user.php?fame=hjkleffifer
访问得到源代码:
  在这里插入图片描述

  $unserialize_str = $_POST['password'];
  $data_unserialize = unserialize($unserialize_str);
  if ($data_unserialize['user'] == '???' && $data_unserialize['pass'] == '???') {
  print_r($flag);
  }

代码意思是把post提交的password值经过"反序列化"得到一个数组,要求数组里的user和pass都等于某个值时就打印flag。

但是我们不知道两处???到底是什么,因此无法考虑用php函数构造这样的值。

别忘了还有一个提示: “伟大的科学家php方言道:成也布尔,败也布尔” ,bool类型的true跟任意字符串可以弱类型相等(==)。因此我们可以构造bool类型的序列化数据 ,无论比较的值是什么,结果都为true。(a代表array,s代表string,b代表bool,而数字代表个数/长度)

在这里插入图片描述
得出答案:

<?php
$test = array("user"=>true,"pass"=>true);
$stest = serialize($test);
echo $stest."\n";
?>

一定要注意我们在得到flag的条件就是user和pass反序列化的结果都为true才可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值