windows的文件系统机制引发的PHP路径爆破问题分析

建站知识 2025-04-20 13:27www.168986.cn长沙网站建设

开篇之际,我想分享一项近期的研究发现。在研究过程中,我针对特定网页进行了一系列测试,发现了一个令人惊讶的现象。这段PHP代码:

```php

for ($i=0; $i<255; $i++) {

$url = '1.ph' . chr($i);

$tmp = @file_get_contents($url);

if (!empty($tmp)) echo chr($i) . "\r";

}

```

在访问某些URL时,竟然能够成功获取响应。尤其是当URL形如“1.php”,“1.phP”,“1.ph<”和“1.ph>”时,都能得到返回结果。这个现象在多种PHP版本(包括PHP4.9、PHP5.2、PHP5.3和PHP6.0)和Windows操作系统(如WINXP SP3 X32、WINXP SP2 X64、WIN7和WIN2K3)上均存在。显然,这是一个影响广泛的漏洞。

为了更深入地了解这个“bug”,我们对测试进行了扩展。通过修改代码,我们发现在调试PHP解释器时,这个问题与Windows API函数FindFirstFile()的行为有关。在跟踪函数调用栈的过程中,我们发现某些字符(如“>”被替换成“?”,“<”被替换成空字符,而双引号被替换成“.字符”)出现了意外的变化。这个现象在2007年的msdn文档中已有提及,但至今仍未在任何Windows版本中得到修复。

值得注意的是,FindFirstFile()函数在PHP中的使用远不止于file_get_contents()函数。我们还可以利用该函数执行其他操作。这个漏洞不仅仅存在于PHP中,C++程序也同样受到影响。例如,当使用以下C++代码:

```cpp

include

include

include

void _tmain(int argc, TCHAR argv[]) {

WIN32_FIND_DATA FindFileData;

HANDLE hFind;

if( argc != 2 ) {

_tprintf(TEXT("Usage: %s [target_file]"), argv[0]);

return;

}

_tprintf (TEXT("Target file is %s"), argv[1]);

hFind = FindFirstFile(argv[1], &FindFileData);

// ... (其余代码)

}

```

当传入参数为“c:\bo<”时,程序成功访问到了booti文件。这展示了该漏洞的严重性。为了确保能够成功利用这个漏洞(即让“<”被替换成空字符),我们应当采用“<<”这样的组合。例如,在PHP中include语句里使用‘shell<<’可以实现在文件夹中按字母表排序后取第一个以shell开头的文件执行。

在PHP中调用FindFirstFile()函数时,需要注意一些特殊的字符替换规则。当遇到“>”字符时,它会被替换成“?”,这意味着我们可以利用这个特性来匹配任意单个字符。例如,在包含文件时,可以使用类似于“include('shell.p>p')”的语句,当存在多个以“shell.p”开头的文件时,这将会选择按字母表排序后的第一个文件。

FindFirstFile()函数在处理双引号(“”)时,会将其替换为点(.)。例如,“include('shell”php')”会被转换为“include('shell.php')”。如果文件名以点开头,那么在读取文件时可以忽略这个点。例如,“fopen('.htacess')”实际上会打开“htacess”文件。

在文件名末尾,可以添加一系列的正斜杠(/)或反斜杠(\),甚至可以在其间加入点字符。这种利用方式可能用于特定的路径操作或截断文件名。需要注意的是,当文件名包含共享网络路径时,例如以“\\”开头时,FindFirstFile()函数可以访问网络共享文件,但这可能需要较长的时间。如果共享名不存在,操作可能会额外耗费时间并可能触发错误。这种利用方式可以用于绕过某些安全设置,如allow_url_fopen=Off,并可能导致远程文件包含(RFI)。

除了这些基本规则,我们还可以利用系统保留名文件的特性来进行一些操作。例如,在某些情况下,可以通过访问特定文件来读取或写入系统文件。在PHP的命令行环境下(php.exe),这些操作可能会更加有效。例如,“file_get_contents('C:/booti')”可以用来读取系统启动配置文件。需要注意的是这些操作可能会对系统安全构成威胁,因此在使用时需要谨慎。

我们还可以采用一些更深入的方法绕过WAF(Web应用防火墙)或文件名过滤。例如,在某些情况下,可以通过特定的URL构造方式来绕过安全机制。这些技术涉及到一些复杂的操作和策略,需要结合具体的情况进行使用和分析。深入理解和运用这些方法需要我们具备丰富的知识和经验。在进行这些操作时需要注意安全和风险问题并遵守相关法律法规和道德准则以避免不良后果的发生。此外在实际应用中还需要注意防范潜在的漏洞和攻击防止系统遭受损失或滥用风险同时保障数据安全和用户隐私保护始终是我们的首要任务之一总之通过实验和分析我们可以更好地理解和掌握PHP中的相关技术和原理以便更好地应用于实际场景并为网络安全贡献一份力量同时还需要我们关注系统的底层逻辑和细节以拓宽模糊测试的范畴并不断更新和完善IDS和IPS的规则以适应不断变化的安全环境总之PHP及其相关技术需要我们不断地和研究以便更好地服务于实际应用领域。在当下这个时代,我们必须以更加审慎的态度来构建更加严格的过滤规则,正如我们一直在努力做的那样。面对任重道远的挑战,我们精益求精,不断追求更高的标准。

这个问题源自基础应用层面,让我们不得不思考类似的问题是否会在其他web应用中浮现。为此,我们对mysql5进行了测试,实验结果显示,mysql5并未出现此类漏洞。我们依然持谨慎态度,预测类似的安全漏洞可能会在诸如Perl、Python、Ruby等解释性语言的应用中出现。

关于PHP应用程序源代码审核高级技术,你可以访问以下链接获取更多信息:<

值得一提的是,一篇名为「快速利用2blind SQL注入技术」的论文:<

值得注意的是,这篇原文是2011年底发表的一篇白皮书。尽管时间已经过去许久,但至今这个bug依然存在。几个月前,我在参加CUIT的一个CTF活动时,遇到了一道关于这个bug的利用题。当时只是粗略地阅读了一下,并编写了一个php脚本进行目录扫描。如今,我重新翻译并整理了这篇文章,希望能对大家有所启示和帮助。

面对不断演变的安全挑战,我们需要保持警惕,持续学习,不断提升自己的技能知识,以确保web应用的安全性。这是一个永无止境的过程,但我们的目标是构建一个更加安全的网络环境。

上一篇:JBuilder2005实战JSP之切换控制 图文步骤 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by