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