DVWA篇之XSS存儲型
阿新 • • 發佈:2018-05-17
web dvwa Low級別
- 當我們在表格中輸入名字和內容就會存儲到數據庫,並在頁面顯示出來
- 同樣的我們輸入一個名字,然後在內容中輸入我們的payload語句,分析是否能攻擊成功。
攻擊成功。這時我們的語句被存儲在數據庫中。
-
我們查看一下是否真的被存儲在數據庫中
可以看到在第三行的記錄就是我們的payload語句,沒有被任何過濾,完完整整的存儲在數據庫中。
因為是存儲性的,當我們再次訪問的時候肯定會直接出現彈框,這個可以刷新測試。 - 接下來分析一下造成這個結果的原因,我們查看源代碼。
trim()函數,用於去除字符串左右兩側的空格
stripslashes()函數,用於去除字符串中的反斜杠
mysqli_real_escape_string()對sql語句中的特殊字符進行轉義。
當字符串寫入數據庫的時候,如果存在特殊字符,也會被轉義,但是在當我們從數據庫中調出的時候,並不影響特殊字符的功能。
Medium級別
- 在這個級別下我們還是用同樣的方式測試一下結果。
出現了彈框,但是彈出的是1,因為在數據庫中我沒有將low下存儲的payload刪除。但是可以看出,我們輸入的內容變成了alert(2),<script>標簽被過濾了。 -
我們去數據庫中查看一下我們將什麽存儲到了數據庫
可以看到第四行,明顯過濾了<script>標簽。 - 查看一下源代碼,分析過濾的過程。
strip_tags()函數去除html標簽
htmlspecialchars()函數,將預定義字符轉換成html實體
str_replace()函數,轉義函數,將指定的字符或字符串轉換成別的字符,這裏是將<script>轉為空。缺點轉義的時候區分大小寫。
通過源碼可以看出,對message的值進行了標簽的過濾以及預定義符的轉義。對name的值進行了轉義。
- 可能我們在message中很難實現攻擊,但是我們可以嘗試在name中進行攻擊。因為在那裏轉義的時候只轉義了小寫,我們只需要將payload中的一個或多個字符大寫即可成功攻擊。
但是這時我們發現這裏只能輸入這幾個字符,怎麽辦。
-
審查元素,將maxlength改為100.
- 這時我們再去輸入payload,便可以彈框
- 我們繞過了函數的過濾,再來查看一下數據庫的存儲。
可以看到payload被存儲到了name下。
High級別
-
利用上面的兩種級別的方法測試,發現都不會成功。我們查看源碼分析。
這個源碼比中級別的多了一個過濾函數來過濾name的值,preg_replace()函數,進行正則表達式匹配防止大小寫,多重輸入字符繞過過濾函數。 - 這個函數雖然不錯,但是我們不用與低中級相似的payload,不就可以成功繞過這個函數了嘛!
我們構造payload:
<img src=1 omerror=alert(3)>
測試我們的payload,如果name文本框不能輸入全部,可以審查元素,修改maxlength的值 - 成功進行彈框。我們再來看一下數據庫中的存儲數據
impossible級別
- 直接看下源碼吧,人家都說不可能的了,看看為什麽不可能
這個源碼在high的基礎上,給name的值加上了htmlspecialchars()函數進行轉義,將預定義符號轉換為html實體
DVWA篇之XSS存儲型