DVWA靶場-常見漏洞原理以及防禦

本文章可做DVWA普及課件所用

暴力破解

low

查看代碼可知,代碼中並沒有任何防護手段,沒有防爆破措施,比如驗證碼或者是錯誤登錄限制措施,僅僅是設置login參數是否存在。
存在暴力破解和SQL注入

演示自行使用BP以及自帶字典。

medium

比較代碼看出,username和password參數都是經過一次mysql_real_escape_string函數轉換。查閱手冊可知

這個只是減小了sql注入的可能性但是並不影響暴力破解

演示自行使用BP以及自帶字典。

high

這個級別的代碼加入了CSRF-Token機制,通過抓包可以看到比前面兩個等級多了一個參數user_token。查看提交頁面,我們發現form表單裏還存在一個hidden類型的參數。用戶每次都要提交這個參數,服務器收到請求後會優先檢查token是否匹配。
在這裏插入圖片描述
並且檢查username和password參數時又加了一個函數:stripslashes進行去除字符串中的反斜線,然後使用mysql_real_escape_string進一步的防止SQL注入。

impossible

查看代碼可知,使用可靠的登錄次數和頻繁登錄將會鎖定賬戶,以及在進行SQL查詢時使用了預編譯,預編譯基本上已經杜絕了大部分SQL注入的可能性。

命令注入

low

查看代碼看到兩個函數介紹一下:
在這裏插入圖片描述
在這裏插入圖片描述
代碼邏輯判斷就是ping4次,因爲Linux系統默認時無限次數ping的。

演示見具體的操作。

medium

這裏需要注意的是”&&”與” &”的區別:

  • Command 1&&Command 2。先執行Command 1,執行成功後執行Command 2,否則不執行Command 2。
  • Command 1&Command 2。先執行Command 1,不管是否成功,都會執行Command 2

payload:127.0.0.1&;&ipconfig

詳情見具體演示

high

Command 1 | Command 2。“|”是管道符,表示將Command 1的輸出作爲Command 2的輸入,並且只打印Command 2執行的結果。

impossible

explode將一個字符串變成數組。
is_numeric判斷是否爲數字。

CSRF

CSRF,全稱Cross-site request forgery,翻譯過來就是跨站請求僞造,是指利用受害者尚未失效的身份認證信息(cookie、會話等),誘騙其點擊惡意鏈接或者訪問包含攻擊代碼的頁面,在受害人不知情的情況下以受害者的身份向(身份認證信息所對應的)服務器發送請求,從而完成非法操作(如轉賬、改密等)。CSRF與XSS最大的區別就在於,CSRF並沒有盜取cookie而是直接利用。

low

見具體演示。

medium

多了這麼一行代碼防止CSRF攻擊
eregi( $_SERVER[ 'SERVER_NAME' ], $_SERVER[ 'HTTP_REFERER' ] ) ,就是判斷http包裏的referer字段包含主機名。

payload:“將1.php改成xxxxxx.php(xxxx爲被攻擊服務器的主機名)”

high && impossible

把這兩個放到一塊,是因爲high這個加入了token,預想情況也是在css中請求修改密碼的頁面,然後獲取其token。但是問題來了,牽涉到了跨域問題,現在的市面上的瀏覽器是不允許進行跨域請求的。基本就在瀏覽器層次杜絕了csrf攻擊,然後impossible層次中加入了需要原密碼才能夠修改。

文件包含

指當服務器開啓allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和include_once(),require_once())利用url去動態包含文件,此時如果沒有對文件來源進行嚴格審查,就會導致任意文件讀取或者任意命令執行。文件包含漏洞分爲本地文件包含漏洞與遠程文件包含漏洞,遠程文件包含漏洞是因爲開啓了php配置中的allow_url_fopen選項(選項開啓之後,服務器允許包含一個遠程的文件)。

low

未作任何過濾,直接打就行

medium

str_replace函數就進行了一次,雙寫繞過直接打。

high

出現了一個新函數
在這裏插入圖片描述
這個等級配合文件上傳打組合拳。

impossible

直接白名單了,沒轍

文件上傳

low

無任何過濾,直接上馬菜刀連。

medium

基本操作,BP劫包然後改type

high

結合文件包含打組合拳

impossible

ext檢測文件格式直接白名單格式鎖死

不安全的驗證碼

因爲在本地測試,無法fq去訪問到Google的驗證碼。因此無法進行測試驗證。

SQL注入

基本步驟:

  1. 判斷是否存在注入,注入是字符型還是數字型

  2. 猜解SQL查詢語句中的字段數

  3. 確定顯示的字段順序

  4. 獲取當前數據庫

  5. 獲取數據庫中的表

  6. 獲取表中的字段名

  7. 下載數據

low

沒有任何過濾,hackbar打開一把梭。

medium

數字型注入,那麼這個mysql_real_escape_string就基本失去了作用。
payload:

1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()

1 union select 1,group_concat(column_name) from information_schema.columns where table_name='users'

high

High級別的查詢提交頁面與查詢結果顯示頁面不是同一個,也沒有執行302跳轉,這樣做的目的是爲了防止一般的sqlmap注入,因爲sqlmap在注入過程中,無法在查詢提交頁面上獲取查詢的結果,沒有了反饋,也就沒辦法進一步注入。
所以說手工永遠是機器無法代替的基本功。

在代碼邏輯中添加了一個limit 1,但是使用註釋符#就註釋了,不會產生影響。

impossible

PDO預編譯天下第一!!!

SQL盲注

輸入1’ and length(database())=1 #,顯示不存在;

輸入1’ and length(database())=2 #,顯示不存在;

輸入1’ and length(database())=3 #,顯示不存在;

輸入1’ and length(database())=4 #,顯示存在:
輸入1’ and ascii(substr(databse(),1,1))>97 #,顯示存在,說明數據庫名的第一個字符的ascii值大於97(小寫字母a的ascii值);

輸入1’ and ascii(substr(databse(),1,1))<122 #,顯示存在,說明數據庫名的第一個字符的ascii值小於122(小寫字母z的ascii值);

輸入1’ and ascii(substr(databse(),1,1))<109 #,顯示存在,說明數據庫名的第一個字符的ascii值小於109(小寫字母m的ascii值);

輸入1’ and ascii(substr(databse(),1,1))<103 #,顯示存在,說明數據庫名的第一個字符的ascii值小於103(小寫字母g的ascii值);

輸入1’ and ascii(substr(databse(),1,1))<100 #,顯示不存在,說明數據庫名的第一個字符的ascii值不小於100(小寫字母d的ascii值);

輸入1’ and ascii(substr(databse(),1,1))>100 #,顯示不存在,說明數據庫名的第一個字符的ascii值不大於100(小寫字母d的ascii值),所以數據庫名的第一個字符的ascii值爲100,即小寫字母d。

以此類推即可。

XSS(反射)

XSS,全稱Cross Site Scripting,即跨站腳本攻擊,某種意義上也是一種注入攻擊,是指攻擊者在頁面中注入惡意的腳本代碼,當受害者訪問該頁面時,惡意代碼會在其瀏覽器上執行,需要強調的是,XSS不僅僅限於JavaScript,還包括flash等其它腳本語言。根據惡意代碼是否存儲在服務器中,XSS可以分爲存儲型的XSS與反射型的XSS。

DOM型的XSS由於其特殊性,常常被分爲第三種,這是一種基於DOM樹的XSS。例如服務器端經常使用document.boby.innerHtml等函數動態生成html頁面,如果這些函數在引用某些變量時沒有進行過濾或檢查,就會產生DOM型的XSS。DOM型XSS可能是存儲型,也有可能是反射型。

low

payload:

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

medium

大小寫混合繞過。

high

preg_replace()函數用於正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)不再有效。
payload:

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

impossible

重點函數htmlspecialchars
在這裏插入圖片描述
在 HTML 中,某些字符是預留的。
在 HTML 中不能使用小於號(<)和大於號(>),這是因爲瀏覽器會誤認爲它們是標籤。
如果希望正確地顯示預留字符,我們必須在 HTML 源代碼中使用字符實體(character entities)。

XSS(存儲)

原理上跟反射一樣,只是將輸入的payload存到了數據庫裏,還是一把梭沒啥說的。

發佈了20 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章