实验吧web天网管理系统

 

直接查看源码

 

<!--$test=$_GET['username']>这一行

 

源码的下面给了我们一些提示:我们输入的username经过md5加密后会赋值给test。当test为0时就会跳出新的东西,这时候我们就要构思,如何才能让test为0?
显然将0提前md5解密是不行的,而在php中==是只进行值的比较,不管二者的类型。当两个字符串进行==比?#31995;?#26102;候,PHP会把类数值的字符串转换为数值进行比较,如果参数是字符串,则返回字符串中第一个不是数字的字符之前的数字串所代表的整数值。比如: ‘3’ == ‘3ascasd’结果为true。
利用这个漏洞,我们就可以搞事情了:只需要找到解密后开头为0的就行了。

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,

它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,
其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

攻击者可以利用这一漏洞,
通过输入一个经过哈希后以”0E”开头的字符串,即会被PHP解释为0,
如果数据库中存在这种哈希值以”0E”开头的密码的话,他就可以以这个用户的身份登录进去,
尽管并没有真正的密码。

这里我们在网上找到几个这样的字符串:240610708,aabg7XSs,aabC9RqS 
随便选一个后,输入到username中,得到新的回显

 

SO,访问http://ctf5.shiyanbar.com/10/web1//user.php?fame=hjkleffifer  查看源码,如果password什么,就输出flag

 

补充知识,查手册:

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

序列化与反序列化: 
把复杂的数据类型压缩到一个字符串中 
serialize() 把变量和它们的值编码成文本?#38382;?nbsp;
unserialize() 恢复原先变量 

 

定义一个array数组,key为键名,www就是对应的array[‘key’]的键值

 

 

我们现在再回头看源码,只有user和pass都等于’???’时,才输出flag。但我们现在并不知道???到底是啥,这时候就涉及另一个知识点:bool类型的true跟?#25105;?#23383;符串可以弱类型相等。因此我们可以构造bool类型的序列化数据 ,无论比?#31995;?#20540;是什么,结果都为true。
所以我们在这里构造password:

a:2:{s:4:"user";b:1;s:4:"pass";b:1;}

(a代表array,s代表string,b代表bool,而数字代表个数/长度)
这个用数组的?#38382;?#34920;述就是:
Array ( [user] =>1 [pass] => 1 ),因为这里两个元素都是bool型元素,所以只有1和0两种。这里我们给他们赋值为1,就都为true,就满足==的条件了,输入过后就满足条件,得到flag

 

 部分内容取自https://blog.csdn.net/qq_41618162/article/details/81321451

posted @ 2019-03-14 22:16 安全超人 阅读(...) 评论(...) 编辑 收藏
耐克篮球多少钱