PHP代碼審計三(登錄身份認證)

登錄認證功能

登錄認證功能不是指一個簡單的登錄過程,而是整個操作過程中的認證,目前的認證方式大多是基於CookieSession不少程序會把當前登錄的用戶賬號等認證信息放到Cookie中,或許是加密方式,是爲了保持用戶可以長時間登錄,不會因爲一退出瀏覽器或者Session超時就退出賬戶,進行操作的時候直接從Cookie中讀取出當前用戶信息,這裏就存在一個算法可信的問題,如果這段Cookie信息沒有加salt一類的東西,就可以導致任意用戶登錄漏洞,只要知道用戶的部分信息,即可生成認證令牌,甚至有的程序會直接把用戶明文放到Cookie中,操作的時候直接取這個用戶名的數據,這也是常說的越權漏洞。

用戶認證審計

  • 檢查代碼進行用戶認證的位置,是否能夠繞過認證,例如:登錄代碼可能存在表單注入
  • 檢查登錄代碼有無使用驗證碼等,防止暴力破解的手段
  • 檢查Session的時效性,能否因爲一個session的長久有效不銷燬,而導致驗證碼、密碼、用戶名破解成爲可能。

函數或文件的未認證調用

  • 一些管理頁面是禁止普通用戶訪問的,有時開發者會忘記對這些文件進行權限驗證,導致漏洞發生
  • 某些頁面使用參數調用功能,沒有經過權限驗證,比如 index.php?action=upload

密碼問題

  • 有的程序會把 數據庫連接 賬戶 和 密碼 直接寫到數據庫連接函數中。

身份認證漏洞

認證的目的是爲了認出用戶是誰,而授權的目的是爲了決定用戶能夠做什麼,身份認證實際上就是一個驗證憑證的過程。

Web身份認證通常使用CookieSessionOpenidOAuthSSOREST等進行認證,而其中最常使用的是Cookie和Session。 cookie和session都能夠進行會話跟蹤,它們的區別在於:

  • Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集羣、數據庫、文件中;
  • Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。

cookie身份認證漏洞

這種漏洞原理相當簡單,因爲cookie能夠存儲用戶信息,某些網站的權限驗證機制是直接讀取cookie中的字段來判斷權限,所以我們能夠 直接通過修改cookie中的值 來繞過驗證。

實例:
verification

<?php
    session_start();
    if(isset($_COOKIE['username']))
    {
        $username = $_COOKIE['username'];
        if($username == root)
    
            echo "<td width='150'><div align='middle'> 歡迎您登錄系統".$_SESSION['username']."管理員!</div></td>"; 
        if($username == shiyanlou)
            echo "<td width='150'><div align='middle'> 歡迎普通用戶                                    ".$_SESSION['username']."!</div></td>"; 
 
}
    echo "<td width='150'><div align='middle'> <a href='logout.php'> 註銷</a></div></td>"; 
?>

從上述代碼中看到,該頁面直接讀取cookie中的username字段進行的權限判斷,這種方式非常不安全。
打開瀏覽器,輸入URL:http://192.168.161.133/verification/login.html
在這裏插入圖片描述
管理員登錄 賬號:root 密碼:root;普通用戶登錄 賬號:qingqing 密碼:qingqing
在這裏插入圖片描述
普通用戶:
在這裏插入圖片描述
下載firebug,打開F12 使用Firebug 抓包
在這裏插入圖片描述
右鍵選擇編輯,修改qingqing爲root,並確定:
在這裏插入圖片描述
接下來我們按F5刷新頁面看看:
在這裏插入圖片描述
可以看到,我們此時已經是管理員權限了。

seesionid 固定漏洞

seesionid 固定攻擊的核心要點就是讓合法用戶使用 攻擊者預先設定 的session ID來訪問被攻擊的應用程序,一旦用戶的會話ID被成功固定,攻擊者就可以通過此session ID來冒充用戶訪問應用程序。簡單來講,攻擊者要想辦法,讓某個用戶通過他預先選擇的session標識符來訪問系統,一旦系統接收到了這個用戶的請求,並且使用用戶傳遞過來的session標識創建了會話,攻擊者就可以使用這個session標識了。

代碼如下:

<?php
    session_start();
    
    if (!isset($_SESSION['count']))
    {
       $_SESSION['count'] = 0;
    }
    else
    {
       $_SESSION['count']++;
    }
 
    echo $_SESSION['count'];
?>

該頁面在第一次訪問的時候,這段代碼會輸出0,刷新頁面,將輸出1。不斷刷新的話,輸出的數值會不斷增大並依次加一,這意味着每一次請求的值得到了保留,客戶端和服務端之間的狀態得到了保持

我們在url中包括預先設定的session標識符id,當戶用再通過該url訪問網頁時,服務器就會根據傳遞過來的session標識id創建會話,比如:

<a href="http://localhost/verification/session/session.php?PHPSESSID=1234"> 
click me!
</a>

並且之後即便更換一臺電腦或者瀏覽器訪問通過此鏈接訪問此頁面,也會繼續使用一開始創建的seesion id繼續進行會話。 比如:
在這裏插入圖片描述
刷新頁面,輸出數字會不斷增大:
在這裏插入圖片描述
爲了模擬攻擊者從另一臺電腦訪問該頁面,使用另外一個瀏覽器訪問該鏈接:
在這裏插入圖片描述
可以看到攻擊者初次訪問的輸出值不是0,而是在firefox上面瀏覽器中最後輸出值基礎上增加了1。這說明你已經侵入了前一次創建的session,雖然你在同一臺電腦上,但是這兩個不同的瀏覽器就可以代表兩個不同的用戶,後者成功冒充成了前者

漏洞防範

cookie身份認證漏洞防範

單純的cookie容易被修改,所以我們添加session變量對cookie進行驗證,添加的代碼如下: login.php:

if(isset($_COOKIE['username']))
        {    
            $_SESSION['veri'] = $_COOKIE['username'];
            header("location: main.php");   // header() 函數向客戶端發送原始的 HTTP 報頭
        }

這樣,在cookie創建時,就同時用session再保存一份cookie的值,並且將session文件存放在服務端,不易被修改。
main.php:

if($_COOKIE['username']==$_SESSION['username'])
{

    if($_COOKIE['username'] == root)
        echo "<td width='150'><div align='middle'> 歡迎您登錄系統".$_COOKIE['username']."管理員!</div></td>"; 
    if($_COOKIE['username'] == shiyanlou)
        echo "<td width='150'><div align='middle'> 歡迎普通用戶".$_COOKIE['username']."!</div></td>"; 
 
}
else{
    echo "<td width='150'><div align='middle'> 登錄失敗!請嘗試重新登錄!</div></td>";
}

在調用cookie中的值之前,會先使用session對其中的值進行判斷,確保未被惡意修改。 在firefox中輸入url:localhost/codeaudit/verification/modify/login.html,仍然使用shiyanlou賬號進行登錄:
在這裏插入圖片描述
同樣像之前一樣,抓包修改cookie併發送,可以看到並沒僞冒用戶成功:
在這裏插入圖片描述
在這裏插入圖片描述

session固定漏洞防禦

常見的防禦方案有如下幾種:

1、更改Session名稱。PHP中Session的默認名稱是PHPSESSID,此變量會保存在Cookie中,如果攻擊者不分析站點,就不能猜到Session名稱,阻擋部分攻擊。

2、關閉透明化Session ID。透明化Session ID指當瀏覽器中的Http請求沒有使用Cookie來存放Session ID時,Session ID則使用URL來傳遞。

3、設置HttpOnly。通過設置Cookie的HttpOnly爲true,可以防止客戶端js腳本訪問這個Cookie。

4、每當用戶登陸的時候就進行重置sessionID

5、sessionID閒置過久時,進行重置sessionID

參考:
https://blog.csdn.net/Fly_hps/article/details/79845293
https://blog.csdn.net/God_XiangYu/article/details/97989390

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