A Dockerized Flask web application that serves a blog about llamas and includes a search feature. The README states it is intentionally vulnerable to Server-Side Template Injection (SSTI) and was created for a CTF competition.
README.md:2-3Dockerfile:1-15
Lab assessment
Vulnerability lab
The README explicitly states the project is vulnerable to SSTI (CVE-2019-8341) and was created for a CTF competition. The source code contains a Flask endpoint that uses render_template_string on user input, which is a classic SSTI vulnerability.
A Python Flask app that serves static content and a search endpoint. The /search route takes user input from a POST form, passes it to render_template_string without sanitization, enabling SSTI. It also serves a flag file at /app/flag.txt, which is likely the CTF objective.
src/server.py:1-71Dockerfile:8
Docker environment
containerizationlab boundary
A Dockerfile based on python:3.9 that copies the application source, requirements, and flag file into /app, installs dependencies from local wheels, exposes port 5656, and runs the Flask server.
Dockerfile:1-15
Build and run script
convenience script
A shell script that builds the Docker image and runs a container with port 5656 mapped to the host.
build_run.sh:1
CVE assessment
How the supplied evidence relates each vulnerability
The README states the project is vulnerable to CVE-2019-8341, which is a disputed Jinja2 SSTI vulnerability. The code uses render_template_string on user-controlled input (query) without sanitization, matching the described vulnerability.
README.md:2-3src/server.py:20-26
Exercise context
Requirements and sequence described by the evidence
Prerequisites
Docker engine installed and running.README.md:8
Build the Docker image and run the container with port mapping.README.md:10
Evidence-described exercise path
Navigate to http://localhost:5656.README.md:12
Use the search form to submit a payload that exploits the SSTI vulnerability in the /search endpoint.src/server.py:20-26src/content/home.html:40-50
Retrieve the flag from /app/flag.txt using SSTI to read the file.Dockerfile:8flag.txt:1
Safety-review evidence
Behaviors behind the stored safety assessment
No harmful behavior observed
The visible behavior is limited to a Flask application serving a CTF challenge. The Dockerfile copies only local files, installs dependencies from local wheels, and exposes a single port. No evidence of host escape, external connections, persistence, credential theft, or destructive actions. The port mapping and flag file are consistent with a contained lab exercise.
Dockerfile:1-15src/server.py:1-71build_run.sh:1
Review boundaries
What the analysis did not establish
9 binary files are uninspected, including .tar.gz archives and image files; their contents are not analyzed.
4 oversized source files (click, Flask, Jinja2, Werkzeug) are omitted and uninspected.
The writeup.md file is listed in the file inventory but its content is not included in evidence_files.
The Dockerfile uses --no-index and local wheels, but the contents of those wheels are not fully inspected.
Model interpretation
This review is limited to the supplied lab evidence packet. It does not assert that the environment runs, reproduces a vulnerability, or is safe to execute. Contract: eip-docker-lab-analysis-v1.
Packet coverage: some source evidence omitted · 9 binary files not inspected