一、漏洞描述
xss跨站脚本攻击是黑客通过“html注入”篡改了网页,插入了js恶意脚本,前端渲染时进行恶意代码执行,从而控制用户浏览的一种攻击。经常出现在需要用户输入的地方,一旦对输入不进行处理,就会发生网页被篡改。
分为三类
反射型:经过后端,不经过数据库
存储型:经过后端,经过数据库
DOM型:不经过后端,是基于文档对象型的一种漏洞,dom-xss是通过url参数去控制触发的
xss靶场第八关服务器采用了替换恶意关键字的方式防御,对输入进行小写转化,可以使用实体编码绕过服务器检测,当传回浏览器时对编码进行解码,巧妙的躲开服务器的检测。
二、漏洞发现
直接来看源码,服务端get方式接受keyword参数,并且对参数进行小写转换,将script、on、src、data、href、“关键字进行替换。最后放在友情连接的a标签内
str_replace()函数:将字符串中的指定字符替换为其他字符
先熟悉一下浏览器的流程:
1.浏览器解释html
2.标签转换为dom节点,识别标签时html解释器无法识别被实体编码的内容,建立dom树才能对每个节点的内容进行识别
3.js解析器对dom树进行修改,如果浏览器遇到url的上下文环境,这时url解释器也会介入完成url的解码工作,url解释器的解码顺序会根据url所在位置不同,可能在js解析器之前或之后
编码概念:
html字符实体:呈现html页面时,对某些特殊字符如“”直接使用,浏览器会误以为它们标签的开始或结束,想正确的在html页面呈现特殊字符就需要用到其对应的字符实体。字符实体是一个预先定义好的转义序列,它定义了一些无法在文本内容中输入的字符或符号。字符实体以&开头+预先定义的实体名称,以分号结束,如“
JavaScript编码:最常用的如\uXXXX”这种写法为Unicode转义序列,表示一个字符,其中xxxx表示一个16进制数字,如”
URL编码:%加字符的ASCI编码对于的2位16进制数字,如”"对应的URL编码为%2f。不能对协议类型进行任何的编码操作,否则url解释器会认为是无类型。
三、漏洞利用
先输入一个验证语句javascript:alert(‘z’)(警告消息框,有一个确定键)。伪代码内嵌绕过。发现被替换
因为后端只替换了script关键字,可以只对script实体编码为script。
这时候整个流程为:
1.get方式发送有弹窗语句值javascript:alert('z')
2.服务器接受数据,对值进行关键字替换,并为找到恶意关键字,将值返回给浏览器
3.浏览器接受html文档中间包含javascript:alert('z')
4.浏览器解析html文档,html解码:javascript:alert('z'),url解码:javascript:alert('z'),js解码:javascript:alert('z')
5.当用户点击连接执行弹窗