一、shal()函数绕过
<?php
$flag = "flag";
if (isset($_GET['name']) and isset($_GET['password']))
{
if ($_GET['name'] == $_GET['password'])
echo '<p>Your password can not be your name!</p>';
else if (sha1($_GET['name']) === sha1($_GET['password']))
die('Flag: '.$flag);
else
echo '<p>Invalid password.</p>';
}
else
echo '<p>Login first!</p>';
?>
审计这段代码可以发现要输出flag就必须满足2个条件
1、name和password的值不相同
2、name和password的值和类型都相同
payload为?name[]=1&password[]=2
这样在第一处判断时两数组确实是不同的,但在第二处判断时由于sha1()函数无法处理数组类型,将报错并返回false,if 条件成立,获得flag。
注意md5()函数同样存在此漏洞。
二、session验证绕过
<?php
$flag = "flag";
session_start();
if (isset ($_GET['password'])) {
if ($_GET['password'] == $_SESSION['password'])
die ('Flag: '.$flag);
else
print '<p>Wrong guess.</p>';
}
mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>
审计代码发现,需要session中的password值和用户传的一样,就可以打印flag,
所以只需要删掉session值,或者修改session值为一个不存在的session,服务器获取不到session,则password为空,用户传一个空的password的进去即可拿到flag。
注意:
在PHP配置中的默认情况下,Session是用Session ID来确定当前对话所对应的服务器Session,sessionID可在cookie中找到,当我们删除cookie中的sessionID后,$_SESSION[‘password’]
就会返回空,我们同样传入空的password就能绕过了。
payload为password=