5.6 XSS跨站脚本攻击

目录

一、预备知识:关于DVWA

二、实验环境

三、实验步骤

1、反射性XSS

2、存储型XSS

四、实验思考


一、预备知识:关于DVWA

        DVWA(Damn Vulnerable Web Application)是基于PHP+MySQL的一套用于常规Web漏洞教学和检测Web脆弱性的程序,可以为安全专业人员测试自己的专业技能和工具提供所需要的环境,帮助Web开发者更好地掌握Web应用安全防范的过程。
        DVWA提供了以下10个功能模块。

  •  Brute Force(暴力破解)
  •  Command Injection(命令行注入)
  •  CSRF(跨站请求伪造)
  • File Inclusion(文件包含)
  • File Upload(文件上传)
  • Insecure CAPTCHA(不安全的验证码)
  • SQL Injection(SQL注入)
  • SQL Injection(Blind)(SQL盲注)
  • XSS(Reflected)(反射型跨站脚本)
  • XSS(Stored)(存储型跨站脚本)

        需要注意的是,DVWA 的代码分为4种安全级别:Low 、Medium、High和 Impossible。

二、实验环境

        Windows7,需要搭建DVWA网址,请见1、在XAMPP中搭建DVWA_sliver呀的博客-CSDN博客

三、实验步骤

1、反射性XSS

(1)在XAMPP中打开Apache HTTP服务和MySQL服务。

(2)打开DVWA网站,在浏览器中输入“http://127.0.0.1:<port>/DVWA/login.php”,输入默认的名称和密码(admin password)后,即可登录。

 (3)选择DVWA Security的安全级别,此处选择low选项。

(4)选择XSS(reflected)选项,进入以下界面。

(5)查看正常输入输出。在输入框中输入“test”,单击Submit按钮,可以看到页面上的正常返回结果,说明这个页面的功能是将用户输入的信息直接发送给用户。

 (6)点击右下角的"View Source",可见页面的PHP源码。

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?> 

        array_key_exists(“name”,$_GET):检查数组$_GET是否含有名字为“name”的键名,有,就返回True;否则返回False。

        从源码来看,页面直接将用户输入的信息返回给用户。

(7)进行攻击测试。在输入框中输入“<script>alert(/xss/)</script>”,可以看到非正常返回结果页面。

 

         在URL栏中,也可以看到:采用的是GET传参,由此可以说明,Web应用会将未经验证的数据通过请求发送给客户端。

(8)验证此类漏洞的持久性。再次选择左侧的XSS(Reflected)选项,可以看到页面恢复正常,说明此前输入的信息未保持,是非持久性跨站脚本漏洞。

2、存储型XSS

(1)在DVWA页面左侧选择XSS(Stored)。

(2)查看正常输入输出。在Name输入框中输入“test”,在Message输入框中输入“This is a test comment”。单击Sign Guestbook按钮,可以得到正常的返回结果,说明该网页是为用户发表署名和评论的。

(3)查看源代码。点击右下角的"View Source",可见页面的PHP源码。

if( isset( $_POST[ 'btnSign' ] ) ) {
    // Get input
    $message = trim( $_POST[ 'mtxMessage' ] );
    $name    = trim( $_POST[ 'txtName' ] );

    // Sanitize message input
    $message = stripslashes( $message );
    $message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Sanitize name input
    $name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

    // Update database
    $query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    $result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

    //mysql_close();
}

?> 
  • isset():判断变量是否存在,且是否为空;
  • trim($string,$charlist):移除字符串两侧的空白字符或者其他自定义的字符。$charlist为可选项,如果没有$charlist,则trim函数会移除的内容有:“\XOB”、“\t”、“\n”、“\r”、“\0”、“”(空格);
  • stripslashes($str):移除addslashes()函数添加的转义反斜杠字符(也就是说自己写的反斜杠不回被删);
  • is_object(mixed $var):检查变量是否是一个对象;
  • mysqli_real_escape_string(connection,escapestring):转义在字符串中的特殊字符(主要是NUL、\n、\r、\、'、"和control-Z)。

 $message =((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));

         这段php代码,主要是一个三元操作符,蓝色部分满足就执行黄色代码——转义 $message中的特殊字符;否则,触发用户自定义的错误信息。可见它对用户提交的数据检测页很少。

$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        这两行代码则是将用户提交的数据存入数据库。

(4)进行攻击测试。在Name输入框中输入“test”,在Message输入框中输入“<script>alert(XSS)</script>”。单击Sign Guestbook按钮,可以看到以下效果。

(5)验证漏洞的持久性。重新访问DVWA页面,单击刷新按钮或者选取左侧的XSS(Stored)选项,可以看到,仍然会弹框。

四、实验思考

        XSS的防范方法:

1、XSS过滤

        虽然XSS攻击的对象是客户端,但XSS的本质是Web应用服务的漏洞,所以必须同时对Web服务器和客户端进行安全加固才能避免攻击的发生。XSS过滤需要在客户端和服务器端同时进行。

2、输入验证

        输入验证就是对用户提交的信息进行有效性验证,仅接受有效的信息,阻止或忽略无效的用户输入信息。在对用户提交的信息进行有效性验证时,不仅要验证数据的类型,还要验证其格式、长度、范围和内容。

3、输出编码

        由于大多数Web应用程序都会把用户输入的信息完整地输出到页面中,从而导致XSS漏洞的存在。为解决这一问题,当需要将一个字符串输出到Web网页,但又无法确定这个字符串是否包含XSS特殊字符时,为了确保输出内容的完整性和正确性,可以使用HTML编码(HTMLEncode)进行处理。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值