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编码 

原文地址:https://www.cnblogs.com/liqik/p/12304911.html