Day 2 - Twig,关于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="">Next slide »</a>';//第一处过滤这里使用escape过滤器来过滤了link
        // 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);//第二处过滤,使用filter_var函数和FILTER_VALIDATE_URL过滤器进行过滤
    }

    public function render() {
        echo $this->twig->render(
            'index.html',
            ['link' => $this->getNexSlideUrl()]
        );
    }
}
(new Template())->render();

可以看到,使用了Twig模板引擎的escape来过滤了link,其中escape的实现是通过PHP内置函数tmlspecialchars来实现的

tmlspecialchars可以将特殊字符转化为实体字符,从来在一定程度上可以避免xss。

& (& 符号)  ===============  &amp;
" (双引号)  ===============  &quot;
' (单引号)  ===============  &apos;
< (小于号)  ===============  &lt;
> (大于号)  ===============  &gt;

第二处的filter_var函数通过FILTER_VALIDATE_URL过滤器判断是否为合法的url。

但是这里可以通过伪协议绕过

最终的payload:?url=javascript://comment%250aalert(1) //在js中是单行注释的意思,那么他后面的内容均为注释。%25为%的url编码,%0a是换行符号,因此后面的alert(1)与注释符号就不在同一行,既可执行。

所以便存在xss漏洞。