根据红日安全写的文章,学习PHP代码审计审计的第二节内容,题目均来自PHP SECURITY CALENDAR 2017,讲完这个题目,会有一道CTF题目来进行巩固,外加一个实例来深入分析,想了解上一篇的内容,可以点击这里:PHP代码审计01之in_array()函数缺陷
下面我们开始分析。
下面来看第一题,代码如下:
<?php require 'vendor/autoload.php'; class Template{ private $twig; public function __construct() { //这里是第一次过滤 $indexTemplate = 'img'.'src="https://loremflickr.com/320/240">'. '<a href="http://www.likecs.com/{{link|escape}}">Next slide »</a>'; $loader = new Twig\Loader\ArrayLoader([ 'index.html'=>$indexTemplate ]); $this->twig = new Twig\Environment($loader); } public function getNexSlideUrl(){ $nexSlide = $_GET['nexSlide']; //这里是第二次过滤 return filter_var($nexSlide,FILTER_VALIDATE_URL); } public function render(){ echo $this->twig->render( 'index.html', ['link'=>$this->getNexSlideUrl()] ); } } (new Template())->render(); ?>这一关用的是PHP的一个模板引擎Twig,考察的是XSS漏洞,也就是跨站脚本攻击。虽然程序使用了escape和filter_var()两个过滤方法,但是。还是可以被绕过的。下面我们看第一处过滤,在上面代码的第10行,使用Twig模板引擎定义的escape过滤器来过滤link。而escape过滤器默认情况下,它使用HTML转义策略,也就是escape将PHP本机htmlspecialchars函数用于HTML转义策略,现在我们看一下PHP手册,htmlspecialchars函数是如何定义的。
其实就是把一些预定义字符转换成HTML实体。具体看下表:
下面我们来看第二处过滤,是在上面代码第20行,是用filter_var()来进行过滤,下面我们来看看PHP手册对这个函数的定义:
具体参数设置如下表:
上面代码是用了FILTER_VALIDATE_URL,把值作为 URL 来验证。这个函数过滤其他的参数设置说明,如下:
FILTER_CALLBACK:调用用户自定义函数来过滤数据。
FILTER_SANITIZE_STRING:去除标签,去除或编码特殊字符。
FILTER_SANITIZE_STRIPPED:”string” 过滤器的别名。
FILTER_SANITIZE_ENCODED:URL-encode 字符串,去除或编码特殊字符。
FILTER_SANITIZE_SPECIAL_CHARS:HTML 转义字符 ‘”<>& 以及 ASCII 值小于 32 的字符。
FILTER_SANITIZE_EMAIL:删除所有字符,除了字母、数字以及 !#$%&’*+-/=?^_{|}~@.[]
FILTER_SANITIZE_URL:删除所有字符,除了字母、数字以及 $-_.+!*'(),{}|\^~[]<>#%”;/?