首先介绍一下JavaScript中的同源策略:
JavaScript中将
协议,域名,端口,三者完全相同的网页视为同源。
在HTML语音中,有部分标签在引用第三方资源时,不受同源限制
<script>
<img>
<iframe>
<Link>
除此之外还有好多
上述这种带SRC属性的标签,在加载时,实际上是生成一条get请求,向指定服务器申请资源
确定脚本的源,取决于加载脚本的位置,而非脚本存在的位置
XSS漏洞原理:
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览页面时,嵌入其中的Script代码会被执行,从而达到恶意攻击用户的目的
XSS漏洞是发生在
目标网站中目标用户的浏览器层面上,当用户浏览器渲染整个HTML文档的过程中,出现了不被预期的脚本指令被执行,XSS就会发生
常见的XSS漏洞分为3类,
一、反射型XSS
![](https://i-blog.csdnimg.cn/blog_migrate/2f5397beb3035b76970dfaad6b5927b8.png)
二、存储型XSS
![](https://i-blog.csdnimg.cn/blog_migrate/f0ebe55addf53fad28b7090f65345c0b.png)
三、DOM型XSS
![](https://i-blog.csdnimg.cn/blog_migrate/e6e54127d57a88ccf67c4d65293e11ba.png)
简而言之就是将我们输入的变量A 赋值给变量B,然后将变量B插入到html其他标签中
四、常见的XSS过滤
1.htmlspecialchars()函数
能将单引号'',双引号"",斜杠/,反斜杠\ 转义,也就是在这些符号前加上退意符\。
但该函数默认编码双引号,正反斜杠(/,\)
如果想要编码单引号,则需要加上一个参数
2.strip_tags函数
将尖括号编码
3.addslashes
将单双引号转移 就是在 '前加个\
4.addslashes()函数
将预定义字符 ' " \ NULL
函数会在这四个字符前加上 \
5.我在渗透测试过程中见到的基本上都是将关键符号如 <>"" '' ()等等
这些符号进行实体编码
或者直接将这些符号过滤掉
再或者将关键字alert script src img等等过滤掉
有些时候会通过前端JS校验,限制输入字符串长度,是你无法构建完整的XSS语句
不过你在页面中查看元素,找到对应代码,修改其中的限制即可
或者先输入一个合法的字符串,接着使用brupsuit抓包更改
查看元素与查看源码的区别
查看元素时,页面的代码是被渲染过的(规范书写后的)
不管程序员在书写属性的时候用的是单引号还是双引号,页面渲染后统一使用双引号
对于编码后的值,如果你不点编辑查看的话,它都是未编码的值
五、一些常见的XSS语句
<img/src=1 οnerrοr=alert`1`>
<img src=1 οnerrοr=alert`1`>
<script>alert`1`</script>
<script>alert(\1\)</script>
javascript:alert(1)
οnmοuseοver=alert(1) // (//的目的是注释掉后面的引号,记得在输入//前空格)
该事件的意思是当鼠标划过这里时,会出现弹窗。
需要注意的是 //是javascript里的注释符,html的注释符是<!-- -->(按道理来说//在html标签里是用不了的)
但onmouseover是javascript事件,它后面就是javascript环境,所以//可以解析
如果输出点在引号内
并且引号被编码或者过滤了
例子:
<script>
var aaa="xxxx";
</script>
我们可以使用如下方法
<script>
var aaa="xxxx</script><script>alert(1) //"
</script>
在JavaScript中 -号表示连接符
当遇到 value='' 输出在script标签之间
'-alert(1)-'
即:value=''-alert(1)-''