一张图带你详解XSS
(话不多说上图)
一、什么是 XSS
XSS全称(Cross Site Scripting)跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的危险代码,当用户使用浏览器浏览网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。
(是不是有人就会有疑问了,缩写不应该是CSS吗?因为CSS(层叠样式表)是一种用来表现文件样式的计算机语言,所以这里在安全领域我们就叫XSS)
从上面中的一段话,可以得知,XSS属于客户端攻击,受害者最终是用户,但特别要注意的是网站管理人员也属于用户之一。这就意味着XSS可以进行“服务端”攻击,因为管理员要比普通用户的权限大得多,一般管理员都可以对网站进行文件管理,数据管理等操作,而攻击者一般也是靠管理员身份作为“跳板”进行实施攻击。
XSS换句话说,JavaScript能做到什么效果,XSS的胃口就有多大
攻击原理:用户和浏览器建立连接状态,攻击者在这个网站找了一个xss漏洞,然后把漏洞发给了发户,用户点击连接触发了攻击者的js攻击代码,就会拿到想要的信息或者权限,完成攻击。
二、XSS漏洞为什么会出现
程序对输入和输出的控制不够严格,导致"精心构造“的脚本输入后,在输到前端时被浏览器当作有效代码解析 执行从而产生危害。
(有输入或输出的地方我们都可以 构造xss代码产生漏洞)
三、XSS的危害
1、首先对于那些半年没有更新的小企业网站来说,发生XSS漏洞几乎没有什么用。一般在各类的社交平台,邮件系统,开源流行的Web应用,BBS,微博等场景中,造成的杀伤力却十分强大。
2、劫持用户cookie是最常见的跨站攻击形式,通过在网页中写入并执行脚本执行文件(多数情况下是JavaScript脚本代码),劫持用户浏览器,将用户当前使用的sessionID信息发送至攻击者控制的网站或服务器中。
3、“框架钓鱼”。利用JS脚本的基本功能之一:操作网页中的DOM树结构和内容,在网页中通过JS脚本,生成虚假的页面,欺骗用户执行操作,而用户所有的输入内容都会被发送到攻击者的服务器上。
4、挂马(水坑攻击)
5、有局限性的键盘记录
四、 XSS分类
1、反射型XSS或不持久型XSS(中危)
交互的数据一般不会被存在在数据库里面,只是简单的把用户输入的数据反射给浏览器,一次性,所见即所得。
<?php
$name = $_GET['name'];
echo "Welcome $name<br>";
?>
2、储存型XSS 或持久型 XSS(高危)
交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。
3、DOM XSS
不与后台服务器产生数据交互,通过前端的dom节点形成的XSS漏洞。
什么是DOM:DOM全称是Document Object Model,也就是文档对象模型。我们可以将DOM理解为,一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地访问和修改文档内容、结构和样式。当创建好一个页面并加载到浏览器时,DOM就悄然而生,它会把网页文档转换为一个文档对象,主要功能是处理网页内容。故可以使用 Javascript 语言来操作DOM以达到网页的目的。
DOM还是不太理解的点这里 传送.
<a href='"+str+"'>what do you see?</a>
<a href='#' onclick="alert(1111)">what do you see?</a>
<a href='#' onclick="alert(2222)">what do you see?</a>
五、XSS可能存在的地方
HTML context
Attribute Context
URL Context
Style Context
Script Context
六、XSS测试方法
1、工具扫描:APPscan、AWVS
2、手工测试:Burpsuite、firefox(hackbar)、XSSER XSSF
使用手工检测Web应用程序是否存在XSS漏洞时,最重要的是考虑那里有输入,输入的数据在什么地方输出。在进行手工检测XSS时,人毕竟不像软件那样不知疲惫,所以一定要选择有特殊意义的字符,这样可以快速测试是否存在XSS。
(1)在目标站点上找到输入点,比如查询接口,留言板等;
(2)输入一组"特殊字符+唯一识别字符",点击提交后,查看返回的源码,是否有做对应的处理;
(3)通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合);提交构造的脚本代码,看是否可以成功执行,如果成功执行则说明存在XSS漏洞;
七、XSS实战
略
八、XSS绕过
(1)对前端的限制可以尝试进行抓包重发或者修改前端的HTML。(2)防止后台对输入的内容进行正则匹配来过滤输入,对于这样的过滤可以考虑大小写混合输入的方法。
<sCRipT>alert(63252)</sCrIPt>
(3)防止后台对输入的内容进行替换,采用拼拼凑的输入方法。
<sc<script>ript>alert((63252))</scr<script>ipt>
(4)使用注释来干扰后台对输入内容的识别。
<sc<script>ript>alert((63252))</scr<script>ipt>
<sc<!--test-->ript>alert((63252))</scr<!--tshauie-->ipt>
(5)编码
思路:后台有可能会对代码中的关键字进行过滤,但我们可以尝试将关键字进行编码后在插入,浏览器对改编码进行识别时,会翻译成正常的代码。
<img src=# onerror="alert('oldboy')"/>
<img src=x onerror="alert('yangshuang')"/>
九、XSS常规防范
XSS防御的总体思路是:对输入进行过滤,对输出进行编码
过滤:根据业务需求进行过滤,比如输出点要求输入手机号,则只允许输入手机号格式的数字。
转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到JS里面的进行JS转义()
个人总结,欢迎交流