RIPS 代码审计 – 第二关(Twig)
文章来源:红数位
靶场源码:
// 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); //验证是否获取的实参是否为真正的URL
}
public function render() {
echo $this->twig->render(
'index.html',
['link' => $this->getNexSlideUrl()]
);
}
}
(new Template())->render();
该代码在第26行中包含一个跨站点脚本漏洞。有两个过滤器试图确保传递给<a>标记的链接 是一个真正的URL。首先,第filter_var()22行中的 函数检查它是否为有效的URL。然后,在第10行中使用Twig的模板转义,这避免了超出 href属性的情况。仍可以通过以下URL利用此漏洞:?nextSlide=javascript://comment%0aalert(1)。有效负载不包含任何会受到Twig的转义影响的标记字符。同时,它是的有效网址filter_var()。我们使用了JavaScript协议处理程序,然后引入了JavaScript注释 //,然后实际的JS有效负载在换行符之后。单击链接后,将在受害者的浏览器中执行JavaScript有效负载。
张