zoukankan      html  css  js  c++  java
  • 【bWAPP】0X01 HTML Injection

    HTML注入-反射型GET

     

    描述:HTML 注入漏洞是指在用户输入的地方,输入 HTML 文本,被当作 GET 参数传到服务器,服务器以原始格式存储,未采用 HTML 编码,导致 HTML 的特性被浏览器解析执行。这种编码必须在服务器端存储参数的时候进行。

     

    low

     

    当用户在输入框输入内容,后台对输入内容不做处理直接添加入页面的时候,用户就可以刻意填写HTML、JavaScript脚本来作为文本输入,这样这个页面就会出现一些用户加入的东西了

     

    这里在文本框内输入内容,直接返回像是在网页页面,那么在文本框内输入HTML语句会产生什么效果

     

    将语句

    <a href="https://www.cnblogs.com/Yuuki-/" >点击这里</a>

    填入两个文本框后点击确定,可以发现welcome后面跟了两个超链接

     

    查看他的网页源码会发现,我们写的HTML语句直接添加到了里面。

     

    不过,如果退出账号重新登录,或退出该页面重新访问,这段代码就不在了,所以是一种反射型的注入。

    看一看这个网页在服务器端的源代码,与前端不同的是,多了三段PHP代码。

    第一段,用来判断当前题目的防护等级,即low、medium、high,并针对不同等级调用不同的防护代码,根据防护等级调用functions_external.php文件中的代码进行防护

     1 <?php
     2 include("security.php");
     3 include("security_level_check.php");
     4 include("functions_external.php");
     5 include("selections.php");
     6 
     7 function htmli($data)
     8 {         
     9     switch($_COOKIE["security_level"])
    10     {        
    11         case "0" :             
    12             $data = no_check($data);            
    13             break;
    14         
    15         case "1" :            
    16             $data = xss_check_1($data);
    17             break;
    18         
    19         case "2" :                                   
    20             $data = xss_check_3($data);            
    21             break;        
    22 
    23         default :            
    24             $data = no_check($data);            
    25             break;   
    26     }       
    27     return $data;
    28 }
    29 ?>

    第二段,用来接收文本框中输入的内容,并返回显示至网页

    首先判断文本框中是否有输入内容,若没有则返回红色字体的Please enter both fields...

    如果有输入内容就将输入的内容跟在welcome后面输出到网页

    <?php
        if(isset($_GET["firstname"]) && isset($_GET["lastname"]))
        {   
            $firstname = $_GET["firstname"];
            $lastname = $_GET["lastname"];    
            if($firstname == "" or $lastname == "")
            {
                echo "<font color="red">Please enter both fields...</font>";       
            }
            else            
            { 
                echo "Welcome " . htmli($firstname) . " " . htmli($lastname);   
            }
        }
    ?>

    第三段,来确定当前属于题目表中的哪一个题目

    <?php
    // Lists the options from the array 'bugs' (bugs.txt)  列出数组“bugs”(bugs.txt)中的选项
    foreach ($bugs as $key => $value)
    {    
       $bug = explode(",", trim($value));   
       // Debugging
       // echo "key: " . $key;
       // echo " value: " . $bug[0];
       // echo " filename: " . $bug[1] . "<br />";   
       echo "<option value='$key'>$bug[0]</option>"; 
    }
    ?>

    在防护代码中0防护(也就是low)下是没用任何防御手段的。

    medium

    改变防护等级,继续输入测试语句,发现他原样输出,并没有产生超链

    我们抓包比较一下两种难度下的数据包

        

     其中在返回的数据包中,有区别的地方如下:

    Welcome <a href="https://www.cnblogs.com/Yuuki-/" >点击这里</a> <a href="https://www.cnblogs.com/Yuuki-/" >点击这里</a>
    Welcome &lt;a href="https://www.cnblogs.com/Yuuki-/" &gt;点击这里&lt;/a&gt; &lt;a href="https://www.cnblogs.com/Yuuki-/" &gt;点击这里&lt;/a&gt;

    注意一下两个的区别,它将代码中的“<”和“>”进行了转义,转移为HTML实体编码。

    通过对尖括号<>做编码处理,将尖括号<>进行两次url编码,即可成功绕过转义编码。

     

     在这个难度模式下,调用了xss_check_1,我们找到该源码。在这里可以看到,他将输入的尖括号进行了替换,而如何绕过的方法也有在下面解释。

    high

    在高防护等级中,输入测试代码,还是直接回显出来,查看他的源码部分,发现也是对“<>”进行了转义处理

     

     尝试进行URL编码后再测试

     当防护等级调整到最高时,会调用xss_check_3

    我们找到源码看看,他利用了php的高级转义函数htmlspecialchars,这种情况下就解决了这种注入问题。

    但是如果开发人员把htmlspcialchars用在不当地方(如script标签中间),那这层防护就和没有一样。

     

    HTML注入-反射型POST

    与GET型最大的区别在于传输方式的不同

    POST型

    GET型

     

    这两种的防御方式都一样,只是数据的传输方式不一样

  • 相关阅读:
    微服务概述
    Airflow 配置celery+rabbitmq和celery+redis
    CentOS7安装Airflow
    Python如何import其它.py文件及其函数
    ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    CentOS7安装MySQL
    Hadoop完全分布式环境下,DataNode进程正常启动,但是网页上不显示DataNode节点
    <一> windbg简介
    几个资料下载网站
    使用VS2012 C++ 进行单元测试
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/12916729.html
Copyright © 2011-2022 走看看