XSS練習平臺【a/lert(1) to win】
題目來源:https://alf.nu/alert1
這一系列的題目目標為alert(1),也就是找出一個XSS利用點。
頁面會給出一段需要繞過的過濾函式,Output回顯函式生成的HTML程式碼,方便繞過;
Console out是在控制檯輸出的值,就是console.log裡輸出的值
ps:請用chorme進行練習,有的題目在firefox上會出錯
一. warmup
沒有任何過濾,直接閉合前面,註釋後面即可
二. Adobe
看原始碼,發現程式碼匹配了所有的雙引號(/g表示匹配全部),然後把雙引號用\"代替,意思就是直接在雙引號前面加轉義字元“\”,讓雙引號變成字元而失效,導致前面不能閉合。我們可以在輸入時在雙引號前面直接加個反斜槓,讓我們輸的反斜槓轉義函式加的反斜槓
三. JSON
這題函式用了JSON.stringify()使得任意的JS轉化為JSON字串(JSON字串是一種獨立於各種程式語言的字串,我理解就是字串)。
這些不管,自己嘗試輸入,其實就是在我們輸入的字串兩邊加上雙引號,並且在輸入的雙引號等特殊字元前加反斜槓。
由於前面有雙引號無法消除,所以我們考慮用</script>標籤閉合前面的<script>(不管其中的語句有沒有錯誤),然後在後面另起<script>alert(1)
ps:這裡我們可以不規範的HTML程式碼<script>alert(1),後面沒有</script>閉合alert也生效了。
四. JavaScript
這道題剛開始看不懂程式碼,結合了大佬的WP後得知,這段程式碼大概是插入一個<a>標籤,標籤裡的href屬性可由我們控制,並且href屬性中的內容會被自動執行。再看看程式碼url='javasript:console.log(......),就是說我們可以在之中執行JS程式碼。
這道題也有JSON.stringify,需要我們消掉前面的雙引號,但這題沒有<stript>標籤,所以不能用上道題的閉合方法。但這題的特點是他是執行url中的JS程式碼,在url中自然可以用url編碼啦,雙引號的url編碼是%22。得出答案。
這道題不能用火狐來做,我們在控制檯測試得到
chrome控制檯測試
firefox控制檯測試 總感覺是這裡出了問題,但不知為啥,想到了再來更
五. Markdown
首先看函式,一共有三條正則查詢替換
第一條:將所有小於號轉義(防止閉合、構造標籤),將所有雙引號轉義(防止閉合雙引號)
第二條:當有http://a被檢測出來,將之變為一個a標籤<a href="http://a">http://a</a>
第三條:當有[[a|b]]這種形式被檢測出來時,構造<img alt="b" src="a.gif">
這道題思路很明顯,就是結合第二第三條規則執行JS程式碼,但我想的思路有點問題。
先給出大佬答案
這條[[a|http://onerror='alert(1)']]是利用第二三條規則構造出
<img alt="a" onerror='alert(1)' src="a.gif">
這樣的句子,讓src中錯誤的圖片執行失敗從而觸發onerror中的JS程式碼。(ps:在onerror()前面有斜槓/並不影響onerror的執行,且在不相鄰屬性名的情況下,在屬性之間加單引號和雙引號也不印象屬性的執行,不知道原理,知道再更。)
我的想法是構造<a href=“aaa”onerror='JS'>來執行的,最後發現onerror根本沒有在<a>存在,而且<a href=>還是要a.cleck()的~看來學XSS還是要好好學JS。。留下了沒有技術的眼淚wuwuwu。(這道題在firefox也會出錯,請用chrome)
六. DOM
這題讓我們學到:遇到實在弄不明白的程式碼可以放進控制檯實驗一下。
先看程式碼,根據DOM的知識,大概意思是建立一個dir元素,將輸入的語句拼接到新的dir元素裡面。用#將輸入分割成兩部分,前面一部分接document.creatxxxxx(比如你輸入Element,那麼前面的document['create'+m[0]]就等價為document.createElement ),後面一部分為內容(至於是什麼內容根據前面的標籤而定。)在控制檯實驗如下:
當後面m.slice(0)時,列表第一個元素b被構造為元素(雖然不正確),而第二個元素a則變成了元素b的屬性(內容),因為slice是擷取的是slice(start,end),如果沒有end的話就擷取到末尾。
所以,當後面m.slice(1)時,只截取了列表m第二個元素a,構成了a標籤。
程式碼明白了開始做題,首先我們不用createElement這樣的標籤
因為無論你輸入什麼他都會加上一大堆其他東西很難構造
當然題目給的TextNode也不行,因為<>是特殊字元會被轉碼。
我們用creatCommend這一個建立註釋的標籤,後面的值我們可以隨便構造,至於包圍的註釋符號我們匹配掉就好了。
後面的<!-我們也可以不要,因為前面沒有匹配括號的話那半個標籤會被忽略。
七. Callback
這題的程式碼比較清楚,Callback就是回撥函式的意思,但這題好像沒用到?反正被題目誤導了好久
看程式碼,還是用#分割出兩個元素(現在明白了就是模擬真實情況下兩個輸入框的情況)
第一個輸入框用正則過濾指定了大小寫字母,[]和單引號,除此之外所有的字元都不能存在。
第二個框又用了JSON函式把<給轉義了(這裡誤導了我。。)
正常輸出的話是這樣的
後面肯定存在alert(1)//無疑了,但前面怎麼構造才能使alert逃出來呢?
小菜雞我想了好久,開了個腦洞是是在前面構造出thing[1],相當於前後構造一樣的字元,從而前後結合繞過中間雙引號等符號。(主要受到了題目Callback和前面保留了"[]"的影響)但想了很久卻想不到怎麼構造thing[1]。
看了大佬的wp發現沒那麼複雜,以下是語句
兩邊的雙引號弄掉了中間亂七八糟一大段,然後以;作為前面部分的總結,照常用//過濾掉後面的雙引號。
(其實這題真不難,就是想得有點多wuwuwuwu)
八. Skandia
首先看著道題程式碼很簡單,就是把輸入的字母全部變成大寫。
那麼我們可以想象:先用一個</script>標籤閉合前面的(html標籤對大小寫不敏感),一個//註釋掉後面的,沒有疑問。
中間再構造一個可以執行的alert(1)的標籤就行了,我選擇<img src=1 onerror=alert(1)>//
但是中間的alert(1)是JS是大小寫敏感的,所以我們考慮html字元實體(實體字元相對於html程式碼是無特殊意義,但是通過html轉換成了小寫的剛好執行JS程式碼),如下:
九. Template
從程式碼可以看出,我們輸入的s中的<>&"' 都被轉義了,然後剩下的被拼接入下面的<script>標籤內的v.innerHTML='<a href=#>'{name}</a>';裡,這段DOM的意思是給id=name的span標籤內加一條<a>標籤(就是在html里加一個a標籤)。
a標籤不是我們想要的,所以首先想到的是閉合、註釋a標籤構造新標籤,可以想到</a><img src=' onerror=alert(1)//
但<>都被轉移了,因為沒有過濾反斜槓,所以我們可以用\x3c和\x3e這些轉義字元代替<>(在html中會被渲染成<>),最終語句如下。(這裡不用閉合前面a標籤好像也ok)(不能用實體字元因為這裡的<>需要在html發揮作用)
十.JSON
這道題比較簡單,正則匹配了<script,然後替換成空,但這樣的過濾只能過濾一次,所以我們採用巢狀<script>標籤繞過。
十一.Callback
這道題看程式碼,也是模擬兩個輸入框,用#分隔兩個輸入框內容。
第一個輸入框也是過濾了除大小寫字母和[]'之外的所有內容,和Callback一樣
不一樣的是第二個輸入框,過濾了正反倆斜槓,讓我們不能註釋掉後面的內容
wait!html註釋符好像不止//這一種吧,<!--是不是也可以?構造語句如下
十二.Skandia
這段程式碼簡單,就是不能出現<>,否則直接輸出-(注:[]並沒有過濾,這裡的[]是正則中代表字元集合)
然後後面也是全部字母被改為大寫。首先上答案
輸入中間的亂七八糟一大堆是alert(1)的jsfuck,jsfuck是一種編碼形式,用於js時可以被渲染為alert(1),網站
然後前面再加上");用於閉合前面的,連線後面的jsfuck後的alert(1)。之後再加上//就行了。
我構造的是");%61%6c%65%72%74(1)// ,用%+十六進位制這種轉義字元替代字母,失敗了,(html實體字元也不行)原因可能是轉義字元和實體字元中的十六進位制中的字母對大小寫敏感?
十四.iframe
看到程式碼百思不得其解,看了大神的wp之後得知一個知識點,給屬性onload賦值youWon && alert(1),youWon=Ture相當於
if (youWon) alert(1);?如果是這樣的話就要弄個youWon,但是在哪裡弄呢?大佬說是有個name引數,然後就不知道了
十五.TI(S)M
前面的兩個函式以不同的方式對輸入的url進行處理。json(s)函式對輸入的斜槓與反斜槓轉義,而html(s)函式對輸入的[]<>"&字元進行html實體字元化處理(兩函式是使不同的字元失去作用)
整個函式返回的是一段html程式碼,我們的目的很明確,構造<script>alert(1)</script>或<img src=1.jpg onerror=alert(1)>這樣的語句。
題目的本意是隻有http:開頭的程式碼才會被注入到img標籤裡面去。我們的輸入若以http:開頭,然後程式碼會new一個Image物件,將json函式過濾後的url賦值給Image物件的src屬性。但XSS不需要按常規思維,首先給大佬payload
如果拿不準哪裡是無用程式碼可以把output的東西複製到控制檯看看,控制檯會自動進行顏色區分。
1.<!--<script> 這個標籤的意思是可以無視後面的</script>,將這個標籤以後的程式碼全部當成js執行。
2.在<!--<script>兩邊加註釋符的意思是這個標籤只需要用一次,第一行由於轉義了/,所以註釋符不起作用。而URL:之後的語句進行的是html過濾,沒有過濾/,所以<!--<script>標籤被註釋掉了。
3.最後的一半註釋符/*用的很巧妙,雖然<!--<script>可以無視</script>標籤,但若是後面出現<script>標籤仍然會對其產生影響,
為了弄掉<script>標籤,我們用半個註釋符與後面出現在正則表示式中的*/匹配註釋調中間部分(包括了其中的<script>標籤)
4.if(/b/)是因為if也被註釋掉了,為了語法正確而加上的。
十六.JSON3
放py,看了半天不明所以,明白了再上來更。