1. 环境准备与调试技巧
要深入分析GeoServer的漏洞,第一步就是把环境给搭起来。这可不是简单地下载一个安装包点下一步就完事了,里面有不少门道。我自己在复现这些历史漏洞时,踩的第一个坑就是版本选择。GeoServer的版本迭代很快,不同版本间的功能、依赖甚至漏洞的触发条件都可能不一样。比如,CVE-2023-25157这个SQL注入漏洞,影响的是特定版本范围,你如果装了个打了补丁的新版本,那怎么折腾也复现不出来。
所以,我的习惯是先去官网的下载页面,根据漏洞通告里提到的版本号,找到对应的历史版本。比如要复现2.22.x系列的漏洞,就老老实实下载 geoserver-2.22.1-bin.zip。下载后解压,进入 bin 目录,你会看到 startup.sh(Linux/macOS)或 startup.bat(Windows)。直接运行它,GeoServer就会以Jetty嵌入式服务器的方式启动。默认的访问地址是 http://localhost:8080/geoserver,管理员账号密码是 admin/geoserver。这里有个小细节,如果你打算进行代码调试,直接启动是不行的,需要修改启动脚本。
打开 startup.sh,找到最后那行执行Java命令的地方。我们需要添加JVM的调试参数。对于JDK 8及以上版本,可以加上 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005。这个参数的意思是启用JPDA调试,监听5005端口,并且不挂起启动(suspend=n),这样服务启动后你就能用IDE(比如IntelliJ IDEA或Eclipse)附加(Attach)上去进行调试了。改完后的命令大概长这样:
exec "${_RUNJAVA}" ${JAVA_OPTS:--DNoJavaOpts -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005} ...(后面原有参数不变)
重启GeoServer,看到日志里出现类似“Listening for transport dt_socket at address: 5005”的字样,就说明调试端口开启成功了。
接下来是数据库环境。很多GeoServer漏洞,尤其是SQL注入类,都和PostGIS数据存储有关。PostGIS是PostgreSQL的空间数据库扩展。用Docker来搭建是最方便的。拉取一个合适版本的PostgreSQL镜像,比如 postgres:14,然后运行容器并安装PostGIS扩展:
docker pull postgres:14
docker run --name geoserver-pg -e POSTGRES_PASSWORD=yourpassword -p 5432:5432 -d postgres:14
docker exec -it geoserver-pg bash
# 进入容器后
apt-get update && apt-get install -y postgis postgresql-14-postgis-3
安装完成后,连接到数据库,创建扩展:
psql -U postgres
CREATE EXTENSION postgis;
这一步非常关键,没有这个扩展,后续创建PostGIS数据存储时会失败,漏洞复现也就无从谈起。我刚开始就忘了装,一直报 function postgis_lib_version() does not exist 的错误,排查了好久。
1.1 两种部署方式的差异与利用影响
这里必须提一个很多新手会忽略的重点:GeoServer的部署方式直接影响漏洞利用的最终效果。主要有两种方式:第一种就是我们刚才用的,运行官方发行版里的启动脚本(startup.sh),它内置的是 Jetty 服务器。第二种是把GeoServer的WAR包(geoserver.war)部署到外部的 Tomcat 服务器里。
这两种方式在漏洞利用上有什么区别呢?最大的区别在于文件上传漏洞的利用。如果漏洞允许你上传一个文件到服务器可访问的路径,比如Web根目录。在Tomcat下,你上传一个JSP格式的Webshell(比如冰蝎或哥斯拉的马),直接访问这个JSP路径就能执行命令。因为Tomcat天生就能解析和执行JSP文件。
但是,Jetty默认不包


387

被折叠的 条评论
为什么被折叠?



