zoukankan      html  css  js  c++  java
  • bWAPP_HTML Injection

    0x00:前言

    bWAPPweb安全靶场,HTML_Injection模块

    0x01:HTML注入

    超文本标记语言(HTML)注入有时也被称为虚拟污染。 这实际上是一个由站点造成的攻击,该站点允许恶意用户向其 Web 页面注入 HTML,并且没有合理处理用户输入。 换句话说,HTML 注入漏洞是由接收 HTML 引起的,通常通过一些之后会呈现在页面的表单输入。

    1)HTML injection (get)_low

    1.1.1 输入两个名字,页面出现用户输入的东西

     

    1.1.2网页地址为:

     

     更改参数,low等级的没有对输入的内容有任何检测

     

     结果:

     

     1.1.3 或者  firstname  改为 <a href=http://www.baidu.com>点这里到百度</a>

    <a>标签的href 属性规定链接的目标

     

    结果:

     

     

     

    firstname=<script>alert(document.cookie)</script>    可以获取用户cookie

    2)HTML injection (get)_medium

    1.2.1  <h1>Hack</h1>无效

     

     应该对字符<>/ ,检测或过滤了,检测的方法:过滤、替换、编码解码,这里没有做替换,试一下编码解码

    试一下URL encode(其他还有很多编码方式base64等)

    urlencode("<h1>Hack</h1>")  --->   

     

     结果:没变,说明页面展示的时候,把我输入的内容URLdecode

     

     那我们URLencode两次,他解码后就是一次URLencode的结果

     

     结果注入成功

     

     因为 只进行一次URLencode,浏览器会自动默认 把参数URLdecode一遍,所以和没编码没有区别,两次的话浏览器解码一次,页面展示的时候在解码一次

    2)HTML injection (get)_high

    ......看一下源码吧

    function xss_check_3($data, $encoding = "UTF-8")
    {
        // htmlspecialchars - converts special characters to HTML entities    
    
        // '&' (ampersand) becomes '&'
    
        // '"' (double quote) becomes '"' when ENT_NOQUOTES is not set
    
        // "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set
    
        // '<' (less than) becomes '<'
    
        // '>' (greater than) becomes '>'  
    
        return htmlspecialchars($data, ENT_QUOTES, $encoding);
    
    }

    有一个htmlspecialchars()函数,百度一下

     

    不会绕过~~~

    知乎上有回答的https://www.zhihu.com/question/27646993,分不同场景,但是我都试过了还是不行

     

    2)HTML injection_post

    方法和get一样,只是postget的区别

    (3) HTML injection_current url

    代码审计:

    switch($_COOKIE["security_level"])
    {
        case "0" :
            // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]);
            $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"];               
            break;
    case "1" : $url = "<script>document.write(document.URL)</script>"; break; case "2" : $url = "http://" . $_SERVER["HTTP_HOST"] . xss_check_3($_SERVER["REQUEST_URI"]); break; default : // $url = "http://" . $_SERVER["HTTP_HOST"] . urldecode($_SERVER["REQUEST_URI"]); $url = "http://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"]; break; }
    <div id="main">
        
        <h1>HTML Injection - Reflected (URL)</h1>   
    
        <?php echo "<p align="left">Your current URL: <i>" . $url . "</i></p>";?>    
    
    </div>

    PHP超全局变量$_SERVER的作用:(引用https://www.cnblogs.com/zhao-/p/10994615.html

    $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

    1. $_SERVER['HTTP_HOST']  请求头信息中的Host内容,获取当前域名。
    2. $_SERVER["SERVER_NAME"]  输出配置文件httpd.conf中的ServerName,一般情况下与HTTP_HOST值相同,但如果服务器端口不是默认的80端口,或者协议规范不是HTTP/1.1时,HTTP_HOST会包含这些信息,而SERVER_NAME不一定包含。(主要看配置文件的设置)。
    3. $_SERVER["HTTP_USER_AGENT"]  获取用户相关信息,包括用户浏览器、操作系统等信息。
    4. $_SERVER['HTTP_ACCEPT']  当前请求的ACCEPT头部信息。
    5. $_SERVER["HTTP_ACCEPT_LANGUAGE"]  这个值是由浏览器发送,表明用户默认的语言设置,后面的q值表示用户对该语言的喜好程度。
    6. $_SERVER["HTTP_ACCEPT_ENCODING"]  大部分的现代浏览器都支持gzip压缩,并会把这一信息报告给服务器。这时服务器就会压缩过的HTML发送给浏览器。这可以减少近80%的文件大小,以节省下载时间和带宽。
    7. $_SERVER["HTTP_COOKIE"]  浏览器的cookie信息。
    8. $_SERVER["HTTP_CONNECTION"]  当前请求的连接情况。
    9. $_SERVER["HTTP_UPGRADE_INSECURE_REQUESTS"]  表示浏览器可读懂服务器发过来的请求,
    10. $_SERVER["HTTP_CACHE_CONTROL"]  表示浏览器是否会缓存这个页面信息。
    11. $_SERVER["PATH"]  当前脚本所在文件系统。
    12. $_SERVER["SystemRoot"]  当前服务器的操作系统。
    13. $_SERVER["COMSPEC"]  指向cmd.exe的路径。
    14. $_SERVER["PATHEXT"]  环境变量设置。
    15. $_SERVER["WINDIR"]  脚本指向的系统目录。
    16. $_SERVER["SERVER_SIGNATURE"]  包含服务器版本和虚拟主机名的字符串。
    17. $_SERVER["SERVER_SOFTWARE"]  服务器软件配置信息。
    18. $_SERVER["SERVER_ADDR"]  当前运行脚本的服务器的ip地址。
    19. $_SERVER["SERVER_PORT"]  服务器端口。
    20. $_SERVER["REMOTE_ADDR"]  浏览网页的用户ip。
    21. $_SERVER["DOCUMENT_ROOT"]  当前运行脚本所在的根目录。
    22. $_SERVER["REQUEST_SCHEME"]  服务器通信协议,是http或https。
    23. $_SERVER["CONTEXT_PREFIX"]  前缀。
    24. $_SERVER["CONTEXT_DOCUMENT_ROOT"]  当前脚本所在的文档根目录。
    25. $_SERVER["SERVER_ADMIN"]  服务器管理员信息。
    26. $_SERVER["SCRIPT_FILENAME"]  当前执行脚本的绝对路径。
    27. $_SERVER ["REMOTE_PORT"]  用户连接到服务器时所使用的端口。
    28. $_SERVER["GATEWAY_INTERFACE"]  服务器使用的CGI规范的版本。
    29. $_SERVER["SERVER_PROTOCOL"]  请求页面时通信协议的名称和版本。
    30. $_SERVER["REQUEST_METHOD"]  请求提交数据的方式。
    31. $_SERVER["QUERY_STRING"]  服务器请求时?后面的参数。
    32. $_SERVER["REQUEST_URI"]  当前脚本路径,根目录之后的目录。
    33. $_SERVER["SCRIPT_NAME"]  当前脚本的路径。这在页面需要指向自己时非常有用。
    34. $_SERVER["PHP_SELF"]  当前正在执行脚本的文件名。
    35. $_SERVER["REQUEST_TIME"]  得到请求开始时的时间戳。

    那么这里是获取Host和当前脚本路径,进行处理,然后在页面显示

    low

    把Host改为Hack,实际的时候可以改为其他网址,或者把路径修改也可(前提是有那个脚本)

     

     mideum

    mideum是document.write(document.URL) 

    那只能对URL做手脚了

    看别人说只有IE浏览器可以,看来以后要多注意IE浏览器额

     high

    high只对当前脚本路径  用了htmlspecialchars()函数,HTML编码技术,但是Host还是可以用low等级的方法

     

    (4) HTML injection store

    low

    没有任何过滤

    medium

     试了一下简单的绕过无果,审计一下代码,存储型无非就是将输入的内容存储到数据库,在查询显示的过程

    找到了关键代码

    所有输入的内容都要经过sqli_check_3()处理一次

    function htmli($data)
    {
        include("connect_i.php");
    
        switch($_COOKIE["security_level"])
        {
            case "0" :
                $data = sqli_check_3($link, $data);
                break;
    
            case "1" :
                $data = sqli_check_3($link, $data);
                // $data = xss_check_4($data);
                break;
    
            case "2" :
                $data = sqli_check_3($link, $data);
                // $data = xss_check_3($data);
                break;
    
            default :
                $data = sqli_check_3($link, $data);
                break;
        }
        return $data;
    }

    这是 sqli_check_3()

    function sqli_check_3($link, $data)
    {
        return mysqli_real_escape_string($link, $data);
        
    }

    mysqli_real_escape_string()函数转义字符串中的特殊字符,比如中文等,详细这里https://www.runoob.com/php/func-mysqli-real-escape-string.html

    while($row = $recordset->fetch_object())
    {
        if($_COOKIE["security_level"] == "1" or $_COOKIE["security_level"] == "2")
        {
    ?>
            <tr height="40">
                <td align="center"><?php echo $row->id; ?></td>
                <td><?php echo $row->owner; ?></td>
                <td><?php echo $row->date; ?></td>
                <td><?php echo xss_check_3($row->entry); ?></td>   //这里如果安全等级是 1 或 2 即 medium和high就经过xss_check_3()函数处理之后展示
            </tr>
    <?php
        }
        else
        {
    ?>
            <tr height="40">
                <td align="center"><?php echo $row->id; ?></td>
                <td><?php echo $row->owner; ?></td>
                <td><?php echo $row->date; ?></td>
                <td><?php echo $row->entry; ?></td>
            </tr>
    <?php
        }
    }
    function xss_check_3($data, $encoding = "UTF-8")
    {
        // htmlspecialchars - converts special characters to HTML entities    
        // '&' (ampersand) becomes '&amp;' 
        // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
        // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
        // '<' (less than) becomes '&lt;'
        // '>' (greater than) becomes '&gt;'  
        return htmlspecialchars($data, ENT_QUOTES, $encoding);
    }

    不知道怎么Hack,网上的全都是一摸一样的答案,难道不能Hack?

    这个存储型的一般在Blog中出现(?)

    0x02:总结

    有点像反射型XSS(一样的?)漏洞修复建议:过滤输入的数据,如<   >   '   "   onclick  on***等;对数据编码,HTML实体编码 JS编码 

  • 相关阅读:
    [Android] 开源框架 xUtils HttpUtils 代理设置 (Temporary Redirect错误)
    [Android] 开源框架 Volley 自定义 Request
    [算法]——汉诺塔的递归深度
    [libwww-perl]——POST方法的使用
    [Go语言]从Docker源码学习Go——Interfaces
    [Linux]可用于管道操作的命令
    npoi 导出word中写入特殊字符
    thinkphp框架中使用PHPExcel,按模板导出excel
    Access导出csv 内容添加双引号 vba
    导出excel和PDF小结 vba
  • 原文地址:https://www.cnblogs.com/liqik/p/12304911.html
Copyright © 2011-2022 走看看