session劫持是一種廣泛存在的比較嚴重的安全威脅,在session技術中,客戶端和服務端通過session的識別符號來維護會話, 但這個識別符號很容易就能被嗅探到,從而被其他人利用.它是中間人攻擊的一種型別。
本節將通過乙個例項來演示會話劫持,希望通過這個例項,能讓讀者更好地理解session的本質。
我們寫了如下的**來展示乙個count計數器:
}count.gtpl的**如下所示:
hi. now count:}
然後我們在瀏覽器裡面重新整理可以看到如下內容:
圖6.4 瀏覽器端顯示count數
隨著重新整理,數字將不斷增長,當數字顯示為6的時候,開啟瀏覽器(以chrome為例)的cookie管理器,可以看到類似如下的資訊:
圖6.5 獲取瀏覽器端儲存的cookie
下面這個步驟最為關鍵: 開啟另乙個瀏覽器(這裡我開啟了firefox瀏覽器),複製chrome位址列裡的位址到新開啟的瀏覽器的位址列中。然後開啟firefox的cookie模擬外掛程式,新建乙個cookie,把按上圖中cookie內容原樣在firefox中重建乙份:
圖6.6 模擬cookie
回車後,你將看到如下內容:
圖6.7 劫持session成功
可以看到雖然換了瀏覽器,但是我們卻獲得了sessionid,然後模擬了cookie儲存的過程。這個例子是在同一臺計算機上做的,不過即使換用兩台來做,其結果仍然一樣。此時如果交替點選兩個瀏覽器裡的鏈結你會發現它們其實操縱的是同乙個計數器。不必驚訝,此處firefox盜用了chrome和goserver之間的維持會話的鑰匙,即gosessionid,這是一種型別的「會話劫持」。在goserver看來,它從http請求中得到了乙個gosessionid,由於http協議的無狀態性,它無法得知這個gosessionid是從chrome那裡「劫持」來的,它依然會去查詢對應的session,並執行相關計算。與此同時 chrome也無法得知自己保持的會話已經被「劫持」。
通過上面session劫持的簡單演示可以了解到session一旦被其他人劫持,就非常危險,劫持者可以假裝成被劫持者進行很多非法操作。那麼如何有效的防止session劫持呢?
其中乙個解決方案就是sessionid的值只允許cookie設定,而不是通過url重置方式設定,同時設定cookie的httponly為true,這個屬性是設定是否可通過客戶端指令碼訪問這個設定的cookie,第一這個可以防止這個cookie被xss讀取從而引起session劫持,第二cookie設定不會像url重置方式那麼容易獲取sessionid。
第二步就是在每個請求裡面加上token,實現類似前面章節裡面講的防止form重複遞交類似的功能,我們在每個請求裡面加上乙個隱藏的token,然後每次驗證這個token,從而保證使用者的請求都是唯一性。
h := md5.new()
salt:="astaxie%^7&8888"
io.writestring(h,salt+time.now().string())
token:=fmt.sprintf("%x",h.sum(nil))
if r.form["token"]!=token
sess.set("token",token)
還有乙個解決方案就是,我們給session額外設定乙個建立時間的值,一旦過了一定的時間,我們銷毀這個sessionid,重新生成新的session,這樣可以一定程度上防止session劫持的問題。
createtime := sess.get("createtime")
if createtime == nil else if (createtime.(int64) + 60) < (time.now().unix())
session啟動後,我們設定了乙個值,用於記錄生成sessionid的時間。通過判斷每次請求是否過期(這裡設定了60秒)定期生成新的id,這樣使得攻擊者獲取有效sessionid的機會大大降低。
上面兩個手段的組合可以在實踐中消除session劫持的風險,一方面, 由於sessionid頻繁改變,使攻擊者難有機會獲取有效的sessionid;另一方面,因為sessionid只能在cookie中傳遞,然後設定了httponly,所以基於url攻擊的可能性為零,同時被xss獲取sessionid也不可能。最後,由於我們還設定了maxage=0,這樣就相當於session cookie不會留在瀏覽器的歷史記錄裡面。
Session劫持原理簡介
size medium session劫持是一種比較複雜的攻擊方法。大部分網際網路上的電腦多存在被攻擊的危險。這是一種劫持tcp協議的方法,所以幾乎所有的區域網,都存在被劫持 可能。兩台主機要想進行tcp通訊,必須經過乙個三次握手的過程。三次握手過程中服務端和客戶端一般會協商乙個序列號。這個序列號一...
網域名稱劫持預防與解決辦法
網域名稱被劫持後該怎麼做?如何預防網域名稱劫持?1 為網域名稱註冊商和註冊用郵箱設定複雜密碼且經常更換。使用單獨的dns服務,也需要對密碼進行上述設定。同時注意不要在多個重要註冊地使用相同的使用者名稱和密碼 2 將網域名稱更新設定為鎖定狀態,不允許通過dns服務商 修改記錄,使用此方法後,需要做網域...
PHP漏洞之session會話劫持
提交 attack.php?phpsessid 5a6kqe7cufhstuhcmhgr9nsg45 此id為獲取到的客戶session id,重新整理客戶頁面以後客戶購買的商品變成了2000 session固定攻擊 黑客可以使用把session id發給使用者的方式,來完成攻擊 http loca...