一、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=