经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 网络安全 » 查看文章
实验吧web天网管理系统
来源:cnblogs  作者:安全超人  时间:2019/3/18 9:00:25  对本文有异议

 

直接查看源码

 

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

 

源码的下面给了我们一些提示:我们输入的username经过md5加密后会赋值给test。当test为0时就会跳出新的东西,这时候我们就要构思,如何才能让test为0?
显然将0提前md5解密是不行的,而在php中==是只进行值的比较,不管二者的类型。当两个字符串进行==比较的时候,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() 把变量和它们的值编码成文本形式 
unserialize() 恢复原先变量 

 

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

 

 

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

  1. 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

 

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

原文链接:http://www.cnblogs.com/liqik/p/10534012.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号