【bWAPP】0X01 HTML Injection - Reflected (GET)&(POST)

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型

 

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

猜你喜欢

转载自www.cnblogs.com/Yuuki-/p/12916729.html
今日推荐