安全性測試入門 (四):Session Hijacking 用戶會話劫持的攻擊和防護

本篇繼續對於安全性測試話題,結合DVWA進行研習。php

Session Hijacking用戶會話劫持html

1. Session和Cookies

這篇嚴格來講是用戶會話劫持諸多狀況中的一種,經過會話標識規則來破解用戶session。前端

並且與前幾篇不一樣,咱們有必要先來理解一下Session和Cookie的工做機制。web

實際上要談論這兩個小夥伴,又要先理解http協議的運做機制,這樣討論下去可就篇幅太長了。後端

咱們只須要了解如下事實:安全

  • http協議是無狀態的

就好像兩我的用老式的手搖電話機通電話。每一次http請求和數據交換就像這樣的一次電話通話過程,當請求完畢之後,再進行下一次請求時,http協議是沒法追蹤上一則通話記錄的。這樣每一次用戶與服務器的交互都是獨立的一次通話,對於一個web應用而言顯然是存在問題的,由於用戶的請求十有八九具備連續性。就好比一個用戶在商城添加了某商品到購物車,當他去結帳時,又是一次新的請求,他的購物車http協議僅僅經過鏈接狀態是沒法追蹤的!服務器

  • Session:來來來 給你分配個號碼牌

爲了解決用戶的接續訪問問題,一個簡單的想法就是,將每一次用戶與服務器之間的持續通話作爲一個「會話」存放在服務器端。
當用戶第一次打call進來的時候,你先別說話,先給你個小牌牌,這個小牌牌就用來作爲此次用戶會話的跟蹤。
在咱們的應用內一般使用sessionID或者相似的形式進行記錄。cookie

  • Cookie:請你證實你是你,你媽是你媽

在會話中咱們有了標識本身身份的號碼牌,由服務器生成頒發。用戶拿到小牌牌,固然要妥善保管啦,將他存放到cookie裏面就是如今的主流手段。當用戶繼續向服務器發出交互時,每一次接線員都先看一看這個小牌牌,證實你是你,而後再繼續給你服務,否則別怪我翻臉不認人。session

他們關係就相似這樣嬸兒的:
測試

下圖就是在DVWA上面個人用戶cookie,使用JS彈框將其展現出來的效果:

2. Session Hijacking會話劫持攻擊

瞭解session和cookie的原理機制以後,咱們來思考,若是我是攻擊者,我有沒有方法利用到用戶的cookie和session?

這種思路是有不少的:

  • 一種思路是,攻擊者不獲取用戶的cookie和session,而是想辦法讓用戶在不知情的狀況本身去踩坑。

好比上一篇咱們講CSRF跨站腳本僞造時,就是讓已經被服務器驗證經過的用戶來幫我作一個操做。

  • 另外一種思路是,攻擊者本身創造一個session信息,而後誘使用戶使用這套session。

若是用戶使用這套session進行了登陸,那麼攻擊者使用一樣的session去訪問,就截取到了用戶此次會話了。(這種攻擊叫Session Fiaxtion - 固定會話攻擊)

  • 另外一種思路則更直接,我想辦法獲取到用戶的會話信息,那麼我就可以盜取用戶的身份了。

這些就是所謂的session hijacking,用戶會話劫持。

那麼接下來的問題是,攻擊者如何能獲取到用戶會話呢

經過XSS攻擊漏洞就能夠達成目標,這個咱們會在後續去探討。

其實還有更簡單的方式,服務器所頒發的這個session的標識符,也是基於必定的規則生成的。若是這套規則過於簡單,那麼經過猜都能猜出來!

DVWA的weak session IDs 模塊

DVWA就給咱們演示了什麼叫過於簡單的session規則:

真是。。。太簡單了,簡單的數字遞增。想要攻擊,很容易就能夠猜出sessionid,而後加以利用。

3. sessionID的更合理頒發機制

下面咱們一樣看看DVWA是如何增強session頒發機制的:

Medium級別防護

<?php

$html = "";

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

使用時間戳來生成session標識,仍是挺好猜的。

High級別防護

<?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);
}

?>

頒發完了的sessionID長這樣:

看起來好厲害哦,MD5加密了。

然鵝,破解他只須要0.05秒的MD5在線解密瞭解一下?

Impossible防護

<?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);
}
?>

使用隨機數+時間戳+常量字符串+sha1加密。好吧,確實很難猜出來了,是否是impossible呢?唔。。。

4. 會話劫持的測試

事實上到此爲止咱們還不能全面討論會話劫持的測試,由於還有不少種劫持的方法咱們沒有去了解。

不過呢,咱們能夠借這個機會來解釋一下安全測試的大方向。

路是一步步走出來的,一樣的道理,產品的安全能力也是一層一層構建起來的。

一個產品的防護機制是一種典型的1+1>2的概念。

我在項目中間常常看到這種現象:因爲如今的前端技術也比較成熟了,不少後端工程師就依賴於前端去完成數據校驗工做,後端校驗就省去了。

可是實際上任何產品的安全機制都應該是層層疊加的體系,任何單層的防護都不能確保產品的絕對安全

上面提到的先後端校驗就是很好的例子:前端校驗實在太容易繞過了,後端必需要作好二重校驗,這就是個雙保險的概念。

回到用戶劫持攻擊的測試,session標識頒發規則就是產品層疊防護機制中的其中一層。

測試人員能夠經過解讀這一規則來判斷他的合理性。簡單來講,若是大家的session標識規則,你可以想辦法破解掉,不用想了報bug吧。

相關文章
相關標籤/搜索