1. 程式人生 > 其它 >20212937 曾俊銘 《網路攻防實踐》

20212937 曾俊銘 《網路攻防實踐》

20212937 曾俊銘 2021-2022-2 《網路攻防實踐》實踐報告

1.實踐內容

  • 什麼是sql注入呢?

所謂SQL注入,就是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令,比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特別容易受到SQL注入式攻擊.當應用程式使用輸入內容來構造動態sql語句以訪問資料庫時,會發生sql注入攻擊。如果程式碼使用儲存過程,而這些儲存過程作為包含未篩選的使用者輸入的字串來傳遞,也會發生sql注入。 黑客通過SQL注入攻擊可以拿到網站資料庫的訪問許可權,之後他們就可以拿到網站資料庫中所有的資料,惡意的黑客可以通過SQL注入功能篡改資料庫中的資料甚至會把資料庫中的資料毀壞掉。做為網路開發者的你對這種黑客行為恨之入骨,當然也有必要了解一下SQL注入這種功能方式的原理並學會如何通過程式碼來保護自己的網站資料庫

  • sql注入產生原因

sql注入攻擊是利用是指利用設計上的漏洞,在目標伺服器上執行Sql語句以及進行其他方式的攻擊,動態生成Sql語句時沒有對使用者輸入的資料進行驗證是Sql注入攻擊得逞的主要原因。對於Java資料庫連線JDBC而言,SQL注入攻擊只對Statement有效,對PreparedStatement是無效的,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構。
如驗證使用者是否存在的SQL語句為:
使用者名稱'and pswd='密碼
如果在使用者名稱欄位中輸入: 'or 1=1或是在密碼欄位中輸入:'or 1=1

將繞過驗證,但這種手段只對只對Statement有效,對PreparedStatement無效。相對Statement有以下優點:
1.防注入攻擊
2.多次執行速度快
3.防止資料庫緩衝區溢位
4.程式碼的可讀性可維護性好
這四點使得PreparedStatement成為訪問資料庫的語句物件的首選,缺點是靈活性不夠好,有些場合還是必須使用Statement。

  • sql注入原理

下面我們來說一下sql注入原理,以使讀者對sql注入攻擊有一個感性的認識,至於其他攻擊,原理是一致的。

SQL注射能使攻擊者繞過認證機制,完全控制遠端伺服器上的資料庫。 SQL是結構化查詢語言的簡稱,它是訪問資料庫的事實標準。目前,大多數Web應用都使用SQL資料庫來存放應用程式的資料。幾乎所有的Web應用在後臺 都使用某種SQL資料庫。跟大多數語言一樣,SQL語法允許資料庫命令和使用者資料混雜在一起的。如果開發人員不細心的話,使用者資料就有可能被解釋成命令, 這樣的話,遠端使用者就不僅能向Web應用輸入資料,而且還可以在資料庫上執行任意命令了。

SQL注入式攻擊的主要形式有兩種。一是直接將程式碼插入到與SQL命令串聯在一起並使得其以執行的使用者輸入變數。上面筆者舉的例子就是採用了這種方法。由於其直接與SQL語句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意程式碼注入要在表中儲存或者作為原書據儲存的字串。在儲存的字串中會連線到一個動態的SQL命令中,以執行一些惡意的SQL程式碼。注入過程的工作方式是提前終止文字字串,然後追加一個新的命令。如以直接注入式攻擊為例。就是在使用者輸入變數的時候,先用一個分號結束當前的語句。然後再插入一個惡意SQL語句即可。由於插入的命令可能在執行前追加其他字串,因此攻擊者常常用註釋標記“—”來終止注入的字串。執行時,系統會認為此後語句位註釋,故後續的文字將被忽略,不背編譯與執行。

  • XSS攻擊
    概念:XSS攻擊是指攻擊者利用網站程式對使用者輸入過濾不足的缺陷,輸入可以顯示在頁面上或者對其他使用者造成影響的HTML程式碼,從而盜取使用者資料、利用使用者身份進行某種動作或者對訪問者進行病毒侵害的一種攻擊方式。

實質:跨站指令碼攻擊本質上是一種將惡意指令碼嵌入到當前頁面中並執行的攻擊方式。通常黑客通過“HTML注入”行為篡改網頁,並插入惡意JavaScript(JS)指令碼,從而在使用者瀏覽網頁時控制瀏覽器的行為。

產生原因:網站對使用者提交的資料過濾不嚴格,導致使用者提交的資料可以修改當前頁面或者插入一段指令碼。

XSS攻擊通常在使用者訪問目標網站時或者之後進行某項動作時觸發並執行

根據攻擊程式碼存在的地點、是否被伺服器儲存及存在的形式和效果可分三類:
反射型XSS:瀏覽器—伺服器互動
將使用者輸入的資料通過URL的形式直接或未經過完善的安全過濾就在瀏覽器中進行輸出,導致輸出的資料中存在可被瀏覽器執行的程式碼資料(黑客通常需要通過誘騙或者加密變形等方式,將惡意程式碼的連結傳送給使用者,使用者觸發後才能攻擊成功)

儲存型XSS:瀏覽器—伺服器—資料庫互動(可直接產生大範圍危害,具有較強的穩定性)
web應用程式將使用者輸入的資料資訊儲存在服務端的資料庫或者其他檔案形式中,網頁進行資料查詢展示時,會從資料庫中獲取資料內容,並將資料內容在網頁中進行輸出展示,只要使用者訪問具有XSS攻擊指令碼的網頁時,就會觸發攻擊

DOM型XSS:瀏覽器—伺服器互動(由於構造語句難度較大,比較少見)
是由JavaScript的DOM節點程式設計可以改變HTML程式碼的特性形成的XSS攻擊,需要針對具體的JavaScript DOM程式碼進行分析,從而利用

要求

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

釋出惡意訊息,顯示警報視窗:在您的Elgg配置檔案中嵌入一個JavaScript程式,以便當另一個使用者檢視您的配置檔案時,將執行JavaScript程式並顯示一個警報視窗。

彈窗顯示cookie資訊:將cookie資訊顯示。

竊取受害者的cookies:將cookie傳送給攻擊者。

成為受害者的朋友:使用js程式加受害者為朋友,無需受害者干預,使用相關的工具瞭解Elgg加好友的過程。

修改受害者的資訊:使用js程式使得受害者在訪問Alice的頁面時,資料無需干預卻被修改。

編寫XSS蠕蟲。

對抗XSS攻擊。

2.實踐過程

2.1 SQL 注入實驗
1、熟悉SQL命令
(1)首先登入 MySQL 資料庫, mysql -u root -pseedubuntu

(2)使用系統建立好的 Users 資料庫, use Users;

(3)檢視該資料庫下所有的表, show tables;

(4)可以看到該資料庫存在一個名為"credential"的表,檢視這個表的詳細資訊select * from credential;

2、對 SELECT 語句的 SQL 注入攻擊
(1)使用 SEED 訪問已經搭建好的 Web 頁面: www.SEEDLabSQLInjection.com

(2)使用快捷鍵ctrl+U檢視該頁面原始碼,使用者點選提交後,表單將使用者輸入的資訊使用get方法提交至unsafe_home.php頁面進行許可權校驗

(3)通過 vim /var/www/SQLInjection/unsafe_home.php ,找到核心的SQL語句,其中where部分存在可以進行注入攻擊的漏洞

利用註釋特性,當變數input_uname為Admin' #時,這部分變成了:WHERE name= 'Admin' #' and Password='hashed_pwd'實際上,#後面的語句都被註釋掉了,那這部分就變成:WHERE name= 'Admin',這樣的話,就可以繞過密碼校驗,直接進入Admin使用者頁面。測試輸入使用者名稱為Admin' #,密碼為空:

發現成功登入,可以看見使用者的生日、薪酬等資訊

3、對 UPDATE 語句的 SQL 注入攻擊
(1)首先利用前面的漏洞,用Alice' #登入,可以看到對應的資訊

(2)然後點選頁面上方的Edit Profile進入更新資訊頁面

(3)在unsafe_edit_backend.php中找到 SQL 語句,vim /var/www/SQLInjection/unsafe_edit_backend.php,發現不能對個人工資進行更新修改,同時由上文可以知道 Alice 的編號是 10000,變數$input_nickname對應的就是使用者輸入的 NickName

首先我們的任務是修改Alice的工資。 在NickName那裡輸入語句 ', salary='500000' where EID='10000';# 這樣#後面的就會被註釋,所以就直接執行set salary='500000' where EID = '10000' 這個指令,所以直接修改了工資。這個時候回去看自己的profile應該能看到是已經修改成功的,證明我們的攻擊成功。

下面的任務是修改其他人的工資。那麼我們只要在Alice修改的介面的nickname輸入', salary='1' where name='Boby';#

再進入Boby的介面,我們發現工資已經成功修改。這個原理和上面相同

  1. SQL對抗,修復上述SQL注入攻擊漏洞

SQL注入漏洞的本質原因是由於執行語句和資料放在一起導致的,使用預處理語句機制可以很好的防止這一攻擊出現。

首先在unsafe_home.php頁面中,對SELECT語句進行預處理

原來的語句:

$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password

FROM credential

WHERE name= 'inputuname′andPassword=′hashed_pwd'";

使用繫結引數的方法,修改為

sql=conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?");

sql−>bindparam("ss",input_uname, $hashed_pwd);

然後在unsafe_edit_backend.php頁面中,對UPDATE語句進行預處理。

原來的語句:

sql="UPDATEcredentialSETnickname=′input_nickname',email='inputemail′,address=′input_address',PhoneNumber='inputphonenumber′whereID=id;";

修改為

sql=conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");

sql−>bindparam("ssss",input_nickname, inputemail,input_address, $input_phonenumber);

2.2跨站指令碼攻擊實驗

1.釋出惡意訊息
首先利用alice的賬戶alice和密碼seedalice登入Elgg

點選Edit profile,接著在下面的Brief description文字框輸入以下語句:,點選Save儲存,頁面彈出如下的提示框,點選Save儲存

進入Boby賬戶登入之後,我們檢視Alice的profile,確實彈出了XSS彈窗。可見我們攻擊成功。主要原因是因為沒有對欄位進行安全檢查和過濾,便直接插入資料表。顯示內容的時候,也是直接讀取顯示,沒有經過輸出過濾。

2.彈窗顯示cookie資訊
將插入的js程式碼改成即可,然後用Boby檢視Alice的profile

從Boby的頁面彈進入Alice的頁面時彈出提示框,並且顯示當前的 cookie 資訊

3.竊取受害者的cookies
可以通過使惡意的JavaScript插入一個標籤,其src屬性設定為攻擊者的機器來實現。當JavaScript插入img標籤時,瀏覽器嘗試從src欄位中的URL載入圖片,這導致HTTP GET請求傳送到攻擊者的機器。下面我們使用JavaScript將cookies傳送到攻擊者機器的5555埠,若攻擊者的TCP server偵聽同一個埠,伺服器則可打印出任何收到的內容。

使用命令,所以這裡使用的是本地作為攻擊者的伺服器。

然後使用nc進行監聽5555埠,使用指令nc -l 5555 -v,-l指定埠,-v顯示詳細資訊。使用boby的賬戶登入並且檢視Alice的賬戶profile就能夠得到boby的cookie資訊。

4.成為受害者的朋友
(1)登入使用者為 Alice,然後訪問使用者 Boby 的主頁:http://www.xsslabelgg.com/profile/boby,使用快捷鍵ctrl+shift+E開啟火狐瀏覽器開發者模式中的 Network 頁面,然後點選左側的Add friend,新增 Boby 為好友

2)可以看到此時瀏覽器傳送的 POST 請求的地址http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1652731529&__elgg_token=3R--Qcrz_7uJaAQ2DswcSQ
3)可以構造下面的指令碼,用於新增其他好友

(4)將指令碼放在 Alice 的About me文字框

(5)登入 Boby 訪問 Alice 主頁:http://www.xsslabelgg.com/profile/alice,返回 Boby 主頁,看到已經成功新增 Alice 為好友

5.修改受害者的資訊
首先看看修改資料時要做那些事情。同樣的,我們可以看到使用者在修改自己的profile時傳送的http請求的具體格式。在進入Edit profile頁面後,點選Save後,可以看到具體的 Network 請求資訊

下面這段程式就是構造的js程式了,主題部分在於構造那個content,其中的幾個欄位都是profile中的內容,需要修改什麼直接修改就好。同時需要指定sendurl。這些內容都是從HTTP Header中得到的,然後ajax執行。

將上述程式碼同樣放在Alice的about me中,然後用boby訪問Alice的profile,即可成功修改boby的profile。

6.編寫XSS蠕蟲
首先編寫程式碼,目的就是這段程式碼能夠複製到其他使用者那裡,那麼蠕蟲目標就是完成了的,所以使用DOM來檢視和使用HTML程式碼,innerHTML方法是開始和結束標籤之間的HTML。。我們將下面的程式放在Alice的about me中。

我們通過boby訪問Alice的profile發現這段程式碼已經被成功的複製,說明我們的目標達到,利用DOM API成功的進行了蠕蟲的複製。

7.對抗XSS攻擊
Elgg本身已經提供對抗XSS攻擊的外掛,我們利用管理員賬戶進行登入,找到Account->administration->plugins,並且找到外掛HTMLawed ,這個外掛的主要作用是對使用者的輸入輸出進行校驗並且去除特定標籤。

下面我們檢視Alice的profile,看看有沒有效果了。可以看到,這個時候XSS攻擊已經沒有效果了,Alice中的程式碼被當作about me顯示出來了。

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

  • 問題1:XXXXXX
  • 問題1解決方案:XXXXXX
  • 問題2:XXXXXX
  • 問題2解決方案:XXXXXX - ...

4.實踐總結

xxx xxx