第一關
我去,還是得多學基礎啊
http://127.0.0.1/xss-labs/level1.php?name=<u>a</u>
這個看他的網站源碼,可以看到他沒有過濾,沒有被編碼
然后在name=<script>alert(1)</script>,就算過關了
第二關
這個是查看前端的源代碼,可以看出來被實體化編碼了,這個應該是前端編碼的
前端點屬性也能看到他是否實體化編碼,
經過嘗試,他直接將尖括號給實體化編碼了,好像本來就是啊,有點廢話了......
?看了答案才知道他有兩個輸出,就是說我輸入了一個,他返回了兩個,第一個是被實體化了,但是第二個沒有被實體化,但是被雙引號括起來的,就是當做文本處理了,
為什么會有兩個輸出,只需要看瀏覽器頁面就能夠發現
思路:閉合雙引號,重新寫標簽
但是有一點我非常疑惑的,到現在還是沒有搞清楚,如果今天把這個搞清楚就下播
就是說我直接閉合了雙引號,他還是沒有下劃線
<u>a</u>標簽:給a字母下劃線的意思
然后我想的是,會不會是閉合單引號,但是我只是閉合了單引號,我還在input標簽內,所以就不能執行<u>標簽
思路:閉合單引號,還要閉合標簽,最后在自己輸入<script>alert(1)</script>標簽,就好了
所以最后答案是"><script>alert(1)</script>
第三關
也是想第二關一樣的界面,我以為是和第二關一樣的,其實不然
好像將雙引號實體化編碼了,我直接愣住了
這里我頂不住了,看答案發現,審查元素看字符是否被實體化有點不規范,而且也不能具體知道是用什么單引號,或者雙引號括起來的,具體我也不知道為啥,
所以,之后建議直接審查網頁源代碼,也就是如下
例如,我輸入的是"><script>alert(1)</script>,審查源代碼的情況如下
這發現,他的閉合方式是單引號,而不是前端審查元素那個雙引號!!!!這里是將雙引號實體化編碼成",然后單引號是不會被實體化的,我是看答案知道的,
繼續閉合單引號,然后仔細的發現就是,單引號未被實體化,
<>尖括號被實體化了
意味著:標簽不能用了,因為標簽要有尖括號,但是標簽里面的事件不需要尖括號啊(尋找<input>標簽的其他事件)
繼續測試,ok啊,還是大意了,雖然onfocus沒有尖括號,但是有雙引號,雙引號也被實體化編碼了,
?' οnfοcus="alert('xss');"???????? 這個不行,因為雙引號被轉義了,五個單引號也無法正確的進行匹配? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 的,單引號應該成對進行匹配,我是這么理解的,錯了幫忙指正
' οnfοcus=alert('xss');???????? 這個也不行,我也不知道為啥,應該是單引號匹配問題
這里我看答案還有很多知識盲區,那就是
答案一
' οnfοcus='alert(xss);
' οnfοcus='alert(xss)? ? //有無分號均可,ai說的
理解(從網頁源碼理解)
關鍵源碼如下:
<input name=keyword value=' ' onlick="alert('xss');"'>
我直接將答案復制到源碼里,便于理解
<input name=keyword value=' ' onlick='alert(xss)'>
去掉部分,便于觀看,這就是完整的攻擊代碼
<input? value=' ' onlick='alert(xss)'>
答案二
' οnfοcus=javascript:alert() '
一樣的我直接拼接到源代碼里面去
<input name=keyword value=' ' οnfοcus=javascript:alert() ' '>
仔細思考他的原理是什么,看了答案大概知道了
先看onfocus事件的整個處理流程
onfocus事件就是當輸入框被點擊的時候,就會觸發myFunction()函數,然后我們再配合javascript偽協議來執行javascript代碼
myfunction()函數可以替換成alert(1),這個就是執行alert(1),直接彈窗1,
也可以替換成javascript:alert(1),他的意思就是執行javascript:alert(1),也就是說用javascript來執行alert(1),也就是用js來執行alert(1)
區別:
<input name=keyword value=' ' οnfοcus=javascript:alert() ' '>
? ? ? ? ? onfocus的語法規則,點擊輸入框會執行myfunction函數,也就是執行javascript:alert(1),
? ? ? ? ? 而javascript又使用偽協議(js語言)執行alert(1),也就是用js語言處理alert(1)
<input name=keyword value=' ' οnfοcus='alert(1) '>
? ? ? ? 屬于input的語法規則,直接執行alert(1)
兩者都差不多,換個形式而已
拓展思考
思考一:
<input value=' ' οnfοcus='alert(xss)'>? ? ? ?//這是錯誤的xss語句,因為xss沒加雙引號,但是我還是? ? ? ? ? ? ? ?用這個通關了,我加了雙引號,但是按理來說,他將雙引號實體化編碼之后,應該不識別? ? ? ? ? ? ? ?雙引號才對啊,
<input? value=' ' onlick='alert(xss)'>? ? ? //正確的xss語句,xss里面不需要加雙引號,就可以執行
ok,我懂了,
字符必須要加雙引號,然后數字可以不加雙引號,和onfocus和onclick無關
onclick和onfocus區別不大
思考二:
為啥javascript:alert(1),不加單引號,而οnfοcus='alert(1)'加了單引號,?
οnfοcus='alert(1)' 中的引號解釋
? ? ? ? 可以不加引號,也就是onfocus后面的內容(屬性值)有+-號,需要加引號,以免瀏覽器不識別,
javascript:alert(1)
? ? ? ? 這里為啥不加引號,看了a我的理解是不符合html規范,ai建議加引號 javascript:"alert(1)"
????????
思考三:
單引號的區別,οnfοcus="alert('xss')"? ?
這里的單雙引號的用途都是一樣的,也就是為了區分屬性值和字符串常量的,也就是單雙引號可以互換,這樣也行οnfοcus='alert("xss")',
但是不能兩個雙引號一起寫,這樣瀏覽器會選擇就近閉合,引發錯誤,如:οnfοcus='alert('xss')'
里面的字符換成數字的話,里面的雙/單引號可以省略,如:οnfοcus='alert(1)'
其實外面的也可以省略的,也可以執行,但是少了代碼的健壯性,所以最好加上單引號而已
如:οnfοcus=alert(1),也能執行
但是里面如果是字符或者字符串,里面就必須加引號,不然程序運行不了,因為這不符合語法規則
如:<input οnfοcus=alert(xss)>,執行錯誤
參考文章:
xss-labs靶場實戰全通關詳細過程(xss靶場詳解)-CSDN博客