返回介绍

5.1.4 文件删除漏洞

发布于 2024-10-11 22:07:44 字数 1397 浏览 0 评论 0 收藏 0

文件删除漏洞出现在有文件管理功能的应用上比较多,这些应用一般也都有文件上传和读取等功能,它的漏洞原理跟文件读取漏洞是差不多的,不过是利用的函数不一样而已,一般也是因为删除的文件名可以用../跳转,或者没有限制当前用户只能删除他该有权限删除的文件。常出现这个漏洞的函数是 unlink(),不过老版本下 session_destroy() 函数也可以删除文件。

挖掘经验:

挖掘文件删除漏洞可以先去找相应的功能点,直接黑盒测试一下看能不能删除某个文件,如果删除不了,再去从执行流程去追提交的文件名参数的传递过程,这样查找起来比较精准。如果纯白盒挖的话,也可以去搜索带有变量参数的 unlink(),依然采用回溯变量的方式。关于 session_destroy() 函数删除任意文件的漏洞这里就不再举例了,因为在比较早的 PHP 版本就已经修复掉了这个问题,限制了 PHPSESSID 只能由“字母+数字+横杆”符号组成。

Metinfo 任意文件删除分析

这里的案例使用笔者之前发现的一个 metinfo 企业内容管理系统漏洞来说明,漏洞在 recovery.php 文件,代码如下:

if ( $action=='delete' ) {

   if ( is_array ( $filenames )) {

     foreach ( $filenames as $filename ) {

     if ( fileext ( $filename ) =='sql' ) {

    @unlink ( '../databack/'.$filename ); 

     }

    }

   }else{

     if ( fileext ( $filenames ) =='sql' ) {  $filenamearray=explode ( ".sql" , $filenames ); 

    @unlink ( '../../databack/'.$filenames ); 

       @unlink ( '../../databack/sql/metinfo_'.$filenamearray[0].".zip" ); 

     }else{

    // 如果不是 SQL 文件,直接删除 

     @unlink ( '../../databack/'.$fileon.'/'.$filenames ); 

    }

}

这段代码首先判断请求的 action 参数的值是不是 delete,如果是则进入文件删除功能,在代码:

if ( fileext ( $filenames ) =='sql' ) {

判断如果不是 sql 文件后,就直接在 databack 目录删除提交的文件名,代码中$filenames 函数从 GET 中提交,只要请求:

/recovery.php?&action=delete&filenames=../../index.php

即可删除 index.php 文件。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文