同源策略
同源策略是一种安全思想,但并不是统一的规范体系。不同语言脚本以及插件,它们的同源策略规则也不尽相同,不可一概而论。
javaScript中的同源,需要对比 两者中的协议、域名、端口。三者完全相同才认为是同源的,否则即是来自不同源的内容。
![](https://img-blog.csdnimg.cn/img_convert/bbeecd70ee873a62f3199067d00cb6d2.png)
什么是XSS?
跨站脚本攻击(Cross Site Scripting)的缩写,为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
跨站 ===> 从字面来分析,因为这个“跨”实际上是浏览器的特性,而不是缺陷,造成“跨”这样的假象是因为绝大多数XSS攻击都会采用嵌入一段远程或者第三方域上的脚本资源。
脚本===>跨站脚本重点已经不在“跨站”这个字母上,而是“脚本”。脚本主要是有两个:JavaScript和ActionScript。
XSS原理
用户提交的数据没有过滤,或者过滤不严格,直接输出到网页中,导致可以构造执行JS代码,或者修改网页内容。
反射型XSS
XSS代码出现在URL参数或者请求中,浏览器发出请求时,参数值作为输入提交到服务器,服务器接受这个参数并处理后,参数值出现在响应的HTML中,最后浏览器解析执行了这段XSS代码。
payload往往会出现在url地址或者请求中
必须经过服务器的处理
Payload会在response响应包中可以查询得到.
存储型XSS
对应的需要将payload写入到对应的数据库中
Payload只有第一次写入数据库时需要携带,后面只需要访问特定的页面即可
同样需要服务器的处理并且将内容通过响应包进行返回.
Dom型XSS
对象模型(Document Object Model),即DOM。
DOM XSS的代码不需要服务器解析响应的直接参与,触发XSS漏洞靠的是浏览器DOM解析器的解析,和服务器没有直接关系,可以完全认为是客户端的事情。
第二个,往往查看源码无法找到我们拼凑进去的标签
存储型XSS和反射型XSS的区别
存储型-->持久型XSS
反射型-->非持久型XSS
存储型XSS会将攻击脚本永久的存放在目标服务器的数据库中
存储型XSS和反射型XSS和DOM型XSS有什么区别?
存储型XSS的payload写入到对应的数据库,服务器从数据库中读取对应的payload,然后返回给对应的响应包
Dom型XSS无需服务器的参与,触发XSS漏洞靠浏览器dom解析器,导致源代码无法查询到插入的payload
反射型XSS的payload往往会出现在URL请求或者是GET请求包中,而存储型XSS只有第一次写入数据库的时候才需要携带payload,后续访问不需要.
存储型XSS与数据库进行交互,反射型不需要与数据库进行交互.
函数htmlspecialchars
常见的过滤XSS手法
将特殊字符转换成html实体
![](https://img-blog.csdnimg.cn/img_convert/f0eb1a0bf05d792eef3e5faa2813286b.png)
![](https://img-blog.csdnimg.cn/img_convert/a4f407997fb2a16da41e8411dc1f2968.png)
实体编码&字符编码
Htmlspecialchars à HTML实体编码 浏览器不会解析,只会打印出来
浏览器会自动渲染HTML字符编码
字符编码能够在value值内使用
![](https://img-blog.csdnimg.cn/img_convert/15065af352c2d42c1d51c474d865c395.png)
结构不会自动解码,只是在value值编码解码
字符编码能够在value值内使用
Burp suite 这里的HTML就是HTML字符编码
![](https://img-blog.csdnimg.cn/img_convert/f84077310c033a0e1e26b88f5298ede2.png)
HTML字符编码支持添0操作
可以通过此操作绕过WAF
10进制
16进制
![](https://img-blog.csdnimg.cn/img_convert/7320677d24fde1c43368e65138fa3c4c.png)
Jsunicode编码
在事件下,才能使用jsunicode编码
![](https://img-blog.csdnimg.cn/img_convert/345a6bfe7c25146a5f95838f006d1275.png)
在js中,单引号,双引号和圆括号和重音号等属于控制字符,编码后将无法识别。
格式:
![](https://img-blog.csdnimg.cn/img_convert/8f0083c0ceb7f54c7bcec78d8a4c9d8f.png)
![](https://img-blog.csdnimg.cn/img_convert/1fbd722b02092ae75393b940b2a4bb5d.png)


换行的意思//可以通过这个进行绕过一些对单词的过滤
: 冒号
可以通过这个绕过正则对于:的限制
通过结合字符编码及js编码可以绕过很多检测
![](https://img-blog.csdnimg.cn/img_convert/85fb63c64c0225a9d3bbcb42242a5ade.png)
如果源码存在innerHTML或document.write
可以使用8/16进制进行绕过
<img src=x οnerrοr=alert`1`>
\x3Cimg src=x οnerrοr=alert`1`\x3E
<textarea> </textarea>
<title></title>
<style><style>
<script></script>
<iframe></iframe>
<noscript></noscript>
<pre></pre>
<xmp></xmp>
如果遇见以上这种
在<>之间的参数,是不会被解析 <>
所以payload要先闭合文本域再写
</textarea><img src=x οnerrοr=alert`1`>
`$input`
![](https://img-blog.csdnimg.cn/img_convert/aea53bda7637e01c969067a8d664d095.png)
![](https://img-blog.csdnimg.cn/img_convert/b66e1cb34357e20813551e6190123f5b.png)
文件上传注入-文件名
文件上传后,有回显点,会显示上传的名字时,就可以使用XSS
使用burp suite 将文件名更改为XSS payload
![](https://img-blog.csdnimg.cn/img_convert/2cbda6b9426106f20c8c2efcffb1a1db.png)
代码执行函数
![](https://img-blog.csdnimg.cn/img_convert/a7c6938fbb74c68b668422e8838c31c6.png)
![](https://img-blog.csdnimg.cn/img_convert/89725bc687afab21d9112402b4691d38.png)
禁用了alert
![](https://img-blog.csdnimg.cn/img_convert/b49b6aa144d4533e1d1a9e997797b869.png)
XSS如何挖掘漏洞?
看URL参数的输出位置
看输入框的输出位置
一般我们在判断是否存在xss的时候,会首先输入类似于下面的字符串:123456<>”’ 然后右键查看源代码,看我们输入的特殊字符串是否在页面中显示,如果没显示,则可能存在dom型xss,也有可能不存在xss.如果存在,重点看我们输入的特殊的字符是否被转义,如果没被转义,基本上可以判断存在xss,剩下的只是如何构造的问题.如果被转义了,则需要首先看是所有的都被转义了,还是部分,如果是部分,则考虑当前位置能否使用未转义的符号进行拼接.
判断输出点位置
输出点在尖括号外
<div>输出点</div> <script></script>
需要可以构造标签,如果不能构造标签就不存在XSS漏洞(除了script标签之外)。
输出点在尖括号内
如果输出在"双引号或者'单引号内部,需要能够闭合引号,如果不能闭合引号,就需要看能否在当前的标签属性中执行js代码,如果不能,就不存在XSS漏洞。
如果可以闭合引号,可以构造一个新的属性,使用新的属性的值来执行JS代码,比如事件属性。或者闭合尖括号,构造的新的标签也可以
输出点在script标签中
1、 如果输出在"双引号或者'单引号内部,需要能够闭合引号,如果可以闭合引号,就可以直接传递进去js代码,使用注释符号(//),注释掉后面的js代码就可以构造XSS
2、 如果不能闭合引号,需要看当前变量能不能innerHTML或者document.write,插入到网页中,如果可以就可以构造XSS,如果没有,就不存在XSS
防御XSS攻击
构建白名单
在构造白名单的过程中需要保证在不影响用户体验的同时,尽可能杜绝一切不必要的输入内容。
2.在cookie中加入httponly属性可以在一定程度上保护用户的cookie,减少出现XSS时损失
![](https://img-blog.csdnimg.cn/img_convert/bf8177e50a84b73215d6b9f8e838793d.png)
![](https://img-blog.csdnimg.cn/img_convert/02bf37cb0d9fa315d3bb141df1810f9d.png)