暑期练习web3:天网管理系统(实验吧)

我们首先打开题目,随便试试发现没有任何反应
暑期练习web3:天网管理系统(实验吧)_第1张图片
我们查看一下源码

<html>
<head>
<meta charset=utf8>
<title>最安全的管理系统title>
head>
<body>
<h1>天网管理系统h1>
<p>安全与你同在p>
<p>账户:admin  密码:adminp>
<p>就是这么光明正大的放置用户名和密码,爸爸说我们再也不会忘记密码啦。p>
<form enctype="multipart/form-data" method="post" action="index.php">
<table>
<th>
<td>大家请放心使用我们的产品。td>
th>
<tr>
<td>用户名:td><td><input type="text" name="username" value="admin">td>
tr>
<tr>
<td>密码:td><td><input type="text" name="password" value="admin">td>
tr>
<tr>
<td><input type="submit" value="登入系统"</td>
tr>
table>
form>

body>
html>

源码的下面给了我们一些提示:我们输入的username经过md5加密后会赋值给test。当test为0时就会跳出新的东西,这时候我们就要构思,如何才能让test为0?
显然将0提前md5解密是不行的,而在php中==是只进行值的比较,不管二者的类型。当两个字符串进行==比较的时候,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如: ‘3’ == ‘3ascasd’结果为true。
利用这个漏洞,我们就可以搞事情了:只需要找到解密后开头为0的就行了。
这里我们在网上找到几个这样的字符串:240610708,aabg7XSs,aabC9RqS
随便选一个后,输入到username中,得到新的回显
暑期练习web3:天网管理系统(实验吧)_第2张图片
访问这个网址: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);
     }
伟大的科学家php方言道:成也布尔,败也布尔。
回去吧骚年

先补充一波知识:
查手册:
unserialize() 对单一的已序列化的变量进行操作,将其转换回反序列化 PHP 的值。
返回的是转换之后的值,可为 integer、float、string、array 或 object。
如果传递的字符串不可解序列化,则返回 FALSE,并产生一个 E_NOTICE。

查定义:
序列化与反序列化:
把复杂的数据类型压缩到一个字符串中
serialize() 把变量和它们的值编码成文本形式
unserialize() 恢复原先变量
举个例子就是这样
定义一个array数组,key为键名,www就是对应的array[‘key’]的键值

 
$array = array(); 
$array['keys'] = 'www'; 
$array['values']='11111'; 
$a = serialize($array); 
echo $a; //序列化输出
unset($array); 
$a = unserialize($a); 
print_r($a);// 直接输出
?> 

输出

a:2:{s:4:"keys";s:3:"www";s:6:"values";s:5:"11111";}

Array ( [keys] => www [values] => 11111 )

我们现在再回头看源码,只有user和pass都等于’???’时,才输出flag。但我们现在并不知道???到底是啥,这时候就涉及另一个知识点:bool类型的true跟任意字符串可以弱类型相等。因此我们可以构造bool类型的序列化数据 ,无论比较的值是什么,结果都为true。
所以我们在这里构造password: a:2:{s:4:”user”;b:1;s:4:”pass”;b:1;}(a代表array,s代表string,b代表bool,而数字代表个数/长度)
这个用数组的形势表述就是:
Array ( [user] =>1 [pass] => 1 ),因为这里两个元素都是bool型元素,所以只有1和0两种。这里我们给他们赋值为1,就都为true,就满足==的条件了,输入过后就满足条件,得到flag
暑期练习web3:天网管理系统(实验吧)_第3张图片
总结:这道题要求的其实并不难,只需要我们理解源码中的内容,做出相应的构造,就能通过,对于基础知识不太熟悉的同学们,可能就有一定的困难,所以适当的检索信息的能力还是很重要的!

你可能感兴趣的:(ctf,web)