【代码审计】PHP SECURITY CALENDAR 2017 Twig

个人博客地址

http://www.darkerbox.com

欢迎大家学习交流

环境:

https://www.ripstech.com/php-security-calendar-2017/

参考

分析

这是第二个题目
给了以下代码。

<?php
// 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();

代码用的是php的一个模板引擎twig。

题目代码分别用了两个过滤方法。分别为escape和filter_var。分别在href="{ {link|escape}}"return filter_var($nextSlide, FILTER_VALIDATE_URL);

过滤1

escape方法是twig定义的。内部其实用的是htmlspecialchars方法。

htmlspecialchars其实就是进行了实体编码。
在这里插入图片描述

过滤2

而filter_var过滤。使用FILTER_VALIDATE_URL 过滤器判断是否是一个合法的url。

绕过

可以通过javascript伪协议绕过。
payload:

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

正常情况的伪协议是这样的

javascript:alert(1)

而上面的payload中的//是注释的意思。把后面的注释掉,注意是单行注释,主要是为了绕过filter_var。

后面的%250a其实是%0a的url编码。这里进行了二次编码。因为服务器会解码一次。%0a是换行。换行后,alert(1)就和javascript:不在同一行了。所以不在注释范围内。可以成功执行

欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41918771/article/details/105183173