代码审计-(Ear Music).任意文件下载漏洞
0x01 代码分析
后台地址:192.168.5.176/admin.php
admin admin
安装后的界面

在后台发布了一首新歌后,前台点进去到一个“下载LRC歌词”功能点的时候发现是使用readfile()函数的(readfile() 函数输出一个文件)

文件位置:\template\default\source\down.php

代码很短,这里下载文件漏洞我们重点关注readfile函数和传递给这个函数的参数,也就是$file,可以看到file这个变量是由geturl和getfield这两个函数得到的,跟进下这两个函数
首先geturl()函数路为/source/system/function_common.php。

这里file是我们传入的文件地址,这里首先通过正则来匹配判断,但是当file不符合正则规则而时候就直接复制给$url变量,即你上传什么,这里就读什么,读取下载的时候未作任何过滤操作. 那我们这里就是要控制传给geturl这个函数的参数即可,那我们继续来看看geturl函数里这个getfield函数是干什么的

文件位置:/source/system/function_common.php 和geturl在一个文件里

那么这里可以看到,getfield这个函数主要是查询下载文件的地址的。
$sql = "select ".$target." from ".tname($table)." where ".$object."='".$search."'";

这里就是查询in_lyic这个字段的值,而这个字段的值就是歌词文件的地址。
那么再回到我们最初的down文件理一下,这里我们要控制$file变量造成任意文件下载就必须对getfield函数里查询出来的文件下载地址进行控制,这样才可以达到任意文件下载而不是下载正常的歌词文件。

那么这个歌词地址是必须有后台权限,在管理页面添加音乐的时候指定歌词的地址

那么我们现在需要看看,后台这里新增音乐的文件,对填入的歌词文件的地址是否有过滤和替换之类的操作,这时候我们就转向上传的地方看看。
POST /admin.php?iframe=music&action=saveadd HTTP/1.1 Host: 192.168.5.176 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded Content-Length: 186 Referer: http://192.168.5.176/admin.php?iframe=music&action=add Cookie: in_adminid=1; in_adminname=admin; in_adminpassword=c3284d0f94606de1fd2af172aba15bf3; in_permission=1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9 Connection: close Upgrade-Insecure-Requests: 1 in_name=1&in_color=&in_classid=2&in_specialid=0&in_uname=admin&in_singerid=0&in_best=0&in_grade=3&in_points=0&in_tag=1&in_audio=1&in_cover=1&in_lyric=1&in_text=1&form2=%E6%8F%90%E4%BA%A4

请求的是admin.php文件 那我们看看这个admin.php

$iframe = !empty($_GET['iframe']) && in_array($_GET['iframe'], $frames) ? $_GET['iframe'] : 'login';
include_once 'source/admincp/module/'.$iframe.'.php';
随后这两行 通过get方式接受的iframe参数,来决定包含的文件的地址,
我们上面点击新增歌曲的数据包接受的参数是iframe=music&action=saveadd ,
那我们继续跟进,看看'source/admincp/module/music.php文件是否有我们上传代码

可以看到文件开头有个通过SafeRequest函数接收action参数的,看看这个函数

这个函数只是对接收的参数进行trim、addslashes和htmlspecialchars等字符转义、实体转义等过滤,这种过滤一般都是可绕过的。
接着回到music.php 寻找上传的相关代码

在music.php文件里往下翻可以到通过switch语句来选择执行的函数。我们提交的参数是
POST /admin.php?iframe=music&action=saveadd HTTP/1.1
就是调用saveadd这个函数 ,往下翻找到这个函数

$in_lyric = checkrename(SafeRequest("in_lyric","post"), 'attachment/music/lyric');
可以看到这行是对我们填写的歌词地址进行操作,然后通过下面数据库insert语句将歌词地址写入数据库。我们还需要看看这个checkrename做了什么

可以看到这里的cheackrename函数就是对传入的地址进行正则匹配然后替换成统一目录,并没有对传入的地址字符串本身进行任何过滤和限制,也就是说我们可以写任意的地址,配合网站首页的下载漏洞就造成了任意文件下载漏洞。
0x02漏洞利用
比如config.inc.php文件的物理路径为:
C:\phpStudy\PHPTutorial\WWW\source\system\config.inc.php
由于”\”会被过滤可使用”/”替换绕过
综合起来最终的payload为:
C:/phpStudy/PHPTutorial/WWW/source/system/config.inc.php




代码审计-(Ear Music).任意文件下载漏洞的更多相关文章
- 【代码审计】ThinkSNS_V4 任意文件下载漏洞分析
0x00 环境准备 ThinkSNS官网:http://www.thinksns.com 网站源码版本:ThinkSNS V4 更新时间:2017-09-13 程序源码下载:http://www ...
- 代码审计之Finecms任意文件下载漏洞
PS:该漏洞已被公布,只是学习.故自己跟着大佬的步伐审计. 文件地址:\controllers\ApiController.php Line 57 public function downAction ...
- 【代码审计】XYHCMS V3.5任意文件下载漏洞分析
0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...
- 【代码审计】CLTPHP_v5.5.3后台任意文件下载漏洞分析
0x00 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chich ...
- 【代码审计】EasySNS_V1.6 前台任意文件下载漏洞分析
0x00 环境准备 EasySNS官网:http://www.imzaker.com/ 网站源码版本:EasySNS极简社区V1.60 程序源码下载:http://es.imzaker.com/i ...
- PHP代码审计笔记--任意文件下载漏洞
在文件下载操作中,文件名及路径由客户端传入的参数控制,并且未进行有效的过滤,导致用户可恶意下载任意文件. 0x01 客户端下载 常见于系统中存在文件(附件/文档等资源)下载的地方. 漏洞示例代码: ...
- 任意文件下载漏洞的接口URL构造分析与讨论
文件下载接口的URL构造分析与讨论 某学院的文件下载接口 http://www.****.edu.cn/item/filedown.asp?id=76749&Ext=rar&fname ...
- 代码审计-phpcms9.6.2任意文件下载漏洞
漏洞文件: phpcms\modules\content\down.php 1.在download函数中对文件的校验部分 首先 if(preg_match('/(php|phtml|php3|php4 ...
- ASP代码审计学习笔记 -5.文件下载漏洞
文件下载漏洞 漏洞代码: <% function download(f,n) on error resume next Set S=CreateObject("Adodb.Stream ...
随机推荐
- 内部类实例化Serializable
昨天在做一个java项目的时候,发现下面代码中红色字体那行总是报NotSerializableException,查错误,MyRectangle这个类也明明实现了Serializable接口. 花了大 ...
- 重学Java(一):与《Java编程思想》的不解之缘
说起来非常惭愧,我在 2008 年的时候就接触了 Java,但一直到现在(2018 年 10 月 10 日),基础知识依然非常薄弱.用一句话自嘲就是:十年 IT 老兵,Java 菜鸡一枚. 于是,我想 ...
- 松软科技课堂:SQL--RIGHTJOIN关键字
发布时间:2019/3/15 9:27:31 SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name ...
- RocksDB线程局部缓存
概述 在开发过程中,我们经常会遇到并发问题,解决并发问题通常的方法是加锁保护,比如常用的spinlock,mutex或者rwlock,当然也可以采用无锁编程,对实现要求就比较高了.对于任何一个共享变量 ...
- python解释器安装和变量配置
python解释器安装 第一步https://www.python.org/ 下载 python-3.6.6 和 python-2.7.16 俩个版本 Downloads 下 选windows版本 4 ...
- [Code] 变态之人键合一
目的也比较单纯,选一门语言,走向人键合一. 选了两本书作为操练场:<精通Python设计模式>.<Data Structure and Algorithm in Python> ...
- DOM之节点操作
DOM提供了很多实用的API,这些API让我们可以轻松的访问HTML文档.所谓API(应用程序接口),简单来说,就是让我们可以直接使用它访问程序的一些属性或方法,而不用了解程序内部的运作过程和原理. ...
- .Net Core WebApi(二)在Windows服务器上部署
上一篇学习到了如何简单的创建.Net Core Api和Swagger使用,既然写了接口,那么就需要部署到服务器上才能够正式使用.服务器主要用到了两种系统,Windows和Linux,.Net和Win ...
- 自己制作一个简单的操作系统二[CherryOS]
自己制作一个简单的操作系统二[CherryOS] 我的上一篇博客 自己制作一个简单的操作系统一[环境搭建], 详细介绍了制作所需的前期准备工作 一. 一点说明 这个操作系统只是第一步, 仅仅是开机显示 ...
- abp(net core)+easyui+efcore实现仓储管理系统——EasyUI之货物管理二 (二十)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...