XSS漏洞
跨站脚本是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。他允许恶意用户将代码注入网页,其他用户在浏览网页时就会受到影响。恶意用户利用XSS漏洞攻击成功后,可以得到被攻击者的Cookie等信息。
XSS漏洞可以分为三种类型:反射型、存储型和DOM型。
XSS漏洞类型
- 反射型XSS漏洞
- 反射型XSS漏洞又称非持久型XSS漏洞,这种攻击方式是一次性的。
- 攻击方式:攻击者通过发送电子邮件等方式将包含XSS代码恶意链接发送给目标用户。当目标用户访问该链接时,服务器会接受该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析了这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。
- 存储型XSS漏洞
- 存储型XSS漏洞又称持久性XSS漏洞,其攻击脚本将被永久的存放在目标服务器的数据库或文件当中,具有很高的隐蔽性。
- 攻击方式:这种攻击多见于论坛、博客、留言板,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入帖子的内容中。然后存入后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。
- DOM型XSS漏洞
- DOM使用DOM语句动态访问和更新文档的内容、结构及样式。
- DOM型XSS漏洞其实是一种特殊类型的反射型XSS漏洞,它是基于DOM文档对象模型的一种漏洞。
- 攻击方式:用户请求一个经过专门设计的URL,他由攻击者提交,而且其中包含XSS代码。服务器的响应不会以任何形式包含攻击者的脚本。当用户的浏览器处理这个响应时,DOM就会处理XSS代码,导致存在XSS漏洞。
XSS Payload
Payload指攻击者植入的恶意代码,XSS Payload是一段JavaScript 代码,通过读取浏览器的Cookie对象而发起的“Cookie劫持”攻击的。Web应用通常用Cookie来作为用户的身份凭证,如果一个用户的Cookie被攻击者获取,意味着攻击者获取了该用户的身份,即攻击者无需使用账号和密码,直接通过Cookie就可以登陆用户的账户。
XSS 蠕虫
XSS蠕虫是一种利用跨站脚本漏洞的恶意程序,目的是通过感染网站的访客,将自身传播到其他受感染的页面。XSS蠕虫与传统的XSS攻击相似,但其具有自我传播的能力,可以通过感染网页中的用户,快速传播到其他页面。
XSS蠕虫的工作原理如下:
感染阶段:XSS蠕虫会利用存在XSS漏洞的网站上的恶意脚本,将自身注入到受感染的页面中。这通常是通过向用户展示恶意的用户输入字段或者从用户输入中注入恶意脚本来实现的。
传播阶段:一旦XSS蠕虫成功感染了网站上的某个页面,它就会开始尝试传播到其他页面。这通常通过利用网站的用户交互功能来实现,比如评论系统、留言板、搜索框等。当其他用户访问受感染的页面时,蠕虫会通过执行恶意脚本的方式感染这些用户,从而传播到其他页面。
扩散阶段:随着蠕虫不断传播和感染更多的页面,它的影响范围会逐渐扩大。蠕虫可能会利用各种技术手段和漏洞,如点击劫持、社会工程学、钓鱼等,来诱使用户点击恶意链接,从而进一步传播蠕虫。
XSS攻击技巧
在实际环境中,并不是所有场景下都可以直接嵌入<script>标签,XSS漏洞的利用技巧比较复杂。
基本变形
部分Web应用的服务端程序可能做了一部分的安全过滤工作,或者使用了安全产品,但是很多场景中不够完善,因此对XSS payload 进行简单的变形就可能绕过防御机制。
- 更改字母大小写
- 如果只是判断有没有<script>特征,则可以填充空白字符(空格、制表符、换行)
- 有的安全过滤只是将<script>删掉,因此可以将<script>内嵌在<script>中,如<scr<script>ipt>
事件处理程序
很多HTML节点都可以绑定事件处理程序,比如<img>标签,指定一个错误或者不存在的scr属性,载入图像失败时就会触发error事件。
因此构造不同的HTML标签并尝试使用不同的事件处理程序,可以绕过一些过滤不严格的安全防御机制。
JavaScript伪协议
浏览器可以接受内联的JavaScript 代码作为URL,所以在需要指定URL的标签属性中,可以尝试构造一个JavaScript伪协议的URL来执行JavaScript代码。
一些安全功能会过滤掉JavaScript伪协议,不过可以尝试在关键词中插入空白字符绕过检测。
当Web应用只校验URL的host时,未能校验协议,在这种场景中,也可以绕过校验实现XSS攻击。
编码绕过
网页不同位置支持不同的编码方式,如在HTML标签的属性中可以使用HTML实现编码的字符。浏览器也可以兼容不标准的编码方式,如缺少分好的数字实体编码。
如果把Payload放在HTML标签中,还可以将Unicode编码和HTML实体编码叠加使用。
绕过长度限制
使用<base>标签