• 【bWAPP】0X02 HTML Injection


    HTML注入-反射型URL

    查看服务器端源代码时,其中重点关注的有两处

    1 <div id="main">
    2     
    3     <h1>HTML Injection - Reflected (URL)</h1>   
    4 
    5     <?php echo "<p align="left">Your current URL: <i>" . $url . "</i></p>";?>    
    6 
    7 </div>

    这段代码中有一段PHP代码,执行html语句,输出一段“Your current URL:”字符,在文本中左对齐,并调用$url变量,将输出的内容跟在后面。

    防御代码:

     1 <?php
     2 include("security.php");
     3 include("security_level_check.php");
     4 include("functions_external.php");
     5 include("selections.php");
     6 
     7 $url= "";        
     8 switch($_COOKIE["security_level"])
     9 {
    10     case "0" :
    11         // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]);
    12         $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];               
    13         break;
    14     case "1" :
    15         $url = "<script>document.write(document.URL)</script>";
    16         break;
    17     case "2" :
    18         $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);
    19         break;
    20     default :
    21         // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]);
    22         $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];               
    23         break;
    24 }
    25 ?>
    1         <select name="security_level">
    2             
    3             <option value="0">low</option>
    4             <option value="1">medium</option>
    5             <option value="2">high</option> 
    6             
    7         </select>

    阅读防御代码可以了解到根据设置的难度不同,调用的防御代码与不同。

    当将等级设置为low时,执行

    $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];

    其中“$_SERVER["HTTP_HOST"]”表示获取当前域名,与之功能相似的还有一个是$_SERVER['SERVER_NAME']

    当满足以下3个条件的时候,两者会输出相同的信息
         A、服务器端口号为80
         B、Apache中的conf中的ServerName设置正确
         C、HTTP/1.1协议规范
    不同点
          A、$_SERVER['HTTP_HOST']:在HTTP/1.1协议下,会根据客户端的HTTP请求输出信息;
                $_SERVER['SERVER_NAME']:默认情况下会直接输出Apache的配置文件httpd.conf中的ServerName的值
          B、当服务器的端口号不是80时
                $_SERVER['HTTP_HOST']会输出端口号,例如“www.funwall.cn:8080”
                $_SERVER['SERVER_NAME']直接输出ServerName的值,例如“www.funwall.cn”
                 在这种情况下,可以理解成HTTP_HOST = SERVER_NAME:SERVRE_PORT
         C、当配置文件httpd.conf中的ServerName与HTTP/1.0下的域名不一致的时候,假如httpd.conf配置如下:
                <virtualhost *>
                          ServerName funwall.cn
                          ServerAlias www.funwall.cn
                </virtualhost>
                客户端访问域名:www.funwall.cn
                $_SERVER[HTTP_HOST]输出:www.funwall.cn
                $_SERVER[SERVER_NAME]输出:funwall.cn
    因此,在实际中应该用$_SERVER[HTTP_HOST]获取域名比较保险。

    而“$_SERVER["REQUEST_URI"]”是获取域名后面的完整的地址路径。

    在level low下,通过抓包改包,修改host参数,可以发现主页上回显会有相应的改变。

    当将等级设置为medium时,执行

    $url = "<script>document.write(document.URL)</script>";

    这里document对象 -- 代表整个HTML 文档,可用来访问页面中的所有元素;

    document.URL是 设置URL属性从而在同一窗口打开另一网页;
    document.write() 是动态向页面写入内容。

    此时再通过前面的方式抓包改包,已经不起作用了。

    在low和medium等级下,是没有做任何防护的,都是直接获取url然后将其直接输出,可以在连接中添加代码实现弹框,这里是ie禁用了部分js脚本,导致了弹框失败。

    在high等级下,执行

    $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]);

    其中调用了xss_check_3函数对host后面的部分进行了过滤处理,使得无法进行注入。

  • 相关阅读:
    C# 杨辉三角 下
    C# 自动走迷宫 下
    算法练习之1数字填充 下
    动态添加控件并获取其值
    两个ListBox的互动
    VS2005常用快捷键
    GridView内嵌DropDownList操作
    GridView格式化短日期
    获得客户端ID
    Access数据库 Update 语句的怪现象
  • 原文地址:https://www.cnblogs.com/Yuuki-/p/13220604.html
Copyright © 2020-2023  润新知