zoukankan      html  css  js  c++  java
  • bWAPP练习--injection篇之HTML Injection

    什么是Injection?

      injection,中文意思就是注入的意思,常见的注入漏洞就是SQL注入啦,是现在应用最广泛,杀伤力很大的漏洞。

    什么是HTML injection?

       有交互才会产生漏洞,无论交互是怎么进行的。交互就是网页有对后台数据库的读取或前端的动态效果。HTML文件并不是像大家想的那样没有任何交互,在HTML文件里还是会用到一些JavaScript来完成自己需要的一些动态效果,例如,地址栏的参数就是location,用户所做的点击触发事件,以及一些动态的DOM交互都会影响到JavaScript的执行导致漏洞的产生。

      如果HTML文件可以被injection的话,那么就可以利用本地的HTML文件在本地域内执行JavaScript代码,权限是非常高的。

       

    平台简介:

      bWAPP:漏洞平台,开源web应用

    漏洞利用:

    页面

    我们可以看到这是一个Form提交表单的页面,并且是get请求方法。

    我们提交一些信息看看

    提交后可以看到,我们提交的信息在页面上显示。并且也在地址栏里面看到我们的信息,这是get请求的一个特征。

     

    A:Low级别(未进行任何过滤)

      A-1:增加外链,影响SEO,提升外链的PR

      PAYLOAD:http://127.0.0.1/htmli_get.php?firstname=<a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>&lastname=ESHLkangi&form=submit

      效果:

      

      A-2:反射性xss漏洞,进一步可以伪造存在xss漏洞的恶意网址执行自己DIY的ji代码,从而搜集到其他人的信息。

      PAYLOAD:http://118.89.17.134/htmli_get.php?firstname=<script>alert(document.cookie)</script>&lastname=ESHLkangi&form=submit

      效果:

      

    盗取了cookie。

     源码分析:

    HTML:

     1 <form action="/htmli_get.php" method="GET">
     2 
     3         <p>
     4         <label for="firstname">First name:</label><br>
     5         <input id="firstname" name="firstname" type="text">    
     6        </p>
     7 
     8         <p>
     9         <label for="lastname">Last name:</label><br>
    10         <input id="lastname" name="lastname" type="text">
    11         </p>
    12 
    13         <button type="submit" name="form" value="submit">Go</button>  
    14 
    15 </form>            

    对应的PHP代码:

     1 <?php
     2     if(isset($_GET["firstname"]) && isset($_GET["lastname"]))
     3     {   
     4         $firstname = $_GET["firstname"];
     5         $lastname = $_GET["lastname"];    
     6         if($firstname == "" or $lastname == "")
     7         {
     8             echo "<font color="red">Please enter both fields...</font>";       
     9         }
    10 
    11         else            
    12         { 
    13             echo "Welcome " . $firstname . " --- " . $lastname;   
    14         }
    15     }
    16 ?>

    分析:

    在表单提交的时候没有对用户输入的数据进行处理,并且在PHP代码中echo的时候没有处理就打印到页面,当我们在文本框中输入类似代码:

    <a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>

    那展示到页面的结果将会是一个可以跳转页面的超链接,同样我们也可以获取cookie。

    B:Medium级别(初级的字符处理)

     测试

    发现,超链接没有实现

     

    cookie也盗取不了。

    源码分析:

    HTML:

    不变

    PHP:

     1 function xss_check_1($data)
     2 {
     3 // Converts only "<" and ">" to HTLM entities 
     4 $input = str_replace("<", "&lt;", $data);
     5 $input = str_replace(">", "&gt;", $input);
     6 // Failure is an option^M
     7 // Bypasses double encoding attacks
     8 // <script>alert(0)</script>
     9 // %3Cscript%3Ealert%280%29%3C%2Fscript%3E^M
    10 // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E^M
    11 $input = urldecode($input);
    12 
    13 return $input;
    14 
    15 }

    通过源码,我们可以看到,开始使用了str_replace()函数过滤"<"和">"这两个特殊字符处理了,最后,用了urldecode()函数进行解码,把URL编码还原字符串。

    POC:

    依据代码的思路,我们可以先对"<"、">"进行urlencode,绕过str_replace()函数的过滤即可。建议把所有特殊的符号都进行编码,例如"=","/"等

    <a href="http://www.cnblogs.com/ESHLkangi/">ESHLkangi</a>

    进行urlencode后

    %3Ca href="http://www.cnblogs.com/ESHLkangi/"%3EESHLkangi%3C/a%3E

    把编码后的输入到文本框内

    成功绕过!!!

     C:High级别(htmlspecialchars)

    直接查看源码,进行一下审计

    后台源码:

     1 function xss_check_3($data, $encoding = "UTF-8")
     2 {
     3 
     4     // htmlspecialchars - converts special characters to HTML entities    
     5     // '&' (ampersand) becomes '&amp;' 
     6     // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
     7     // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
     8     // '<' (less than) becomes '&lt;'
     9     // '>' (greater than) becomes '&gt;'  
    10     
    11     return htmlspecialchars($data, ENT_QUOTES, $encoding);
    12        
    13 }

    发现代码中用了一个htmlspecialchars()函数。简单分析一下这个函数:

    htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。

    预定义的字符是:

    & (和号)成为 &amp
    " (双引号)成为 &quot
    ' (单引号)成为 &#039
    < (小于)成为 &lt
    > (大于)成为&gt

    它的语法如下:

    htmlspecialchars(string,flags,character-set,double_encode)

    其中第二个参数flags需要重要注意,很多开发者就是因为没有注意到这个参数导致使用htmlspecialchars()函数过滤XSS时被绕过。因为flags参数对于引号的编码如下:
    可用的引号类型:
    ENT_COMPAT - 默认。仅编码双引号。
    ENT_QUOTES - 编码双引号和单引号。
    ENT_NOQUOTES - 不编码任何引号。

    可以看到的是我们这里是使用了ENT_QUOTES 编码的,把单引号也过滤了。

    技术尚菜,想实现绕过有点困难,现在只能这样了。。。

     知乎上有些解答,可以参考https://www.zhihu.com/question/27646993

  • 相关阅读:
    完美的隐藏软键盘方法
    Android开发——构建自定义组件
    android 中 系统日期时间的获取
    Android开发之Intent跳转到系统应用中的拨号界面、联系人界面、短信界面
    总结:调用startActivityForResult,onActivityResult无响应的问题
    Android 頁面中有 EditText ,進入時取消自動彈出鍵盤
    Android中 Bitmap和Drawable相互转换的方法
    ImageView的属性android:scaleType
    动态添加组件(XML)
    Openfire3.8.2在eclipse中Debug方式启动最简单的方式
  • 原文地址:https://www.cnblogs.com/ESHLkangi/p/8280680.html
Copyright © 2011-2022 走看看