题目地址:http://ctf5.shiyanbar.com/10/web1/
首先还是查看页面源代码,发现注释有一个提示:
当传入的username值经md5加密后等于0,就会返回某样东西!
如何绕过md5函数呢?可以参考下面这篇文章。
https://blog.csdn.net/dyw_666666/article/details/82348564
我们可以用QNKCDZO绕过。
访问 http://ctf5.shiyanbar.com/10/web1/user.php?fame=hjkleffifer
得到以下代码:
$unserialize_str = $_POST['password'];
$data_unserialize = unserialize($unserialize_str);
if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???')
{
print_r($flag);
}
知识扩展:
1) PHP序列化与反序列化
serialize() 对单一的已序列化的变量进行操作,将其转换回反序列化 PHP 的值。
返回的是转换之后的值,可为 integer、float、string、array 或 object。
如果传递的字符串不可解序列化,则返回 false,并产生一个 E_NOTICE。
unserialize() 恢复原来的变量,还原已经序列化的对象。
比如:
$b=array('user'=>"admin",'pass'=>"admin");
$a = serialize($b);
var_dump($a);
$b = unserialize($a);
var_dump($b);
结果:
string(52) "a:2:{s:4:"user";s:5:"admin";s:4:"pass";s:5:"admin";}"
array(2) { ["user"]=> string(5) "admin" ["pass"]=> string(5) "admin" }
(a代表array,s代表string,b代表bool,而数字代表个数/长度)
2) php弱类型
== : 比较运算符号,不会检查条件式的表达式的类型
===:恒等计算符,同时检查表达式的值与类型
当php进行一些数学计算的时候,当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
var_dump(0 == '0hhhhh'); //true
var_dump(0 == 'abcdefg'); //true
var_dump(1 == '1ooooo'); //true
bool类型的true跟任意字符串可以弱类型相等
true == "aaa" //true
true == 111 //true
true == 0 //false
从这道题的代码中我们可以得到下面的结论:
- 我们需要构造序列化的password填入,代码意思是把post提交的password值经过"反序列化"得到一个数组,要求数组里的user和pass都等于某个值时就打印flag。
- 加上代码提示布尔型。
- bool类型的true跟任意字符串可以弱类型相等。因此我们可以构造bool类型的序列化数据,无论比较的值是什么,结果都为true。
Payload:
password: a:2:{s:4:"user";b:1;s:4:"pass";b:1;}