實驗原理:跨站腳本攻擊( 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,進入題目
思路:首先看到有注入點,輸入指令:<code><script>alert(document.cookie)</script></code>,進行測試,點選送出,下圖所示:
送出後頁面輸出位子原樣輸出說明我們寫的<code><script>alert(document.cookie)</script></code>,語句未被浏覽器所執行,此時我們點選滑鼠右鍵檢視網頁源代碼,如下圖所示:
觀察網頁源代碼我們剛剛寫入的<code><script>alert(document.cookie)</script></code>,觀察被當成文字執行了,是以網頁會原樣輸出,此時我們首先要閉合前面的input語句,輸入<code>"><script>alert(document.cookie)</script></code>,"> 的作用是提前閉合input語句,然後再執行我們寫的script語句,如下圖所示:
輸出<code>"><script>alert(document.cookie)</script></code>,點選送出,如下圖所示:
此時我們成功得到了這題的flag了!将flag複制到HackBar裡面進行編碼,如下圖所示:<code>flag{el_Sh6nvMF7jIAbn}</code>
2.選擇XSS-存儲型XSS,進入題目
思路:此時我們同樣輸入<code><script>alert(document.cookie)</script></code>,或者還可以輸入<code><img src=x onerror=alert(document.cookie)></code>,這兩句語句都可以進行測試,發現語句都可以被執行了,如下圖所示:
此時我們成功得到了這題的flag了!将flag複制到HackBar裡面進行編碼,如下圖所示:<code>flag=flag{el_hJPwFl0fT1GJV}</code>
3.選擇XSS-DOM型XSS,進入題目
思路:這題有彩蛋直接F12進入開發者模式,檢視Application的Cookies發現flag就在裡面藏着在,如下圖所示:<code>flag{el_Y7yMJE7BcfhBk}</code>
實驗原理:檔案上傳是網際網路應用中的一個常用功能,例如上傳一張圖檔;上傳一段視訊;論壇發帖附帶附件等等。
上傳檔案時,如果服務端沒有對代碼進行嚴格的驗證以及過濾,就容易造成允許上傳任意檔案的情況,“檔案上傳”本身沒有問題,但是問題在于檔案上傳後,伺服器怎麼處理、解釋此檔案。若上傳檔案是web腳本語言,伺服器的web容器會解釋并執行使用者上傳的腳本,導緻代碼的執行,惡意的腳本檔案會控制整個網站,甚至控制伺服器。若上傳的是病毒,木馬檔案,黑客用以誘騙使用者或者管理者下載下傳執行。上傳檔案是釣魚圖檔或為包含了腳本的圖檔,在某些版本的浏覽器中會被作為腳本執行,被用于釣魚和欺詐。
大多數情況下,檔案上傳漏洞一般都是指“上傳 Web腳本能夠被伺服器解析”的問題,也就是通常所說的 webshell的問題。要完成這個攻擊,要滿足如下幾個條件。
首先,上傳的檔案能夠被Web容器解釋執行。是以檔案上傳後所在的目錄要是 web容器所覆寫到對的路徑。
其次,使用者能夠從web上通路這個檔案。如果檔案上傳了,但使用者無法通過web通路,或者無法使得web容器解釋這個腳本,那麼也不能稱之為漏洞。
最後,使用者上傳的檔案若被安全檢查、格式化、圖檔壓縮等功能改變了内容,則也可能導緻攻擊不成功。
1.選擇檔案上傳-JS繞過,進入題目
進入題目,觀察網頁有一個上傳檔案的地方,如下圖所示:
思路:我們先建立記事本構造一個一句話木馬語句:<code><?php @eval($_POST['zsz']);?></code>,如下圖所示:
儲存到本地主機後,修改字尾名為.php檔案,然後進行網頁上傳我們剛剛建立的muma.php一句話木馬,上傳的時候發現被前端攔截了,如下圖所示:
此時我們按F12打開浏覽器開發者模式,将javaScript功能關閉,如下圖所示:
接下來我們再次進行上傳muma.php檔案,如下圖所示:
此時發現已經可以上傳了,點選submit按鈕上傳,如下圖所示:
上傳成功了,我們擷取到了剛剛我們上傳的muma.php的路徑,接下來我們使用中國蟻劍進行裡連結,如下圖所示:
資料添加成功後,輕按兩下添加的資料入侵到伺服器中,如下圖所示:
此時我們已經成功入侵到了目标伺服器了,接下來我們需要找到flag的藏身之處,經過查找發現flag了,如下圖所示:
最後flag成功拿下,如下圖所示:<code>flag{el_sSsJUsCznNJ8o}</code>
2.選擇檔案上傳-檔案類型繞過1,進入題目
思路:首先測試muma.php檔案是否可以正常上傳,發現被攔截不允許上傳該格式的檔案,如下圖所示:
此時我們使用另外一種Burp Suite professional 工具,設定浏覽器代理模式,用Burp Suite professional進行抓包重構發送的資料包,如下圖所示:
接下來右鍵滑鼠發送到Repeater子產品,将資料包中Content-Type:修改為 image/jpeg進行繞過,如下如所示:
進入終端後,輸入指令:cat ../../../../flag,可以檢視flag,如下圖所示:<code>flag{el_4vUiULbIISkA0}</code>
3.選擇檔案上傳-檔案類型繞過,進入題目
思路:進入題目後發現有一個上傳點,首先先上傳muma.php測試一下,如下圖所示:
點選上傳發現提示不允許上傳.asp,.aspx,.php,.jsp字尾檔案!,如下圖所示:
此時我們使用Burp Suite professional 工具,設定浏覽器代理模式,用Burp Suite professional進行抓包重構發送的資料包,如下圖所示:
上傳成功了,我們擷取到了剛剛我們上傳的muma.phtml的路徑,接下來我們使用中國蟻劍進行裡連結,如下圖所示:
右鍵在此打開終端,如下圖所示:
進入終端後,輸入指令:cat ../../../../flag,可以檢視flag,此題因為題目配置問題伺服器中無flag,如下圖所示:答案:<code>flag{el_zAI4gHiRONOcy}</code>
4.選擇檔案上傳-檔案字尾繞過,進入題目
上傳檔案後頁面傳回不允許的字尾名,如下圖所示:
接下來右鍵滑鼠發送到Repeater子產品,将資料包中檔案字尾進行修改為 muma.php.phtml進行繞過,如下如所示:
上傳成功了,我們擷取到了剛剛我們上傳的muma.php.phtml的路徑,接下來我們使用中國蟻劍進行裡連結,如下圖所示:
右鍵進入終端,輸入指令:cat ../../../../flag,可以檢視flag,如下圖所示:<code>flag{el_H5MGyqiz31Xey}</code>
5.選擇檔案上傳-競争條件,進入題目
思路:首先測試muma.php檔案是否可以正常上傳,發現上傳過程很慢,并且顯示上傳成功且有路徑,如下圖所示:
接下來通過中國蟻劍連接配接,發現連接配接不上,說明伺服器将我們剛剛上傳的檔案已經删除了,如下圖所示:
此時我們通過條件競争原理進行滲透,我們使用Burp Suite professional 工具,設定浏覽器代理模式,用Burp Suite professional進行抓包進行重播攻擊,同時使用浏覽器通路剛剛的路徑産生條件競争再次使用Burp Suite professional進行抓包進行重播攻擊,如下圖所示:
首先設定上傳包将檔案内容修改為:
同時我們設定通路包,如下圖所示:
最後先發送上傳包的同時立刻發送請求包,就可以實作條件競争,進而擷取flag,如下圖所示:<code>flag{el_PnaSoaWmWuFiS}</code>
實驗原理:注入攻擊是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)首先判斷是否存在注入點:
指令:<code>sqlmap -u http://127.0.0.1:22171/?id=1</code>
(2)确認存在注入點之後,使用--dbs指令枚舉目前使用者下的所有資料庫,如目前使用者有權限讀取所有資料庫清單資訊的表,使用該指令就可以列出所有資料庫,如下圖所示:
指令:<code>sqlmap -u http://127.0.0.1:22171/?id=1 --dbs</code>
(3)使用--current-db擷取目前web應用所連接配接的資料庫,從圖中可以得知目前Web應用連接配接的資料庫為test,如下圖所示:
指令:<code>sqlmap -u http://127.0.0.1:22171/?id=1 --current-db</code>
(4)得知資料庫為test之後,繼續進行注入,使用-D參數和--tables參數查詢資料庫test中給所有表名,-D參數用來指定某一個具體的資料庫,指令如下,結果如圖13-3-11所示,從圖中可以得知 test 資料庫中有三個表名。(如果不使用-D參數指定某個具體的資料庫,那麼就會列出資料庫中所有的表),如下圖所示:
(5)得知表名之後繼續注入使用-D參數、-T參數和--columns擷取指定資料庫中指定表中的字段名,-D參數用于指定一個具體資料庫,-T參數用于指定一個具體的表,如下圖所示:
指令:<code>sqlmap -u http://127.0.0.1:22171/?id=1 -D test –T flag --columns</code>
(6) 得知字段名之後繼續注入使用-D參數、-T參數、-C參數和--dump擷取指定字段中的具體資料,-D參數用于指定一個具體資料庫,-T參數用于指定一個具體的表,-C參數用于指定具體的字段,指令如下。(如果不使用-c參數指定字段,那麼就會列出資料庫中所有的字段值),如下圖所示:
指令:<code>sqlmap -u http://127.0.0.1:22171/?id=1 -D test –T flag -C flag --dump</code>
此時我們就成功得到了flag:<code>flag{el_MqZG5mRXXiSYg}</code>
接下來:
boolean注入(<code>flag{el_AUSuaYQLcxXkT}</code>);
時間注入(<code>flag{el_O5QWWhz9QmNHb}</code>);
堆疊注入(<code>flag{el_ofFOxDdOfsaaK}</code>);
cookie注入(<code>flag{el_dmycZJRSWN77g}</code>);
bash64注入(<code>flag{el_uItls8C02hDPV}</code>);
操作步驟一樣,此處因為個人時間原因就不一一操作了。
2.選擇sql注入-二次注入,進入題目
思路:打開注冊頁面,在源URL後添加 <code>' union select 1,2,(select flag from test.flag) --+</code>,擷取新的注冊id:54,如下圖所示:
然後将擷取的新id:54,到擷取資料頁面修改id=54,如下圖所示:
此時我們就成功擷取到了二次注入的flag了,<code>flag{Qye43YcL1H7ex}</code>