【代码审计】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:不在同一行了。所以不在注释范围内。可以成功执行

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vicl1fe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值