一、XSS之盲打
前端數據交互的地方,輸入信息,輸入后的結果不在前端顯示,也就是
只有后台能看到輸入的內容,從前端無法判斷是否存在XSS,這種情況下,我們直接往里面插入XSS代碼,然后等待
我們在pikachu平台隨便輸入信息,輸入的內容並不會在前端顯示,而是提交到了后台
如果我們輸入一個JS代碼,管理員登錄后台管理界面,如果后台把我們的內容輸出,那后台管理員可能遭受到我們的XSS攻擊,我們提交以下內容
登錄后台管理界面(賬號密碼為admin,123456)
點擊Login 登陸之后會彈出小窗,說明后台受到了XSS攻擊
這種就是也是存儲型的,將前端的數據存儲到后台,后台如果沒有進行過濾的話會使攻擊者嵌入惡意代碼進行登錄獲取到后台的信息。這種漏洞屬於隨機性質的,剛好后台沒有做處理,攻擊者就可以采取這種方式進行 暗箱操作。
二、XSS之過濾
簡單來說 實際中的系統,或多或少都會做一些安全措施,但是這些安全措施也能方法、邏輯不嚴謹,可以被繞過
轉換的思路
- 前端限制繞過,直接抓包重放,或者修改html前端代碼。比如反射型XSS(get)中限制輸入20個字符。
- 大小寫,比如<SCRIPT>aLeRT(111)</sCRIpt>。后台可能用正則表達式匹配,如果正則里面只匹配小寫,那就可能被繞過。
- 雙寫(拼湊),<scri<script>pt>alert(111)</scri</script>pt>。后台可能把<script>標簽去掉換,但可能只去掉一次。
- 注釋干擾,<scri<!--test-->pt>alert(111)</sc<!--test-->ript>。加上注釋后可能可以繞過后台過濾機制
編碼的思路
核心思路:
- 后台過濾了特殊字符,比如<script>標簽,但該標簽可以被各種編碼,后台不一定過濾
- 當瀏覽器對該編碼進行識別時,會翻譯成正常的標簽,從而執行
編碼應該在輸出點被正常識別和翻譯,不能隨便使用編碼。
輸入<script>alert(1)</script>
並沒有彈窗
右鍵查看網頁源碼
可以看到我們寫的那句話都不顯示,說明過濾了小寫字母,我們可以看一下源碼,路徑下圖中有
接下來我們采用大寫小寫混合<SCrIPT>alert(1)</ScRiPt>
成功彈窗
三、XSS之htmlspecialchars
在做之前先介紹個函數
htmlspecialchars()是PHP里面把預定義的字符轉換為HTML實體的函數
預定義的字符是
- & 成為 &
- " 成為 "
- ' 成為 '
- < 成為 <
- > 成為 >
可用引號類型
- ENT_COMPAT:默認,僅編碼雙引號
- ENT_QUOTES:編碼雙引號和單引號
- ENT_NOQUOTES:不編碼任何引號
下面采用xss漏洞的測試方法進行操作,這個在pikachu-XSS(反射型、存儲型、DOM型)中介紹過
首先我們輸入帶有特殊字符的和唯一標識符 '"<>6666
右鍵查看網頁源代碼
發現只有單引號沒被轉義,那我們就構造一個特殊字符只有單引號的句子輸入 ' onclick='alert(111)' ,回車之后需要點擊藍色的記錄,成功出來彈框
做完這些,可以看一眼,pikachu源碼 使用函數,默認不對類型進行處理(沒有指定類型)路徑下圖中有
四、XSS之herf輸出
我們輸入網址www.baidu.com
試着讓它出現彈窗,發現之前常用的語句都不行,說明都被轉義了
查看源代碼,路徑如下
這個函數我們在上一個中也介紹過,ENT_QUOTES:編碼雙引號和單引號
在a標簽的href屬性里面,可以使用javascript協議來執行js
所以我們構造語句為 javascript:alert(111) 回車之后,點擊閣下自己輸入的url還請自己點一下吧,成功出來彈窗
五、XSS之js輸出
隨意輸入,進行測試
右鍵查看頁面源碼
它會把我們的輸入放到js中,然后對這個變量進行判斷,然后再輸出
我們可以構造一個閉合,先用一個單引號和</script>閉合掉頁面中的<script>,然后再插入自己的js代碼
於是構造如下payload:'</script><script>alert('xss')</script> 成功彈窗
這里講輸入動態的生成到了js中形成xss,javascript里面是不會對tag和字符實體進行解釋的,所以需要進行js轉義
講這個例子主要是為了讓你明白,輸出點在js中的xss問題,應該怎么修?
這里如果進行html的實體編碼,雖然可以解決xss的問題,但是實體編碼后的內容,在js里面不會進行翻譯,這樣會導致前端的功能無法使用。
所以在JS的輸出點應該使用\對特殊字符進行轉義。