{"id":2825,"date":"2023-07-04T15:34:40","date_gmt":"2023-07-04T13:34:40","guid":{"rendered":"https:\/\/mikadmin.fr\/blog\/?p=2825"},"modified":"2024-04-25T14:50:14","modified_gmt":"2024-04-25T12:50:14","slug":"cve-2023-34020-unauthenticated-open-redirect","status":"publish","type":"post","link":"https:\/\/mikadmin.fr\/blog\/cve-2023-34020-unauthenticated-open-redirect\/","title":{"rendered":"[CVE-2023-34020] Unauthenticated Open Redirect"},"content":{"rendered":"<span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\"><\/span> <span class=\"rt-time\"> 3<\/span> <span class=\"rt-label rt-postfix\">min read<\/span><\/span><p>Views: 453<\/p>\n<div style=\"height:27px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-4.png\" alt=\"open redirect\" class=\"wp-image-2851\" width=\"840\" height=\"410\" srcset=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-4.png 956w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-4-300x147.png 300w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-4-150x73.png 150w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-4-768x375.png 768w\" sizes=\"auto, (max-width: 840px) 100vw, 840px\" \/><\/figure>\n\n\n\n<p class=\"has-text-align-center\"><strong>Patchstack<\/strong> : <a href=\"https:\/\/patchstack.com\/database\/vulnerability\/uncanny-learndash-toolkit\/wordpress-uncanny-toolkit-for-learndash-plugin-3-6-4-3-open-redirection-vulnerability\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/patchstack.com\/database\/vulnerability\/uncanny-learndash-toolkit\/wordpress-uncanny-toolkit-for-learndash-plugin-3-6-4-3-open-redirection-vulnerability<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">Introduction :<\/h1>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\"> La <strong>s\u00e9curit\u00e9<\/strong> est primordiale lorsqu&rsquo;il s&rsquo;agit de maintenir un site <a href=\"https:\/\/wordpress.org\/\" target=\"_blank\" rel=\"noopener\" title=\"\">WordPress<\/a>. Les <a href=\"https:\/\/mikadmin.fr\/blog\/my-first-cve-wordpress-plugin\/\" target=\"_blank\" rel=\"noopener\" title=\"\">plugins<\/a> jouent un r\u00f4le crucial dans l&rsquo;am\u00e9lioration des fonctionnalit\u00e9s, mais ils peuvent \u00e9galement introduire des <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">vuln\u00e9rabilit\u00e9s<\/mark><\/strong> s&rsquo;ils ne sont pas d\u00e9velopp\u00e9s et entretenus correctement. Dans cet article, nous allons explorer un cas r\u00e9el d&rsquo;une <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">vuln\u00e9rabilit\u00e9<\/mark><\/strong> que j&rsquo;ai <a href=\"https:\/\/mikadmin.fr\/blog\/cve-disclosures\/\" target=\"_blank\" rel=\"noopener\" title=\"\">trouv\u00e9<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">Open redirect :<\/h1>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\"><a href=\"https:\/\/brightsec.com\/blog\/open-redirect-vulnerabilities\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Open Redirect<\/a>, est une faille de s\u00e9curit\u00e9 qui permet \u00e0 des individus malveillants de d\u00e9tourner les m\u00e9canismes de <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">redirection<\/mark><\/strong> d&rsquo;un site web afin de <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">rediriger les utilisateurs<\/mark><\/strong> vers des destinations non autoris\u00e9es. Cette <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">vuln\u00e9rabilit\u00e9<\/mark><\/strong> survient lorsque l&rsquo;application web accepte des URL externes ou des param\u00e8tres de redirection sans effectuer de validation ad\u00e9quate.<\/p>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\">Un attaquant pourrait manipuler le lien en y ins\u00e9rant une <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">URL malveillante<\/mark><\/strong>. Lorsque l&rsquo;utilisateur clique sur ce lien, il est alors redirig\u00e9 vers un <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">site web malveillant<\/mark><\/strong>, sans se rendre compte de la manipulation en cours.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"600\" height=\"320\" src=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image.png\" alt=\"open redirect\" class=\"wp-image-2836\" srcset=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image.png 600w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-300x160.png 300w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-150x80.png 150w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">Analyse du code : <\/h1>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\">Ce code permet d&rsquo;enregistrer un point <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">endpoint<\/mark><\/strong> pour une<strong> API dans WordPress<\/strong>. Lorsqu&rsquo;un utilisateur envoie une requ\u00eate GET \u00e0 l&rsquo;URL \u00ab\u00a0<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">http:\/\/target.com\/?rest_route=\/ult\/v2\/review-banner-visibility<\/mark><\/strong>\u00ab\u00a0, la fonction \u00ab\u00a0<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">save_review_settings()<\/mark><\/strong>\u00a0\u00bb sera ex\u00e9cut\u00e9e pour traiter cette requ\u00eate sp\u00e9cifique. Il n&rsquo;y a pas de restrictions de permission, ce qui signifie que tous les utilisateurs sont autoris\u00e9s \u00e0 acc\u00e9der \u00e0 cet <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\"><strong>endpoint<\/strong><\/mark>.<\/p>\n\n\n\n<div style=\"height:6px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">public function uo_register_api() {\n\t\tregister_rest_route(\n\t\t\tUNCANNY_TOOLKIT_REST_API_END_POINT,\n\t\t\t&#039;\/review-banner-visibility\/&#039;,\n\t\t\tarray(\n\t\t\t\t&#039;methods&#039;             =&gt; &#039;GET&#039;,\n\t\t\t\t&#039;callback&#039;            =&gt; array( $this, &#039;save_review_settings&#039; ),\n\t\t\t\t&#039;permission_callback&#039; =&gt; &#039;__return_true&#039;,\n\t\t\t)\n\t\t);\n\t}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">Le code vuln\u00e9rable : <\/h1>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\">La vuln\u00e9rabilit\u00e9 r\u00e9sidait dans la fonction <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">save_review_settings()<\/mark><\/strong> et dans l&rsquo;utilisation directe du param\u00e8tre <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">redirect_url<\/mark> <\/strong>dans la fonction <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">wp_redirect()<\/mark><\/strong>. Cela permettait aux attaquants de manipuler le param\u00e8tre <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">redirect_url<\/mark><\/strong> et de rediriger les utilisateurs vers n&rsquo;importe quel site Web de leur choix, pouvant contenir du contenu malveillant ou des activit\u00e9s frauduleuses.<\/p>\n\n\n\n<div style=\"height:6px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-php\" data-line=\"\">public function save_review_settings( $request ) {\n\n\t\t\/\/ Check if its a valid request.\n\t\t$action = $request-&gt;get_param( &#039;action&#039; );\n\n\t\t$redirect = $request-&gt;get_param( &#039;redirect&#039; );\n\n\t\t$redirect_url = $request-&gt;get_param( &#039;redirect_url&#039; );\n\n\t\t$visiblity_actions = array( &#039;maybe-later&#039;, &#039;hide-forever&#039; );\n\n\t\t[REDACTED]\n\n\t\t\tif ( &#039;yes&#039; === $redirect ) {\n\n\t\t\t\t\/\/ Return the refering url if its empty.\n\t\t\t\tif ( empty( $redirect_url ) ) {\n\n\t\t\t\t\t$redirect_url = wp_get_referer();\n\n\t\t\t\t}\n\n\t\t\t\twp_redirect( $redirect_url ); \/\/phpcs:ignore WordPress.Security.SafeRedirect.wp_redirect_wp_redirect\n\n\t\t\t\texit;\n\n\t\t\t}\n        [REDACTED]<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:5px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">La preuve de concept (POC) : <\/h1>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\">Pour d\u00e9montrer la <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">vuln\u00e9rabilit\u00e9<\/mark><\/strong>, voici la requ\u00eate en int\u00e9gralit\u00e9 ainsi qu&rsquo;un screen montrant la requ\u00eate la r\u00e9ponse du serveur, nous sommes donc bien redirig\u00e9 vers <a href=\"https:\/\/mikadmin.fr\" target=\"_blank\" rel=\"noopener\" title=\"\">https:\/\/mikadmin.fr<\/a>.<\/p>\n\n\n\n<div style=\"height:6px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"\" data-line=\"\">http:\/\/target.com\/?rest_route=\/ult\/v2\/review-banner-visibility&amp;action=maybe-later&amp;redirect=yes&amp;redirect_url=https:\/\/mikadmin.fr<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"519\" src=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-6-1024x519.png\" alt=\"\" class=\"wp-image-2884\" srcset=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-6-1024x519.png 1024w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-6-300x152.png 300w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-6-150x76.png 150w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-6-768x390.png 768w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-6.png 1031w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div style=\"height:6px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">Protection et correctif :<\/h1>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\">Pour rem\u00e9dier \u00e0 cette vuln\u00e9rabilit\u00e9, il est crucial de s&rsquo;assurer que toutes les entr\u00e9es fournies par l&rsquo;utilisateur, y compris le param\u00e8tre <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">redirect_url<\/mark><\/strong>, subissent une validation et une <strong>sanitisation<\/strong> approfondies avant d&rsquo;\u00eatre utilis\u00e9es dans une redirection. WordPress propose des fonctions telles que <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">wp_validate_redirect()<\/mark><\/strong> ou <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">esc_url()<\/mark><\/strong> qui peuvent \u00eatre utilis\u00e9es pour valider et nettoyer les URL, r\u00e9duisant ainsi le risque d&rsquo;<strong>Open Redirect<\/strong>.<\/p>\n\n\n\n<div style=\"height:12px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size\">Voici le correctif propos\u00e9 par le plugin :<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-1.png\" alt=\"\" class=\"wp-image-2845\" width=\"596\" height=\"129\" srcset=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-1.png 448w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-1-300x65.png 300w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-1-150x32.png 150w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:12px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-2.png\" alt=\"\" class=\"wp-image-2846\" width=\"1153\" height=\"140\" srcset=\"https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-2.png 846w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-2-300x37.png 300w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-2-150x18.png 150w, https:\/\/mikadmin.fr\/blog\/wp-content\/uploads\/2023\/07\/image-2-768x94.png 768w\" sizes=\"auto, (max-width: 1153px) 100vw, 1153px\" \/><\/figure>\n<\/div>\n\n\n<div style=\"height:30px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p><span class=\"span-reading-time rt-reading-time\" style=\"display: block;\"><span class=\"rt-label rt-prefix\"><\/span> <span class=\"rt-time\"> 3<\/span> <span class=\"rt-label rt-postfix\">min read<\/span><\/span>Mika discovered and reported this Open Redirection. This could allow a malicious actor to redirect users from one site to the other due to the redirect URL not being validated. Users could be tricked to visiting a legitimate site to then be redirected to a malicious site and cause a phishing incident. This vulnerability has been fixed in version 3.6.4.4. <a href=\"https:\/\/mikadmin.fr\/blog\/cve-2023-34020-unauthenticated-open-redirect\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":2907,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[4],"tags":[64,76,5,84,83,45,10,75],"class_list":["post-2825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-infosec","tag-cve","tag-findings","tag-infosec","tag-open-redirect","tag-patchstack","tag-pentest","tag-security","tag-wordpress"],"aioseo_notices":[],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/posts\/2825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/comments?post=2825"}],"version-history":[{"count":1,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/posts\/2825\/revisions"}],"predecessor-version":[{"id":3112,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/posts\/2825\/revisions\/3112"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/media\/2907"}],"wp:attachment":[{"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/media?parent=2825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/categories?post=2825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikadmin.fr\/blog\/wp-json\/wp\/v2\/tags?post=2825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}