2011-05-10 155 views
6

我讀過很多關於會話固定/劫持的風險,並且許多人建議更改php.ini指令,如session.use_only_cookiesON等php.ini指令使服務器更安全......簡單的會話固定攻擊本地主機進行測試

我想用我的眼睛,看看我是否可以複製一個簡單的攻擊場景在基於PHP5 + Apache的本地主機服務器上。

在我的本地主機session.use_only_cookiesOFF所以根據上面的q/a我的本地主機基本上是不受保護的,這是我需要做的測試。

我第一次閱讀會話固定攻擊是如何perfomed這個簡單的文章:

爲了複製在文章中描述的場景,我創建了兩個非常簡單的PHP腳本(代碼如下),但攻擊不起作用,這是我做的:

  1. (假裝是馬洛裏)我說愛麗絲:「你好就往http://localhost/login.php?PHPSESSID=mysessionid

  2. 然後(故作愛麗絲)我去http://localhost/login.php?PHPSESSID=mysessionid

  3. 由於我的本地服務器的管理員,我看到會議服務器的磁盤上創建(它是塗蠟的文件與名稱sess_ mysessionid),所以我想:酷,它的工作!

  4. 然後(故作愛麗絲)我登錄在進入「喬」作爲憑證

  5. 愛麗絲日誌和她被重定向到insession_ok.php,並且在該點(根據上述維基百科文章)馬洛裏應也能夠看到insession_ok.php,因爲他將會話固定爲mysessionid,但這不是真的,因爲當Alice在服務器sess_vdshg238cnfb4vt7ahpnp1p522上登錄新會話時,所以我不明白Mallory應該如何注視/劫持會議,正如文章中所解釋的那樣?


的login.php

<?php 
session_start(); 

//if user credentials are ok, let's put him in session 
if(@$_POST['usr'] === 'joe') 
    $_SESSION['in_session'] = TRUE; 

//if user is already logged in, let's redirect him to the account page "insession_ok.php" 
if(isset($_SESSION['in_session'])) 
{ 
    $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/insession_ok.php';  
    header("Location: " . $webpage, TRUE, 302); 
}  
?> 
<form method="POST" action="login.php"> 
    <input name="usr" type="text"> 
    <input type="submit" value="Submit"> 
</form>  
<script type="text/javascript"> 
    alert(document.cookie); //to view cookies 
</script> 

insession_ok.php

<?php 
session_start(); 
if(@$_SESSION['in_session'] === TRUE) 
    echo "in session ok"; 
else //user is not in session cause he did not login, let's redirect him to login page 
{ 
    $webpage = 'http://' . $_SERVER['HTTP_HOST'] . '/login.php';  
    header("Location: " . $webpage, TRUE, 302); 
} 
?> 

不限線索/想法總是感激!

回答

6

這是我一直用來測試會話修復攻擊的方式。它需要有關HTTP協議的知識,但是如果你足夠善於查看會話固定,那麼HTTP的一點點不應該嚇到你:)

我正在查看的會話固定版本這裏有一個公共計算機的概念,其中你去圖書館,導航到像www.myawesomesite.com這樣的網站,如果沒有登錄,你會記下分配給你的會話ID。

然後您離開並等待某人登錄www.myawesomesite.com。只要他們登錄,手動將計算機上的會話更改爲公用計算機上使用的cookie。服務器然後認爲你是經過身份驗證的用戶。

爲了在localhost上測試它,我們可以使用兩個不同的瀏覽器來查看效果,因爲瀏覽器通常不共享cookie。

下面是做到這一點的步驟:

  • 打開Chrome並轉到localhost。這將代表公共電腦。檢查會話ID並寫下來。您可以通過使用像Fiddler這樣的程序來查看請求,或者使用像Web Developer這樣的插件來查看cookie。 Cookie值應該類似於PHPSESSID=46l11p0vt81ouo2hkt0ck8ij76

  • 打開Firefox並導航至localhost。這將代表攻擊者的計算機。使用Web Developer插件,將PHPSESSID cookie更改爲您從Chrome中記下的值。

  • 在Chrome中,以Alice身份登錄。這將代表受害者登錄。

  • 返回到Firefox,單擊「刷新」或導航到僅通過身份驗證的頁面。如果您很容易受到會話固定的影響,那麼您應該在Firefox上以Alice身份登錄,繞過登錄。

這個問題的解決方法很簡單(因爲我相信你已經看到了)。一旦用戶在您的代碼中進行身份驗證,只需致電session_regenerate_id()即可。這會使登錄前使用的任何會話標識失效,並意味着奧斯卡現在必須嘗試在登錄後之後竊取您的會話ID ,這樣做更困難。

1

除了禁用session.use_only_cookies之外,還需要確保當前沒有有效的會話ID cookie,因爲PHP寧願$_COOKIE而不是$_GET。事實上,Alice登錄後擁有不同的會話ID的原因可能是因爲Alice已經擁有了一個有效的cookie,並且使用了會話ID,然後使用它來代替通過URL提供的會話ID。您也可以禁用您的Cookie並啓用session.use_trans_sid以避免Cookie。

然後你的漏洞應該按預期工作。