shal()函數繞過和session驗證繞過

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章