Mtab书签导航程序 SQL注入漏洞

本文分析了Mtab书签导航程序 SQL注入漏洞的原因以及拓展

Mtab书签导航程序 SQL注入漏洞

一、漏洞简介

1.1 产品介绍

Mtab书签导航程序 - 免费无广告的浏览器书签助手,多端同步、美观易用的在 线导航和书签工具,自主研发免费使用,帮助您高效管理 网页和应用,提升在线体验。

1.2 漏洞简介

Mtab书签导航程序 LinkStore/getIcon 接口存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

二、影响版本

version <= 2.1.0(最新版)

三、漏洞原理分析

这个是开源应用,github.com上找到对应的应用源码

https://github.com/tsxcw/mtab

通过./public下面的index.php以及route.php可以判断出是使用thinkphp框架编写的,我们可以找到路由的配置

image.png

image.png

所以从漏洞的路由/LinkStore/getIcon 找到对应的漏洞源码在./controller/LinkStore.php中

image.png

   public function getIcon(): \think\response\Json //定义了一个名为 getIcon 的方法,返回类型Json{
        $url = $this->request->post('url', false); // 从POST请求中获取名为 url 的参数,如果不存在则返回 false。
        if ($url) { //检查 url 是否存在,如果存在则继续执行。
            if (mb_substr($url, 0, 4) == 'tab:') { //检查 url 是否以 tab: 开头,如果是,则进入该分支(此处为空),否则进入 else 分支
            } else {
                if (mb_substr($url, 0, 4) != 'http') { //检查 url 是否以 http 开头,如果不是,则在前面加上 https://。
                    $url = 'https://' . $url;
                }
                $url = parse_url($url); //使用 parse_url 解析 url,将其分解为不同的组件。
                $url = $url['host']; //只要url中的host
            }
            $data = LinkStoreModel::whereRaw("FIND_IN_SET('$url',domain)")->find(); //执行原始查询,查找域名包含 url 的记录
            if ($data) {
                return $this->success('ok', $data); //返回查询到的数据
            }
        }
        return $this->error('no', '未查询到相关信息');
    }

解析完这个段函数后,可以看到造成sql注入的语句其实就是

LinkStoreModel::whereRaw("FIND_IN_SET('$url',domain)")->find();

那么我们仔细分析这句语句

LinkStoreModel 是一个继承自 ThinkPHP 框架中的 think\Model 类的模型类,用于与数据库中的 linkstore 表进行交互。通过继承 think\Model,它可以利用 ThinkPHP 提供的各种模型功能,如 CRUD 操作和关联关系定义。

image.png

image.png
FIND_IN_SET 是 MySQL 中的一个字符串函数,用于在一个以逗号分隔的字符串列表中查找一个特定的字符串。它的作用是检查某个字符串是否存在于由逗号分隔的字符串集合中,并返回字符串的位置索引。

whereRaw 的意思是允许直接在 SQL 查询中插入原始的 SQL 语句。它不会对传入的 SQL 语句进行任何额外的处理或转义,所以使用这个函数会造成sql注入。

这样的thinkphp框架查询语句我们也能翻译成如下的sql,url为我们可控制点

SELECT * FROM linkstore WHERE FIND_IN_SET('url', domain);

那么就可以构造报错注入的payload

1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1

==>

SELECT * FROM linkstore WHERE FIND_IN_SET('1' and updatexml(1,concat(0x7e,(select database()),0x7e),1) and '1'='1', domain);

四、环境搭建

4.1 源码部署

安装宝塔面板或phpstudy进行部署   https://www.bt.cn/new/download.html

image.png

image.png
安装完毕后,访问后台,部署需要的中间件环境,如php7.4 mysql、nginx、redis等

image.png

新增站点,上传github下载的源码,然后访问安装即可

image.png

4.2 Docker 部署

可参考github上作者给出的部署步骤与部署视频

镜像: itushan/mtab

视频教程: https://www.bilibili.com/video/BV1ee411B7fY/

部署命令: docker run -itd --name mtab -p 9200:80 -v /opt/mtab:/app itushan/mtab

4.3 docker-compose 部署

创建docker-compose.yml,然后安装的目录执行docker-compose up -d即可

version: '3'
services:
  mtabServer:
    image: itushan/mtab
    container_name: mtabServer
    user: "${USER_ID}:${GROUP_ID}"
    ports:
      - "9200:80"
    volumes:
      - ./:/app
    restart: always

五、漏洞复现

5.1 FOFA 指纹

title="Mtab书签"

image.png

5.2 报错注入复现

image.png

六、总结与拓展

回顾此漏洞,用户输入的参数未校验然后带入thinkphp的orm框架的whereRaw方法导致

“如果看到一只蟑螂,意味着可能还有更多蟑螂在你看不到的地方。”

如果我们全局搜索whereRaw看看有没有同类型的问题,可能会有意想不到的收获

image.png

image.png

  • 发表于 2024-08-28 09:50:34
  • 阅读 ( 4133 )
  • 分类:CMS

0 条评论

请先 登录 后评论
chenshiyi
chenshiyi

1 篇文章

站长统计