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