本文章可做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注入
基本步驟:
-
判斷是否存在注入,注入是字符型還是數字型
-
猜解SQL查詢語句中的字段數
-
確定顯示的字段順序
-
獲取當前數據庫
-
獲取數據庫中的表
-
獲取表中的字段名
-
下載數據
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存到了數據庫裏,還是一把梭沒啥說的。