XSS(跨站脚本攻击)全称Cross Site Scripting,为了和层叠样式表(css)区分,故用XSS的缩写代替。XSS是目前较为普遍的Web安全漏洞,这类漏洞能够使得攻击者嵌入恶意的脚本代码到正常用户会访问到的页面中,当正常用户访问该页面的时候,则可以导致嵌入的恶意脚本代码执行,从而达到恶意攻击用户(劫持用户会话,插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器、繁殖XSS蠕虫等等)的目的。
XSS漏洞原理,就是利用HTML中特定的字符。,当在页面中输入含有比如<>这样的特殊字符时,客户端的浏览器就会误认为是插入了HTML的标签,当这些标签引入一段JavaScript脚本时,负责前端的浏览器就会编译执行该脚本。所以,当特殊字符不能被动态页面检查或者检查出现失败的时候,即会产生XSS漏洞。
从攻击代码的工作方式,主要分为以下三种类型:
(1)持久性跨站
:也叫存储型跨站
,攻击代码储存于服务器端,这种攻击具有较强的稳定性和持久性,比较常见于博客,论坛等社交网站。
(2)非持久型跨站
:反射性跨站脚本漏洞,用户访问服务器-跨站链接-返回跨站代码的形式
(3)DOM跨站
(document object model):基于文档对象模型Document Objeet Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。
下面是在DVWA的low安全环境下对漏洞进行测试:
持久型跨站(XSS Stored)
打开正是博客和论坛等地常见的页面,我们可以通过前端的代码对输入框进行攻击代码的存储,等用户再次登陆系统的时候,在服务器中存储的代码经过浏览器解析后执行相关的功能。
从HTML中的代码得知,Name框最多只能输入十个字符,但是我们可以修改最大字符长度来满足我们添加攻击代码的目的。在修改长度后,加入这串<script>alert("xss")</script>
代码,这里只是用做一个参考,真实环境下我们可以构造别的代码来达到我们的目的。
写入留言板后,发现输入的内容都消失不见了?这是因为前端把我们的输入变成了代码执行,再次进入页面,就执行了弹框的效果,如上图,说明我们的有效载荷已经存储到数据库当中,只要是访问了该页面的用户都会触发XSS攻击。
非持久型跨站(XSS Reflected)
这次换成了一个欢迎界面,通过输入我们得知,当用户在输入自己的名字之后,html会将输入的数据返回并显示到页面上。既然是前端在控制整个输出名字的过程,那么我们应该就可以通过一些攻击代码来测试是否存在反射型XSS漏洞。
依旧是使用弹窗函数进行测试,当页面返回用户输入的内容前,攻击代码先被浏览器编译,弹窗成功出现在页面上,说明该处存在XSS漏洞。
DOM跨站(XSS DOM)
点击是一个选择语言的界面,发现当我们选择一个语言时,URL框就会传递相应的数据,我们可以构造攻击语句,将攻击代码写入URL栏。
1 | http://127.0.0.1/DVWA/vulnerabilities/xss_d/?default=English<script>alert(/xss/);</script> |
还是熟悉的弹窗,这里存在XSS漏洞是因为浏览器接受到的值由前端进行处理时,没有进行过滤,那么攻击代码就成功混入html代码中,发挥其作用。DOM型跨站也有一定的前提,就是必须存在一个比如,document.referer、window.name、location、innerHTML、documen.write等等的属性,才能对前端的传参加以利用。
这里只介绍了XSS的原理和用法,之后会介绍如何通过构造有效载荷来偷取网站下用户的cookie或对用户进行一些操作。