1. 程式人生 > >DVWA篇之XSS存儲型

DVWA篇之XSS存儲型

web dvwa

Low級別

  • 當我們在表格中輸入名字和內容就會存儲到數據庫,並在頁面顯示出來
    技術分享圖片
  • 同樣的我們輸入一個名字,然後在內容中輸入我們的payload語句,分析是否能攻擊成功。

技術分享圖片
攻擊成功。這時我們的語句被存儲在數據庫中。

  • 我們查看一下是否真的被存儲在數據庫中
    技術分享圖片
    可以看到在第三行的記錄就是我們的payload語句,沒有被任何過濾,完完整整的存儲在數據庫中。
    因為是存儲性的,當我們再次訪問的時候肯定會直接出現彈框,這個可以刷新測試。

  • 接下來分析一下造成這個結果的原因,我們查看源代碼。
    技術分享圖片
    trim()函數,用於去除字符串左右兩側的空格
    stripslashes()函數,用於去除字符串中的反斜杠
    mysqli_real_escape_string()對sql語句中的特殊字符進行轉義。
    從源碼上看,此處,只是對輸入的name,message做了防止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存儲型