• 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:/DVWA/login.php”,输入默认的名称和密码(admin password)后,即可登录。

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

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

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

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

    1. header ("X-XSS-Protection: 0");
    2. // Is there any input?
    3. if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    4. // Feedback for end user
    5. echo '
      Hello ' . $_GET[ 'name' ] . '
      '
      ;
    6. }
    7. ?>

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

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

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

     

             在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源码。

    1. if( isset( $_POST[ 'btnSign' ] ) ) {
    2. // Get input
    3. $message = trim( $_POST[ 'mtxMessage' ] );
    4. $name = trim( $_POST[ 'txtName' ] );
    5. // Sanitize message input
    6. $message = stripslashes( $message );
    7. $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)) ? "" : ""));
    8. // Sanitize name input
    9. $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)) ? "" : ""));
    10. // Update database
    11. $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    12. $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '
      ' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
      '
      );
    13. //mysql_close();
    14. }
    15. ?>
    • 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中的特殊字符;否则,触发用户自定义的错误信息。可见它对用户提交的数据检测页很少。

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

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

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

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

    四、实验思考

            XSS的防范方法:

    1、XSS过滤

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

    2、输入验证

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

    3、输出编码

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

  • 相关阅读:
    OA办公系统
    cmake vs openmp
    [Codeforces] number theory (R1600) Part.9
    (附源码)php小型网络舆情平台设计 毕业设计 252324
    Java native 关键字
    [集群聊天项目] muduo网络库
    基于springboot的汽车销售系统,汽车商城管理系统,附源码+数据库+论文+开题报告,包远程安装调试
    MQ - 24 Pulsar集群架构设计与实现
    IMX6ULL学习笔记(9)——通过SD卡启动Linux内核
    新时代背景下智慧城市的建设与5G技术有何关联
  • 原文地址:https://blog.csdn.net/qq_55202378/article/details/126179130