php系统常量如__file__、__dir__、php_os等本身不执行代码,但若被拼接进动态路径、命令或输出中,可能引发lfi、信息泄露或逻辑绕过;需用grep筛查其与用户输入及危险函数的组合使用。

PHP系统常量本身不直接执行代码,但部分预定义常量(如 __FILE__、__DIR__、PHP_OS、PHP_SAPI、INI_SCANNER_* 等)若被不当拼接进动态路径、命令或配置逻辑中,可能成为路径遍历、信息泄露或逻辑绕过的跳板。更需警惕的是,某些常量在特定上下文中会暴露敏感环境信息,或与危险函数组合形成高危链。用 grep 快速筛查这些常量的使用位置,是安全审计中轻量但高效的一步。
重点扫描的高危/敏感系统常量
以下常量需优先关注其调用上下文,尤其当它们出现在文件操作、包含语句、命令拼接或输出位置时:
-
__FILE__ 和 __DIR__:常用于自动包含或路径构造,若参与用户可控路径拼接(如
include __DIR__ . '/' . $_GET['m'] . '.php';),易引发LFI - PHP_OS、PHP_SAPI、PHP_VERSION:若直接输出到前端或日志,可能泄露服务器指纹,辅助攻击者选择利用方式
-
INI_SCANNER_RAW、INI_SCANNER_TYPED:出现在
parse_ini_file()或parse_ini_string()调用中,若参数受控且使用INI_SCANNER_RAW,可能绕过某些解析限制,配合恶意INI内容触发代码执行 -
MAGIC_QUOTES_GPC(已废弃但旧项目仍见):若代码中存在兼容性判断逻辑(如
if (!get_magic_quotes_gpc()) { ... }),可能暴露开发疏漏或残留不安全过滤逻辑
实用grep命令组合(Linux/macOS终端)
在项目根目录执行以下命令,覆盖常见变体和上下文:
- 基础常量搜索(含大小写):
grep -rni "__file\|__dir\|php_os\|php_sapi\|php_version\|ini_scanner" --include="*.php" . - 聚焦危险上下文(如拼接、输出、包含):
grep -rni "__DIR__.*\$_\|__FILE__.*\$_\|php_sapi.*echo\|parse_ini.*raw" --include="*.php" . - 排除注释行干扰(提升准确率):
grep -rni "__FILE__\|__DIR__" --include="*.php" . | grep -v "^[[:space:]]*//\|^[[:space:]]*/\*" - 定位常量后紧跟括号或点号的可疑调用(如
__DIR__ . $_GET):grep -rE "__DIR__\s*\.\s*\$_|__FILE__\s*\.\s*\$_|parse_ini_[a-z]+\s*\(\s*[^)]*INI_SCANNER_RAW" --include="*.php" .
人工复核关键点
grep仅定位线索,是否构成风险取决于具体用法。复核时重点关注:
- 该常量是否与用户输入变量(
$_GET、$_POST等)直接拼接?拼接后是否进入include、require、fopen、system等函数? - 是否被直接
echo、print_r或写入日志?是否可能泄露/var/www、Linux、apache2handler等敏感信息? - 是否出现在
parse_ini_file()第三个参数位置?该参数是否由用户控制?若为INI_SCANNER_RAW,是否对传入的INI内容做过滤? - 是否存在条件判断依赖已废弃常量(如
MAGIC_QUOTES_GPC),导致实际过滤未生效?
延伸建议:结合其他线索交叉验证
单看常量不够,需联动分析:
- 若发现
__DIR__大量出现在include语句中,同步检查对应$_GET/$_REQUEST参数是否做过白名单校验 - 若
PHP_SAPI出现在配置判断块里(如if (PHP_SAPI === 'cli') { ... }),确认该分支逻辑是否意外暴露给Web请求 - 将 grep 结果与前面提到的危险函数(
eval、system、include)扫描结果取交集,快速定位“常量+危险函数+用户输入”三元高危链
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











