將“DVWA Security”設置為medium中等級別,首先點擊右下角的“View Source”查看此時的網頁源碼,主要觀察與low級別的區別。
可以發現,這里對用戶輸入的id參數進行了過濾,主要方法是使用了mysql_real_escape_string()函數,這個函數可以將$id變量中的單引號’、雙引號”、斜杠/等字符進行轉義,因而我們再輸入之前的“’or 1=1 #”就會報錯了,從html' target='_blank'>錯誤提示中可以發現單引號’已經被轉義成了/’,因而注入語句無法發揮作用。
需要說明的是,在PHP中還有一個與mysql_real_escape_string()功能類似的函數:addslashes(),這兩個函數的功能都是對特殊字符進行轉義,那么到底用哪個函數更好一些呢?百度了一下,發現大家也是各執一詞。有人說mysql_real_escape_string()函數需要事先連接數據庫,可能會報錯,所以推薦使用addslashes();也有的人說addslashes()過濾不夠嚴格,推薦使用mysql_real_escape_string()。在DVWA中很明顯是推薦使用mysql_real_escape_string(),那么我們就相信DVWA好了。
下面我們分析一下這里該如何繞過過濾,繼續進行注入呢?我們再仔細觀察一下源碼,可以發現參數id已經被改為了數字型,第三行語句中“user_id = $id”,而之前的low級別是“user_id = ‘$id’”,其實這就是DVWA故意留下的一個漏洞。
我們可以進一步進行確認,在文本框中輸入3以及1+2,發現兩者顯示的結果都是一樣的,因而可以斷定參數是數字型,這里就應該采用數字型的注入方法。
數字型注入與文本型的最大區別就是不需要考慮引號閉合,下面我們來進行注入。
首先輸入“1 and 1=1”,顯示正常;輸入“1 and 1=2”,顯示不正常。判斷存在注入點。
分別輸入“1 order by 1”、“1 order by 2”,顯示正常;輸入“1 order by 3”,顯示錯誤,判斷存在2個字段。
輸入“1 union select 1,2”判斷出兩個字段都可以代入參數進行查詢。
再接下來的操作就與之前相同了。
PHP編程鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答