會話認證漏洞

相關(guān)課程的線上實驗版本已投遞到實驗樓,實驗樓在線教育平臺提供非常優(yōu)秀的在線實驗環(huán)境,建議有興趣的朋友可以看看:點擊前往

一、文章介紹

認證的目的是為了認出用戶是誰,而授權(quán)的目的是為了決定用戶能夠做什么,身份認證實際上就是一個驗證憑證的過程。

本篇文章主要解決下面三個問題:

  • 什么是身份認證漏洞?

  • cookie和session的安全性?

  • 如何防范身份認證漏洞?

二、漏洞簡介

Web身份認證通常使用Cookie、Session、Openid、OAuth、SSO、REST等,而其中最常使用的是Cookie和Session。
cookie和session都能夠進行會話跟蹤,它們的區(qū)別在于:

  • Session是在服務(wù)端保存的一個數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),這個數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中;

  • Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現(xiàn)Session的一種方式。

三、漏洞原理

3.1 cookie身份認證漏洞

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

我編寫了一個用于身份識別的簡單示例:

此處輸入圖片的描述

具體代碼如下:

<?php
session_start();
if(isset($_COOKIE['username']))
{
    $username = $_COOKIE['username'];
    if($username == root)

        echo "<td width='150'><div align='middle'> 歡迎您登錄系統(tǒng)".$_SESSION['username']."管理員!</div></td>"; 
    if($username == shiyanlou)
        echo "<td width='150'><div align='middle'> 歡迎普通用戶shiyanlou".$_SESSION['username']."!</div></td>"; 

}
echo "<td width='150'><div align='middle'> <a href='logout.php'> 注銷</a></div></td>"; 
?>

可以看到,該頁面直接讀取cookie中的username字段進行的權(quán)限判斷,這種方式非常不安全。

接下來我們嘗試利用一下這個漏洞:

先使用普通用戶登錄試試:

此處輸入圖片的描述

按F12抓包獲取cookie:

此處輸入圖片的描述

接下來我們修改cookie為root,并將請求發(fā)送給服務(wù)器:

此處輸入圖片的描述

此處輸入圖片的描述

此處輸入圖片的描述

可以看到,我們此時已經(jīng)是管理員權(quán)限了

3.2 seesionid 固定漏洞

seesionid 固定攻擊的核心要點就是讓合法用戶使用攻擊者預(yù)先設(shè)定的session ID來訪問被攻擊的應(yīng)用程序,一旦用戶的會話ID被成功固定,攻擊者就可以通過此session ID來冒充用戶訪問應(yīng)用程序,因為一個session id對瀏覽器來說就是一個用戶。

簡單來講,攻擊者要想辦法,讓某個用戶通過他預(yù)先選擇的session標識符來訪問系統(tǒng),一旦系統(tǒng)接收到了這個用戶的請求,并且使用用戶傳遞過來的session標識創(chuàng)建了會話,攻擊者就可以使用這個session標識了,也就等于冒充了你的身份。

我們通過下面這個例子來理解一下,有如下代碼:

    session_start();

    if (!isset($_SESSION['count']))
    {
       $_SESSION['count'] = 0;
    }
    else
    {
       $_SESSION['count']++;
    }

    echo $_SESSION['count'];


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

我們在url中包括預(yù)先設(shè)定的session標識符, 再通過該url訪問網(wǎng)頁時,服務(wù)器就會根據(jù)傳遞過來的session標識創(chuàng)建會話,比如如下鏈接:

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

如果通過這個鏈接訪問目標網(wǎng)站,那么目標網(wǎng)站會根據(jù)鏈接末尾的參數(shù)自動生成Session Id,
并且之后即便更換一臺電腦或者瀏覽器之后,再訪問通過此鏈接訪問此頁面,也會繼續(xù)使用一開始創(chuàng)建的seesion id進行會話,也就是利用的是之前的那個身份。

我們來看一下在瀏覽器中訪問此頁面的效果:

此處輸入圖片的描述
此處輸入圖片的描述

刷新頁面,輸出數(shù)字會不斷增大:

此處輸入圖片的描述

之后使用另一臺電腦或者另一個瀏覽器通過該鏈接訪問此頁面:(按道理來說,更換電腦和瀏覽器之后,cookie信息會重新生成,也就是說你是用的另一個身份來訪問該頁面的,比如你用一臺電腦登錄淘寶賬戶之后,你換一臺電腦重新加載淘寶主頁,這時候是肯定沒有登錄的。)

此處輸入圖片的描述

可以看到初次訪問的輸出值不是0,而是在firefox上面瀏覽器中最后輸出值基礎(chǔ)上增加了1。這說明你已經(jīng)侵入了前一次創(chuàng)建的session,雖然你在同一臺電腦上,但是這兩個不同的瀏覽器就可以代表兩個不同的用戶,后者成功冒充成了前者。

四、漏洞防范

4.1 cookie身份認證漏洞防范

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

if(isset($_COOKIE['username']))
        {   
            $_SESSION['veri'] = $_COOKIE['username'];
            header("location: main.php");
        }
        

用session存儲cookie的值,并且session存放在服務(wù)端不會被修改。

我們將之前的代碼修改之后:

if($_COOKIE['username']==$_SESSION['veri'])#在調(diào)用cookie中的值之前,會先使用session對其中的值進行判斷,確保未被惡意修改。

{
    

    if($_COOKIE['username'] == root)

        echo "<td width='150'><div align='middle'> 歡迎您登錄系統(tǒng)".$_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'> 無法檢測用戶權(quán)限!</div></td>";
}

這樣再使用之前的抓包修改cookie的手段繞過權(quán)限就行不通了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容