menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right ... chevron_right 微擎 0.8 后台任意文件删除 chevron_right 微擎 0.8 后台任意文件删除.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    微擎 0.8 后台任意文件删除.md
    4.02 KB / 2021-07-15 20:13:49
        微擎 0.8 后台任意文件删除
    =========================
    
    一、漏洞简介
    ------------
    
    二、漏洞影响
    ------------
    
    微擎 0.8
    
    三、复现过程
    ------------
    
    漏洞入口文件为 web/source/site/category.ctrl.php ,我们可以看到下图 14行
    处调用了 file\_delete
    函数,而这是一个文件删除相关操作,我们可以看一下该函数的具体定义。下图是入口文件代码:
    
    ![1.png](./resource/微擎0.8后台任意文件删除/media/rId24.png)
    
    file\_delete 这一函数可以在 framework/function/file.func.php
    文件中找到,该方法功能用于检测文件是否存在,如果存在,则删除文件。但是查看上下文发现,程序并没有对文件名
    \$file 变量进行过滤,所以文件名就可以存在类似 ../
    这种字符,这样也就引发任意文件删除漏洞,file\_delete 函数代码如下:
    
    ![2.png](./resource/微擎0.8后台任意文件删除/media/rId25.png)
    
    现在我们在回溯回去,看看 \$file 变量从何处来。实际上,上图的 \$file
    变量对应的是 \$row\[\'icon\'\] 的值,也就是说如果我们可以控制
    \$row\[\'icon\'\] 的值,就可以删除任意文件。那么我们来看看 \$row
    变量从何而来。该变量就在我们刚刚分析的第一张图片中(
    web/source/site/category.ctrl.php 文件),该值为变量 \$navs
    中的元素值,具体代码如下:
    
    ![3.png](./resource/微擎0.8后台任意文件删除/media/rId26.png)
    
    我们再往上看,即可找到 \$navs 变量的取值情况。可以看到 \$navs
    变量的是是重数据库 site\_nav 表中取出的,包含了 icon 和 id
    两个字段,具体代码如下:
    
        $navs = pdo_fetchall("SELECT icon, id FROM ".tablename('site_nav')." WHERE id IN (SELECT nid FROM ".tablename('site_category')." WHERE id = {$id} OR parentid = '$id')", array(), 'id');
    
    现在我们要做的,就是找找看数据库中的这两个字段是否可以被用户控制。我们继续往前查找,发现了如下代码:
    
    ![4.png](./resource/微擎0.8后台任意文件删除/media/rId27.png)
    
    site\_nav 表中的数据,对应的是 \$nav 变量。我们继续往上寻找 \$nav
    变量,发现 \$nav\[\'icon\'\] 变量是从 \$\_GPC\[\'iconfile\'\]
    来的,即可被用户控制( 下图 第21行 )。这里的 \$nav\[\'icon\'\]
    变量,其实就是我们文章开头分析的传入 file\_delete
    函数的参数,具体代码如下:
    
    ![5.png](./resource/微擎0.8后台任意文件删除/media/rId28.png)由于 \$nav\[\'icon\'\]
    变量可被用户控制,程序有没有对其进行消毒处理,直接就传入了 file\_delete
    函数,最终导致了文件删除漏洞。至此,我们分析完了整个漏洞的发生过程,接下看看如何进行攻击。
    
    \#\#漏洞验证
    
    访问url,点击管理公众号:
    
        http://www.0-sec.org/web/index.php?c=account&a=display
    
    ![6.jpg](./resource/微擎0.8后台任意文件删除/media/rId29.jpg)
    
    找到分类设置,点击添加文章分类。这里对应的url为:http://www.0-sec.org/web/index.php?c=site&a=category,实际上表示
    site 控制器的 category 模块,即对应 category.ctrl.php 文件。
    
    ![7.jpg](./resource/微擎0.8后台任意文件删除/media/rId30.jpg)
    
    选择对应的内容,进入 if(\$isnav) 判断:
    
    ![8.jpg](./resource/微擎0.8后台任意文件删除/media/rId31.jpg)
    
    在上传图标位置输入要删除文件的路径
    
    ![9.jpg](./resource/微擎0.8后台任意文件删除/media/rId32.jpg)
    
    我们建立 delete.txt 文件,用于测试任意文件删除:
    
    ![10.jpg](./resource/微擎0.8后台任意文件删除/media/rId33.jpg)
    
    ![11.jpg](./resource/微擎0.8后台任意文件删除/media/rId34.jpg)
    
    我们点击删除时,就会调用 file\_delete
    函数,同时就会删除掉我们插入到数据库中的图片名:
    
    ![12.jpg](./resource/微擎0.8后台任意文件删除/media/rId35.jpg)
    
    这个类型任意文件删除有点类似于二次注入,在添加分类时先把要删除的文件名称插入到数据库中,然后点击删除分类时,会从数据库中取出要删除的文件名。
    
    
    links
    file_download