[紅日安全]Web安全Day12 - 會話安全實戰攻防

1.會話安全概述

1.1 什麼是會話

session會話機制是一種服務器端機制,它使用類似於哈希表(可能還有哈希表)的結構來保存信息。當程序需要爲客戶端的請求創建會話時,服務器首先檢查客戶端的請求是否包含會話標識符(稱爲會話ID)。如果包含它,它先前已爲此客戶端創建了一個會話。服務器根據會話ID檢索會話(無法檢索,將創建新會話),如果客戶端請求不包含會話ID,則爲客戶端創建會話並生成與會話關聯的會話ID。 session id應該是一個既不重複也不容易被複制的字符串。會話ID將返回給客戶端以保存此響應。

1.2常見會話問題

1.2.1會話預測

即預測應用程序的身份驗證模式的會話ID值。通過分析和理解會話ID生成過程,攻擊者可以預測有效的會話ID值並獲得對應用程序的訪問權限。

1.2.2會話劫持

通過利用各種手段獲取用戶Session ID後,使用該Session ID登錄網站,獲取目標用戶的操作權限。

1.2.3會話重用

用戶退出系統後,服務器端Session未失效,攻擊者可利用此Session向服務器繼續發送服務請求。
測試方法:登錄後將會話註銷,再次重放登錄時的數據包仍然可正常登錄系統。

1.2.4會話失效時間過長

應用系統的會話失效時間過長。導致服務器性能受損,且由於過長的失效時間會導致可以被多次利用。
測試方法:系統登錄後會話長時間不失效,使用系統功能,仍可正常使用。

1.2.5會話固定

在用戶進入登錄頁面,但還未登錄時,就已經產生了一個session,用戶輸入信息,登錄以後,session的id不會改變,也就是說沒有建立新session,原來的session也沒有被銷燬)。攻擊者事先訪問系統並建立一個會話,誘使受害者使用此會話登錄系統,然後攻擊者再使用該會話訪問系統即可登錄受害者的賬戶。
測試方法:系統登錄前和登錄後,用戶的seesion保持不變。

2.危害

攻擊者可利用漏洞繞過身份驗證提升權限。

3.測試方法

3.1測試靶場介紹

下面介紹兩個測試靶場,DVWA靶場和WebGoat靶場。

3.1.1 DVWA

3.1.1.1 靶場介紹

DVWA (Damn Vulnerable Web Application) 是用 PHP+MySQL 編寫的一套用於漏洞檢測和教學的程序,支持多種數據庫,包括了 SQL 注入、XSS 等一些常見的安全漏洞。

3.1.1.2 安裝過程

下載地址:http://www.dvwa.co.uk/
下載後解壓放到WWW目錄,配置好本地域名
修改config.inc.php.dist配置文件中的數據庫密碼,並且把文件後綴.dist去掉
然後訪問配置的本地域名,下拉點擊Create Database。
在這裏插入圖片描述

然後登錄默認管理員賬戶:admin/password,出現下圖即爲安裝成功。
在這裏插入圖片描述

3.1.2 WebGoat

WebGoat是OWASP組織研製出的用於進行web漏洞實驗的Java靶場程序,用來說明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,當前提供的訓練課程有30多個,其中包括:跨站點腳本攻擊(XSS)、訪問控制、線程安全、操作隱藏字段、操縱參數、弱會話cookie、SQL盲注、數字型SQL注入、字符串型SQL注入、web服務、Open Authentication失效、危險的HTML註釋等等。
Docker方式安裝過程:
(1)安裝Docker
apt install apt-get install docker.io
(2)查看Docker版本
docker --version
(3)下載WebGoat容器
docker pull webgoat/webgoat-7.1
(4)運行WebGoat
docker run -p 8080:8080 -t webgoat/webgoat-7.1
訪問http://127.0.0.1:8080/WebGoat/login,出現下圖頁面
在這裏插入圖片描述

3.2手工測試

下面採用DVWA靶場進行手工測試。

3.2.1 Low

3.2.1.1 測試過程

使用Firefox登錄,默認管理員賬戶:admin/password
先點擊DVWA Security選擇測試等級Low,再在Weak Session IDs進行測試。
點擊generate生成新的dvwasessionid,多點擊幾次可以發現,每生成一個dvwasessionid,sessionid+1
在這裏插入圖片描述
點擊generate再刷新
在這裏插入圖片描述

此時使用Google瀏覽器在未登錄時訪問http://quan.dvwa.net/vulnerabilities/weak_id/時抓包,然後構造Cookie:
dvwaSession=1; PHPSESSID=ba55268a6a3a174b7939898fe1bb06ae; security=low
(PHPSESSID的值改爲Firefox的PHPSESSID),即可進入已登陸頁面。
在這裏插入圖片描述

3.2.1.2 源碼分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    if (!isset ($_SESSION['last_session_id'])) { 
        $_SESSION['last_session_id'] = 0; 
    } 
    $_SESSION['last_session_id']++; 
    $cookie_value = $_SESSION['last_session_id']; 
    setcookie("dvwaSession", $cookie_value); 
} 
?>

從第4行可以知道,當last_session_id不存在時,令它爲0;存在last_session_id時,每次加一,last_session_id即dvwaSession。

3.2.2 Medium

3.2.2.1 測試過程

同樣使用Firefox登錄管理員賬戶,先點擊DVWA Security選擇測試等級Medium,再在Weak Session IDs進行測試。
點擊generate生成新的dvwasessionid,用Cookiemanager查看Cookie可以發現,生成的dvwasessionid很明顯就是一個當前時間的時間戳。
在這裏插入圖片描述
欺騙用戶在某個時間點擊generate,就能構造這個時間範圍的Cookie:
dvwaSession=1566965958;PHPSESSID=ba55268a6a3a174b7939898fe1bb06ae; security=medium
在這裏插入圖片描述

3.2.2.2 源碼分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    $cookie_value = time(); 
    setcookie("dvwaSession", $cookie_value); 
} 
?>

從第4行代碼可以知道,確實就是用時間做的值。

3.2.3 High

3.2.3.1 測試過程

同樣使用Firefox登錄管理員賬戶,先點擊DVWA Security選擇測試等級Medium,再在Weak Session IDs進行測試。
點擊generate生成新的dvwasessionid,用Cookiemanager查看Cookie可以發現,生成的dvwasessionid進行了加密。
在這裏插入圖片描述

看着好像是MD5,我們試着用MD5解密一下。
在這裏插入圖片描述
再生成一個sessionid並解密,觀察特點好像就是Low等級的MD5加密版。
在這裏插入圖片描述
找到cookie生成規律後就可以構造payload:
Cookie:dvwaSession=e4da3b7fbbce2345d7772b0674a318d5;PHPSESSID=9igf4g7mcnegrv91ro6eq4msj1; security=high
在這裏插入圖片描述

3.2.3.2 源碼分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    if (!isset ($_SESSION['last_session_id_high'])) { 
        $_SESSION['last_session_id_high'] = 0; 
    } 
    $_SESSION['last_session_id_high']++; 
    $cookie_value = md5($_SESSION['last_session_id_high']); 
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false); 
}
?>

根據源碼可知,與Low等級的代碼相比較,只是多了MD5加密這一步。並且從setcookie()函數可以知道cookie有效期爲當前時間到未來一小時內。

3.2.4 Impossible

3.2.4.1 測試過程

同樣使用Firefox登錄管理員賬戶,先點擊DVWA Security選擇測試等級Medium,再在Weak Session IDs進行測試。
點擊generate生成dvwasessionid,值爲ed880adbdf1fc68b92185e9c5032d5d575bfaee2。嘗試MD5失敗。遂查看源碼。

3.2.4.2 源碼分析

<?php 
$html = ""; 
if ($_SERVER['REQUEST_METHOD'] == "POST") { 
    $cookie_value = sha1(mt_rand() . time() . "Impossible"); 
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true); 
} 
?>

根據第4行代碼可以看出,先是連接隨機數和時間戳,然後又進行sha1加密,一般破解不出。

#4.CMS實戰演練
下面採用XiaoCMS和YxCMS對會話固定漏洞進行實戰演練。

4.1 XiaoCMS

4.1.1CMS介紹

XiaoCms 企業建站版基於 PHP+Mysql 架構 是一款小巧、靈活、簡單、易用的輕量級 cms。能滿足各種企業站 博客 等中小型站點。

4.1.2 CMS安裝

CMS版本:XiaoCMSv1.0
下載地址:http://www.a5xiazai.com/php/108347.html
測試環境:win10、PHP5.2.17、Mysql5.5.53
放到www目錄下,正確填寫數據庫信息,然後next即可。
在這裏插入圖片描述

4.1.3 CMS漏洞介紹

漏洞發生在此處文件:\core\library\session.class.php
漏洞成因:已經存在sessionid時將該sessionid設置爲當前sessionid,沒有重新生成。
代碼分析:
在這裏插入圖片描述

從20行的代碼可以知道,如果設置了session_id,那麼就會調用session_id()方法將該session_id設置爲當前的session_id,而且這個session_id可以用POST方法傳輸得到。

4.1.4 CMS實戰演示

測試步驟:
先註冊一個只有幾個權限的普通管理員賬號:quan(其實註冊普通用戶就行,但是我沒找到)
然後用Google瀏覽器登錄quan賬號,用Firefox登錄admin賬號
分別獲取相應session_id,得到quan的ssession_id=57049dc90ccd7226302dc8efbb8f2ce0
直接在火狐瀏覽器用hackbar測試訪問:
http://quan.xiaocms.net/admin/?xiaocms
POST:session_id=57049dc90ccd7226302dc8efbb8f2ce0

也可以構造測試POC:

<html>
    <body>
    <form action="http://quan.xiaocms.net/admin/" method="post">
    <input type="hidden" name="session_id" value="57049dc90ccd7226302dc8efbb8f2ce0">
    <input type="submit" >
    </form>
</body>
</html>

存爲html文件,然後用Firefox打開,點擊提交查詢。

此時打開Google瀏覽器,可以看到quan管理員的首頁狀態
在這裏插入圖片描述

因爲quan是管理員用戶,所以刷新一下,直接變成超級管理員admin
如果是普通會員用戶訪問http://quan.xiaocms.net/admin/?xiaocms即可
在這裏插入圖片描述

4.2 YxCMS

4.2.1 CMS介紹

Yxcms是一款高效,靈活,實用,免費的企業建站系統,基於PHP和mysql技術,讓您擁有更加專業的企業建站和企業網站製作服務。

4.2.2 CMS安裝

放入www目錄下,一直next即可
在這裏插入圖片描述

4.2.3 CMS漏洞介紹

漏洞發生在此處文件:yxcms/protected/include/lib/common.function.php
漏洞成因:已經存在sessionid時將該sessionid設置爲當前sessionid,沒有重新生成。
代碼分析:
在這裏插入圖片描述

從644行代碼可以知道,存在session_id時調用session_id()函數將該session設置爲當前,
並且可以從request()函數得到。
再看一下request函數包括哪些方法
在這裏插入圖片描述

支持挺多的方法傳輸參數,當然是GET方法最nice~

4.2.4 CMS實戰演示

後臺登陸地址:http://quan.yxcms146.net/index.php?r=admin/index/login
管理員賬戶:admin/123456
演示過程:
註冊一個普通會員用戶quan,然後用Google瀏覽器登錄quan賬號,用Firefox登錄admin賬號
在這裏插入圖片描述

得到PHPSESSID爲5fcb75b7b1cda3d797b1cf7ac1cc0be1
直接在admin管理頁面加上&sessionid=5fcb75b7b1cda3d797b1cf7ac1cc0be1並訪問
在Google瀏覽器訪問http://quan.yxcms146.net/index.php?r=admin/index/index
即可獲取admin管理員會話
在這裏插入圖片描述

5.防禦方法

5.1服務器端在Set-Cookie時在Cookie的值後面加上一段防篡改的驗證串,然後再發送到客戶端

5.2用戶退出系統後,服務器端應清空此用戶的Session信息

5.3服務器端設置Session的存活時間,超過存活時間強制銷燬Session

5.4在用戶提供的認證信息(例如用戶名和密碼)、相應的權限級別發生變化時,服務器端應重新生成SessionID,並強制失效之前的會話

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