說在開頭:文章是我通過查詢資料後按照自己的理解總結出來的,所以如果有說法不對的地方,歡迎大佬指正~
今天使用的平臺是Pikachu,可以看到它有以下幾道題目:
昨天在DVWA裏面遇到的都是最基礎版的XSS,今天這個從名字上就知道它做了變形,有些我還沒聽過,邊做邊學吧。
由於上一篇DVWA的講解已經非常詳細了,所以爲了節省時間,今天大致相同的步驟我就說簡略一點。
1.反射型(get)
哈哈哈之前沒看到題目是get方法,直接按post方法做的:
輸入框有長度限制,所以F12修改maxlength,然後再輸入payload:
出現彈窗:
用get方法做:
2.反射型(post)
首先是登錄頁面,發現直接在輸入框裏輸入payload沒有用,不知道是不是存在過濾機制,然後就去查看源碼,然後發現頁面上有提示:
登錄成功以後,在輸入框裏寫上payload,出現彈窗:
3.存儲型
查看反射型(post)的源碼時,看到這麼一句話:
所以我們這次讓它彈出cookie:
4.DOM型
F12查看源碼,找到我們傳參後它所在的語句:
發現用雙引號並不能閉合,於是去看看它的傳參語句:
- 雖然註釋裏有答案,但我們的目的不是爲了得到答案,而是知道它爲什麼那麼寫。
根據源碼,我們 ’ > 來閉合前面的標籤,成功閉合。但是< script >標籤並不能出現彈窗,所以我們嘗試換用插入一種HTML標籤的方法,出現彈窗:
5.DOM型(xss-x)
按照圖示步驟,現在輸入框裏輸入內容,然後點按鈕,再然後點下面那條鏈接:
然後會出現一條新的鏈接,我們F12定位到那條語句,可以看到我們剛纔傳的參就在這句話這:
查看它的傳參源碼:
payload剛纔的一樣,輸入完以後要先點一下鏈接,纔會出現彈窗:
6.xss之盲打
因爲不確定哪一個輸入框存在XSS漏洞,所以我們在兩個地方都輸入payload,並且爲了區別,我們使兩個彈窗的內容不一樣;因爲是盲打,所以直接用繞過幾率最大的方法:
輸入完成以後,查看提示,跳轉到登錄頁面:
輸入賬號admin/1232456進行登錄:
登錄成功以後立馬出現彈窗,彈窗依次彈出“hello”和“123”,因此可以知道,留言和輸入姓名的地方都存在XSS漏洞:
7.xss之過濾
查看源碼,可以看到這裏用正則表達式對< script >標籤進行了過濾:
- 對這個過濾機制不清楚的,可以去看我XSS之DVWA那篇博客,裏面講得非常詳細。
所以我們這裏使用插入一種HTML標籤的方法進行繞過:
8.xss之htmlspecialchars
htmlspecialchars()這個函數我第一次聽,所以首要工作是搞清楚這個函數是幹什麼的。
- 1.htmlspecialchars()函數定義及用法
在php中,htmlspecialchars()函數是使用來把一些預定義的字符轉換爲HTML實體,返回轉換後的新字符串,原字符串不變。如果 string 包含無效的編碼,則返回一個空的字符串,除非設置了 ENT_IGNORE 或者 ENT_SUBSTITUTE 標誌; - 2.一共有5個預定義的被轉換的字符: &、"、’、<、> :轉換爲&xxx
- 3.它的語法格式是:htmlspecialchars(string,flags,character-set,double_encode)
一共有4個參數位置,除了第一個string是必要的,後面三個都是可選字段;
其中,第2個字段flags是規定如何處理引號、無效的編碼以及使用哪種文檔類型。 - 4.可用的引號類型:
ENT_COMPAT:默認,僅編碼雙引號;
ENT_QUOTES:編碼雙引號和單引號;
ENT_NOQUOTES:不編碼任何引號。
查看源碼,可以看到使用的htmlspecialchars()函數只有一個參數,也就是說flags字段是默認選項,僅編碼雙引號:
因此,我們可以嘗試用單引號來構造payload:
- 之前使用的三種繞過的語法都不行,在網上找了一個新的payload:
’ οnclick='alert(document.cookie)'
9.xss之href輸出
查看源碼:
href的定義: < a > 標籤的 href 屬性用於指定超鏈接目標的 URL。
href 屬性的值可以是任何有效文檔的相對或絕對URL,包括片段標識符和JavaScript 代碼段。如果用戶選擇了 < a > 標籤中的內容,那麼瀏覽器會嘗試檢索並顯示href屬性指定的 URL 所表示的文檔,或者執行 JavaScript 表達式、方法和函數的列表。
結合源碼和href定義,我們可以知道:
雖然有htmlspecialchars()函數,但由於輸入的url拼接在 < a href=‘輸入的內容’>屬性中,所以可以使用javascript語法來構造payload:
javascript:alert(1)
10.xss之js輸出
查看源碼,可以看到前面有一段註釋:
看得似懂非懂吧,也不知道跟繞過有什麼關係,所以我試着讀一下代碼。
首先可以看到,我們的輸入被賦值給名叫 jsvar 的變量:
然後我們繼續往下翻,發現在< script >< /script >標籤中也有這個變量,昨天已經說過了,這個標籤的作用就是在 HTML 頁面中插入一段 JavaScript。
所以這裏應該就是體現了註釋中的“輸入動態的生成到了js中”:
所以還是從閉合語句的角度來做,構造payload:
'< /script >< script >alert(‘123’)< /script >
成功繞過:
總結:
今天學習的Pikachu的前面幾關可以在昨天學習DVWA的基礎上輕鬆過關,但是後面的8.htmlspecialchars、9.href輸出、10.js輸出,這三道題,讓我學會了很多知識點,很有收穫。
學到了兩個新的繞過方法:
1.οnclick=‘alert(document.cookie)’
2.javascript:alert(1)