PHP代码审计之关于PHP_SELF的简单利用
字数 769 2025-08-20 18:17:53

PHP代码审计:关于PHP_SELF的安全利用分析

漏洞概述

本文分析了基于$_SERVER['PHP_SELF']变量的安全漏洞,这种漏洞可能导致SQL注入攻击。漏洞存在于ImpressCMS等系统中,通过精心构造的URL可以触发时间延迟型SQL注入。

漏洞复现

  1. 安装ImpressCMS系统
  2. 访问以下URL触发漏洞:
    http://127.0.0.1:81/admin.php/modules/system' and sleep(2) and '1
    
  3. 观察响应时间,如果出现3秒左右的延迟,则证明漏洞存在

漏洞分析

漏洞核心位于\htdocs\libraries\icms\module\Handler.php文件的service函数:

static public function service($inAdmin = FALSE) {
    if ($inAdmin || ... ) {
        $url_arr = explode('/', strstr($_SERVER['PHP_SELF'], '/modules/'));
        if (isset($url_arr[2])) {
            $module = icms::handler("icms_module")->getByDirname($url_arr[2], TRUE);

关键点:

  1. 使用$_SERVER['PHP_SELF']获取当前脚本路径
  2. /modules/为分隔符分割URL
  3. 将分割后的第二部分直接传入getByDirname函数

getByDirname函数实现(存在SQL注入):

public function getByDirname($dirname, $loadConfig = FALSE) {
    if (!empty($this->_cachedModule[$dirname]) &&
        $this->_cachedModule[$dirname]->getVar('dirname') == $dirname
    ) {
        ...
    } else {
        $sql = "SELECT * FROM " . $this->db->prefix('modules') . " WHERE dirname = '" . trim($dirname) . "'";
        //执行sql

扩展思考

其他类似漏洞模式

  1. 文件后缀检查绕过:

    $tmp = strtolower(substr($uri,-4));
    if(in_array($tmp,array('.jpg','.gif','.png','jpeg')) && substr($uri,0,11) == 'res/_cache/'){
        $tmp = substr($uri,11);
        $tmp = explode("/",$tmp);
        get_one($tmp[0]);
    

    攻击payload:

    index.php/res/_cache/a'-sleep(3)-'/test/test.jpg
    
  2. REQUEST_URI的路径遍历:

    <?php
    print_r($_SERVER['REQUEST_URI']);
    ?>
    

    修改请求为:

    /abc'd/../test/test.php
    

    虽然实际访问的是test.php,但REQUEST_URI会输出修改后的路径

安全风险

  1. 直接输出PHP_SELFREQUEST_URI可能导致反射型XSS
  2. $_SERVER数组中多个变量可能被恶意利用,需要谨慎处理

防御建议

  1. 对从$_SERVER获取的所有数据进行严格过滤和转义
  2. 使用预处理语句处理数据库查询
  3. 实施白名单机制验证文件路径和扩展名
  4. 对输出到页面的URL进行HTML编码
  5. 避免直接拼接用户输入到SQL查询中

总结

PHP_SELFREQUEST_URI等服务器变量如果处理不当,可能导致SQL注入、XSS等安全漏洞。开发人员应始终验证和清理来自$_SERVER数组的所有输入,并采用安全的编码实践来防止此类漏洞。

PHP代码审计:关于PHP_ SELF的安全利用分析 漏洞概述 本文分析了基于 $_SERVER['PHP_SELF'] 变量的安全漏洞,这种漏洞可能导致SQL注入攻击。漏洞存在于ImpressCMS等系统中,通过精心构造的URL可以触发时间延迟型SQL注入。 漏洞复现 安装ImpressCMS系统 访问以下URL触发漏洞: 观察响应时间,如果出现3秒左右的延迟,则证明漏洞存在 漏洞分析 漏洞核心位于 \htdocs\libraries\icms\module\Handler.php 文件的 service 函数: 关键点: 使用 $_SERVER['PHP_SELF'] 获取当前脚本路径 以 /modules/ 为分隔符分割URL 将分割后的第二部分直接传入 getByDirname 函数 getByDirname 函数实现(存在SQL注入): 扩展思考 其他类似漏洞模式 文件后缀检查绕过: 攻击payload: REQUEST_URI 的路径遍历: 修改请求为: 虽然实际访问的是test.php,但 REQUEST_URI 会输出修改后的路径 安全风险 直接输出 PHP_SELF 或 REQUEST_URI 可能导致反射型XSS $_SERVER 数组中多个变量可能被恶意利用,需要谨慎处理 防御建议 对从 $_SERVER 获取的所有数据进行严格过滤和转义 使用预处理语句处理数据库查询 实施白名单机制验证文件路径和扩展名 对输出到页面的URL进行HTML编码 避免直接拼接用户输入到SQL查询中 总结 PHP_SELF 和 REQUEST_URI 等服务器变量如果处理不当,可能导致SQL注入、XSS等安全漏洞。开发人员应始终验证和清理来自 $_SERVER 数组的所有输入,并采用安全的编码实践来防止此类漏洞。