官术网_书友最值得收藏!

1.2.2 XSS Bypass技巧

1.判斷輸出點及其上下文

嘗試插入正常的字符串如“xsstest”“111111”,確定字符串輸出的位置。

當輸出位置在標簽的屬性里時,可以看到輸出位置位于input標簽的value屬性處,輸出內容被引號包圍,如圖1-57所示。

圖1-57 輸出內容被引號包圍

閉合value屬性,寫入一個新的屬性并構造XSS Payload,比如我們可以通過HTML的事件對象來構造。一般在<、>被過濾時使用這種方法。

利用事件對象onclick語法執行JavaScript語句,當用戶點擊對象時調用其事件句柄。在瀏覽器中輸入Payload:?name="onclick="alert(xss);,執行結果如圖1-58所示。

圖1-58 onclick彈框

這里列出一些常用的事件對象,如表1-2所示。

表1-2 常用的事件對象

閉合input標簽,直接在頁面里構造XSS Payload。這時候構造Payload的方法就很多了,部分代碼如下。

執行結果如圖1-59所示。

圖1-59 閉合標簽

輸出位置在<script>標簽的情況還是比較常見的。舉個例子,我們輸入的name字段會被拼接到<script>標簽內,并且被一個函數的"和{}包裹,代碼如下。

輸入?name=1";}alert('xss');{"1,可以閉合"和{},執行結果如圖1-60所示。

圖1-60 繞過<script>標簽

因為輸出位置已經被script標簽包裹,所以我們的輸入會被當成JavaScript代碼執行,開發者在做XSS防護的時候很容易忽略這一點。

將用戶輸入的內容直接輸出在頁面上,這種沒有上下文的情況也比較常見,因為沒有上下文干擾,所以我們可以直接寫Payload。

2.構造Payload

下面介紹XSS靶場Prompt(1) to win中3個簡單的關卡。Prompt(1) to win的最終目標是在頁面上執行Prompt(1)。輸出點位于input標簽的value屬性中,兩邊被"符號包裹,如圖1-61所示。

圖1-61 定位輸出點

將input標簽閉合,再寫入prompt標簽。輸入"><script>prompt(1);</script>,執行結果如圖1-62所示。

圖1-62 執行成功

再來看一個例子,輸出點位于article標簽內,并且用正則表達式過濾了<內容>的標簽格式,如圖1-63所示。

圖1-63 正則過濾

正則規則分析如圖1-64所示。

圖1-64 正則規則分析

我們直接利用<img src=x onerror="prompt(1)",不輸入最后一個">",瀏覽器會自動往后尋找">"幫我們閉合img標簽,如圖1-65所示。

圖1-65 自動閉合標簽

接著進行下一關,過濾了=(,輸出位置沒有任何干擾,直接輸出在頁面上,如圖1-66所示。

圖1-66 過濾特殊符號

JavaScript里某些函數是支持用``代替()的,除了prompt()函數不支持。SVG標簽會將XML實體解析后加入標簽,我們可以利用其會解析編碼的特性繞過一些符號的過濾,代碼如下。

或者利用eval函數。在JavaScript里,eval函數能夠接受十六進制的字符串。

執行結果如圖1-67所示。

圖1-67 成功繞過特殊符號

主站蜘蛛池模板: 洞头县| 九江市| 岑巩县| 达孜县| 资溪县| 体育| 荥阳市| 华池县| 垦利县| 都江堰市| 棋牌| 靖安县| 南华县| 池州市| 佛坪县| 南郑县| 桓仁| 仪征市| 甘谷县| 三明市| 淅川县| 班玛县| 凌源市| 庆元县| 鹿邑县| 临湘市| 登封市| 睢宁县| 宿松县| 灌南县| 三明市| 宁晋县| 师宗县| 康保县| 民勤县| 定陶县| 武乡县| 高陵县| 桐庐县| 卓尼县| 山东省|