一、白名單繞過
語句輸出在標(biāo)簽內(nèi)
比如
1.閉合標(biāo)簽構(gòu)造語句
在白名單較為寬松的情況下,"和<>都被放出,可以利用">先閉合標(biāo)簽,然后構(gòu)造http://wenjunhu.com/images/chaijie_default.pngss語句來進(jìn)行觸發(fā)。最后結(jié)果
">這種是最簡單的方法,也很常見。如果白名單內(nèi)沒有了",可以利用html的解析優(yōu)先級來逃離引號來觸發(fā)http://wenjunhu.com/images/chaijie_default.pngss。構(gòu)造
,在瀏覽器中會優(yōu)先解析標(biāo)簽,這樣就會優(yōu)先閉合標(biāo)簽,從而逃出引號的限制來觸發(fā)http://wenjunhu.com/images/chaijie_default.pngss。2.閉合屬性構(gòu)造http://wenjunhu.com/images/chaijie_default.pngss
如果現(xiàn)在白名單中沒有了<>,那么就不能利用上述方法進(jìn)行構(gòu)造,可以考慮閉合src屬性,構(gòu)造新屬性來觸發(fā)http://wenjunhu.com/images/chaijie_default.pngss。構(gòu)造
閉合src,觸發(fā)http://wenjunhu.com/images/chaijie_default.pngss如果白名單中<>'"全部被限制,這時http://wenjunhu.com/images/chaijie_default.pngss利用就變的非常困難,但是如果onerror屬性可控的話,可以用html實(shí)體編碼進(jìn)行繞過,來構(gòu)造任意的http://wenjunhu.com/images/chaijie_default.pngss語句。https://config.net.cn/tools/HtmlEncode.html 比如
語句輸出在js中
語句直接輸出在js代碼中是非常危險的,相對應(yīng)的白名單也會設(shè)置的非常嚴(yán)格。
1.constructor
JavaScript語言使用構(gòu)造函數(shù)(constructor)作為對象的模版。constructor屬性返回對創(chuàng)建此對象的數(shù)組函數(shù)的引用。簡單來說Object.constructor===Function。
在js中我們可以用Function來創(chuàng)建一個函數(shù)來構(gòu)造http://wenjunhu.com/images/chaijie_default.pngss,例如new Function('alert(1)')();,也可以不要new,簡化成Function('alert(1)')()。然后將Function等價替換為Object.constructor,Object.constructor('alert(1)')()繼續(xù)轉(zhuǎn)換為'...'.substr.constructor('alert(1)')()這里的...為任意字符串,'...'.substr為一個Object,所以這個語句跟上面等價。在js中a.b可以寫成a['b']的形式,一次上面的語句可以寫成'...'['substr']['constructor']('alert(1)')()然后在js中任意字符串都可一寫成+ascii碼8進(jìn)制的形式,將語句字符串全部替換,'...'['163165142163164162']['143157156163164162165143164157162']('141154145162164506151')()這樣我們在白名單中就不需要字母就可以執(zhí)行任意的http://wenjunhu.com/images/chaijie_default.pngss語句了。
2.jsfuck
那么如果白名單更加嚴(yán)格,名單當(dāng)中沒有了和數(shù)字,這時候我們就需要借助jsfuck。jsfuck源于一門編程語言brainfuck,其主要的思想就是只使用8種特定的符號來編寫代碼。而jsfuck也是沿用了這個思想,它僅僅使用6種符號來編寫代碼。它們分別是(、)、+、[、]、!。我們可以直接將alert(1)進(jìn)行jsfuck編碼進(jìn)行測試。http://www.jsfuck.com/
也可以將Function('alert(1)')()進(jìn)行編碼來創(chuàng)建任意函數(shù)執(zhí)行。
二、限制長度繞過
長度限制在20個字符內(nèi)的繞過。
分段輸入http://wenjunhu.com/images/chaijie_default.pngss語句
還是拿
舉例,在沒有過濾的情況下閉合語句需要">,用到了27個字符,而且基本沒有縮短的空間。這時候就需要我們找多個點(diǎn)來分段構(gòu)造http://wenjunhu.com/images/chaijie_default.pngss。
1.利用注釋符
">
我們可以看到,分成3段利用注釋符,將每段之間的的代碼注釋掉,從而將三段之間的http://wenjunhu.com/images/chaijie_default.pngss語句連接起來執(zhí)行。舉個例子:ibuyu cms數(shù)據(jù)庫存儲時限制了20個字符select table_schema,table_name,column_name,column_type,column_comment from information_schema.columns where table_schema= 'ibuyu'
將上述語句分三次插入,可以看到http://wenjunhu.com/images/chaijie_default.pngss中間的語句都被注釋掉,形成了。
2.模板字符串
ECMAScript 6.0(簡稱ES6)是Javascript語言的下一代標(biāo)準(zhǔn),在2015年6月正式發(fā)布。ECMAScript是Javascript的語法規(guī)定,JavaScript是ECMAScript的實(shí)現(xiàn)。ES5標(biāo)準(zhǔn)中一般是輸出模板是通過字符串拼接的方式進(jìn)行的。在ES6中可以通過模板字符串簡化字符串的拼接,模板字符串通過反引號來表示````。模板字符串相當(dāng)于加強(qiáng)版的字符串,除了作為普通字符串,還可以用來定義多行字符串,還可以在字符串中加入變量和表達(dá)式。因此可以使用模板字符串來將分段語句之間的無用代碼變?yōu)槠胀ㄗ址瑥亩唇觝ttp://wenjunhu.com/images/chaijie_default.pngss。
">
這樣就可以利用上述兩種方法繞過長度限制去拼接任意的http://wenjunhu.com/images/chaijie_default.pngss語句了。
短域名
如果我們可以申請到一個足夠短的域名,那么我們就可以利用域名引入外部的一些東西,比如,這樣問題似乎就變的簡單了起來。但是,這個價格。。。
這時我們就得利用Unicode等價性漏洞。Unicode標(biāo)準(zhǔn)中提到,兩個不同編碼的Unicode字符可能存在一定的等價性,這種等價是字符或字符序列之間比較弱的等價類型,這些變體形式可能代表在某些字體或語境中存在視覺上或意義上的相似性。舉例來說,a 和a(uff41)在某些字體下看起來可能相同,15和?(u246e)其表示的數(shù)學(xué)意義可能相同,所以這兩種字符都有其相應(yīng)的等價性。其中15是兩個字符,而?是一個字符,但是再解析之后兩者等價,這樣我們就用一個字符代替了二個字符。同樣的,可以用?對應(yīng)到rad``℡對應(yīng)到tel更多字符可以參考https://www.compart.com/en/unicode/ 這樣我們就可以申請到非常便宜的域名了。
讓我們來實(shí)驗一些是不是真的可以引入外部的東西,插入,可以看到我們引入了外部的圖片。同樣我們也可以引入js腳本來實(shí)現(xiàn)我們想要的東西
-
瀏覽器
+關(guān)注
關(guān)注
1文章
1025瀏覽量
35358 -
SRC
+關(guān)注
關(guān)注
0文章
60瀏覽量
17993
原文標(biāo)題:XSS繞過小思路
文章出處:【微信號:Tide安全團(tuán)隊,微信公眾號:Tide安全團(tuán)隊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論