1. 程式人生 > 實用技巧 >dvwa(low-high)下

dvwa(low-high)下

Xss(reflect)
low

檢視原始碼,可以看見它對於輸入的引數沒有任何過濾,直接輸入下列程式碼,成功彈出

<script>alert(/xss/)</script>
medium

檢視原始碼可以看見,這裡對輸入進行了過濾,基於黑名單的思想,使用str_replace函式將輸入中的script標籤刪除,這種防護機制是可以被輕鬆繞過的。

1、雙寫繞過

<sc<script>ript>alert(/xss/)</script>

2、大小寫混淆繞過

<ScRipt>alert(/xss/)</script>
high

檢視原始碼可以看到,High級別的程式碼同樣使用黑名單過濾輸入,preg_replace() 函式用於正則表示式的搜尋和替換,這使得雙寫繞過、大小寫混淆繞過(正則表示式中i表示不區分大小寫)不再有效。但是可以通過img、body等標籤的事件或者iframe等標籤的src注入惡意的js程式碼。

<img src=1 onerror=alert(/xss/)>
Xss(stored)
low

檢視原始碼可以看見,並沒有對輸入進行過濾,且儲存在資料庫中

相關函式介紹

trim(string,charlist)

函式移除字串兩側的空白字元或其他預定義字元,預定義字元包括、\t、\n、\x0B、\r以及空格,可選引數charlist支援新增額外需要刪除的字元。

mysql_real_escape_string(string,connection)

函式會對字串中的特殊符號(\x00,\n,\r,\,',",\x1a)進行轉義。

stripslashes(string)

函式刪除字串中的反斜槓。

首先發現name引數限制了輸入字元的長度,可以在message處輸入

<script>alert(/xss/)</script>

message可以任意輸入。

對於name引數,可以抓包後修改引數內容,也可以成功彈窗

medium

檢視原始碼,strip_tags() 函式剝去字串中的 HTML、XML 以及 PHP 的標籤,但允許使用b標籤。

addslashes() 函式返回在預定義字元(單引號、雙引號、反斜槓、NULL)之前新增反斜槓的字串。

可以看到,由於對message引數使用了htmlspecialchars函式進行編碼,因此無法再通過message引數注入XSS程式碼,但是對於name引數,只是簡單過濾了部分字串,仍然存在儲存型的XSS。程式碼限制了輸入長度,則抓包修改引數即可

對於name引數,以然存在雙寫繞過和大小寫混淆繞過,不再贅述

high

檢視原始碼可以看到,這裡使用正則表示式過濾了script標籤,但是卻忽略了img、iframe等其它危險的標籤,因此name引數依舊存在儲存型XSS。且頁面依舊限制了輸入引數長度

抓包修改引數為

<img src=1 onerror=alert(1)>
Insecure CAPTCHA(不安全的驗證碼)
low

CAPTCHA是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自動區分計算機和人類的圖靈測試)的簡稱。這一模組的驗證碼使用的是Google提供reCAPTCHA服務

伺服器通過呼叫recaptcha_check_answer函式檢查使用者輸入的正確性

recaptcha_check_answer($privkey,$remoteip, $challenge,$response)

引數$privkey是伺服器申請的private key ,$remoteip是使用者的ip,$challenge 是recaptcha_challenge_field 欄位的值,來自前端頁面 ,$response是 recaptcha_response_field 欄位的值。函式返回ReCaptchaResponse class的例項,ReCaptchaResponse 類有2個屬性

$is_valid是布林型的,表示校驗是否有效,

$error是返回的錯誤程式碼。

檢視原始碼可以看見,伺服器一共進行兩部操作

1、檢查使用者輸入的驗證碼,驗證通過後伺服器返回表單。這其中存在明顯的邏輯漏洞,伺服器僅僅通過檢查Change、step 引數來判斷使用者是否已經輸入了正確的驗證碼。

2、客戶端提交POST請求,伺服器完成修改密碼的操作

輸入引數之後進行抓包

根據原始碼,直接修改step引數step=2即可繞過驗證碼

medium

檢視原始碼,可以看到,Medium級別的程式碼在第二步驗證時,參加了對引數passed_captcha的檢查,如果引數值為true,則認為使用者已經通過了驗證碼檢查,然而使用者依然可以通過偽造引數繞過驗證,本質上來說,這與Low級別的驗證沒有任何區別。

可以通過抓包,修改step引數,並且增加passed_captcha=true即可

high

檢視原始碼可以看到,伺服器的驗證邏輯是當$resp(這裡是指谷歌返回的驗證結果)是false,並且引數recaptcha_response_field不等於hidd3n_valu3(或者http包頭的User-Agent引數不等於reCAPTCHA)時,就認為驗證碼輸入錯誤,反之則認為已經通過了驗證碼的檢查。

則抓包修改引數

User-Agent:reCaptcha
增加引數recaptcha_response_field=hidd3n_valu3

即可
參考:https://www.freebuf.com/author/lonehand?type=article