个人博客地址
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 »</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:不在同一行了。所以不在注释范围内。可以成功执行
欢迎大家一起学习交流,共同进步,欢迎加入信息安全小白群