{"id":221,"date":"2025-05-21T19:47:27","date_gmt":"2025-05-21T19:47:27","guid":{"rendered":"https:\/\/fikresekhel.com\/blog\/?p=221"},"modified":"2025-05-22T16:09:08","modified_gmt":"2025-05-22T16:09:08","slug":"vulnerabilidade-em-api-rest-de-plugin-wordpress-criacao-de-usuario-administrador-sem-autenticacao","status":"publish","type":"post","link":"https:\/\/fikresekhel.com\/blog\/cybersecurity\/vulnerabilidade-em-api-rest-de-plugin-wordpress-criacao-de-usuario-administrador-sem-autenticacao\/","title":{"rendered":"Vulnerabilidade em API REST de Plugin WordPress: Cria\u00e7\u00e3o de Usu\u00e1rio Administrador sem Autentica\u00e7\u00e3o"},"content":{"rendered":"\n<p>O uso de APIs REST no desenvolvimento de plugins para WordPress trouxe diversas vantagens para integra\u00e7\u00f5es e expans\u00e3o de funcionalidades. No entanto, a m\u00e1 implementa\u00e7\u00e3o de autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o pode introduzir vulnerabilidades cr\u00edticas. Neste artigo, analisamos uma vulnerabilidade comum e extremamente grave em APIs REST de plugins, onde a aus\u00eancia de verifica\u00e7\u00e3o de permiss\u00f5es permite que qualquer pessoa, mesmo sem estar autenticada, crie um usu\u00e1rio administrador no site.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Descri\u00e7\u00e3o da Vulnerabilidade<\/h2>\n\n\n\n<p>A falha consiste na exposi\u00e7\u00e3o de um endpoint da API REST sem qualquer controle de autentica\u00e7\u00e3o. Isso ocorre devido ao uso incorreto do par\u00e2metro <code>permission_callback<\/code> no momento do registro da rota da API. Quando este par\u00e2metro \u00e9 definido como <code>__return_true<\/code>, o endpoint se torna acess\u00edvel publicamente para qualquer requisi\u00e7\u00e3o, sem exigir que o solicitante esteja logado ou possua qualquer n\u00edvel de permiss\u00e3o.<\/p>\n\n\n\n<p>O endpoint analisado permite a cria\u00e7\u00e3o de usu\u00e1rios no sistema. No entanto, al\u00e9m de criar usu\u00e1rios, ele os cadastra diretamente com a fun\u00e7\u00e3o de administrador, o que oferece controle total do site ao atacante.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Detalhes T\u00e9cnicos<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Registro do Endpoint Vulner\u00e1vel<\/h3>\n\n\n\n<p>O c\u00f3digo abaixo ilustra como o plugin vulner\u00e1vel registra a rota na API REST:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">phpCopiarEditar<code>add_action( 'rest_api_init', function () {\n    register_rest_route( 'vapi\/v1', '\/create-user\/', array(\n        'methods'  =&gt; 'POST',\n        'callback' =&gt; 'vapi_create_user_callback',\n        'permission_callback' =&gt; '__return_true', \/\/ Acesso p\u00fablico sem restri\u00e7\u00e3o\n    ));\n});\n<\/code><\/pre>\n\n\n\n<p>A fun\u00e7\u00e3o <code>__return_true<\/code> \u00e9 um atalho no WordPress que retorna sempre &#8220;true&#8221;, o que significa que qualquer pessoa tem permiss\u00e3o para acessar esse endpoint.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fun\u00e7\u00e3o Callback Vulner\u00e1vel<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">phpCopiarEditar<code>function vapi_create_user_callback( $request ) {\n    $username = sanitize_text_field( $request-&gt;get_param('username') );\n    $password = sanitize_text_field( $request-&gt;get_param('password') );\n    $email    = sanitize_email( $request-&gt;get_param('email') );\n\n    if ( username_exists( $username ) || email_exists( $email ) ) {\n        return new WP_Error( 'user_exists', 'Usu\u00e1rio ou e-mail j\u00e1 existe.', array( 'status' =&gt; 400 ) );\n    }\n\n    $user_id = wp_create_user( $username, $password, $email );\n    if ( is_wp_error( $user_id ) ) {\n        return new WP_Error( 'create_failed', 'Erro ao criar usu\u00e1rio.', array( 'status' =&gt; 500 ) );\n    }\n\n    $user = new WP_User( $user_id );\n    $user-&gt;set_role( 'administrator' );\n\n    return array(\n        'success' =&gt; true,\n        'user_id' =&gt; $user_id,\n        'message' =&gt; 'Usu\u00e1rio administrador criado com sucesso!'\n    );\n}\n<\/code><\/pre>\n\n\n\n<p>Este c\u00f3digo executa a cria\u00e7\u00e3o de um usu\u00e1rio e, sem qualquer verifica\u00e7\u00e3o de privil\u00e9gios, atribui imediatamente o papel de administrador.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Demonstra\u00e7\u00e3o do Ataque<\/h2>\n\n\n\n<p>A explora\u00e7\u00e3o \u00e9 extremamente simples e pode ser realizada com uma \u00fanica requisi\u00e7\u00e3o HTTP POST.<\/p>\n\n\n\n<p>Exemplo usando <code>curl<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">rubyCopiarEditar<code>curl -X POST http:\/\/localhost\/wordpress\/wp-json\/vapi\/v1\/create-user\/ \\\n-d \"username=hacker\" \\\n-d \"password=senha123\" \\\n-d \"email=hacker@exemplo.com\"\n<\/code><\/pre>\n\n\n\n<p>Resposta da API:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">jsonCopiarEditar<code>{\"success\":true,\"user_id\":2,\"message\":\"Usu\u00e1rio administrador criado com sucesso!\"}\n<\/code><\/pre>\n\n\n\n<p>Ap\u00f3s executar esse comando, o usu\u00e1rio &#8220;hacker&#8221; com permiss\u00f5es de administrador est\u00e1 criado no site WordPress.<\/p>\n\n\n\n<p>Assista o video demonstra\u00e7\u00e3o:<br><\/p>\n\n\n\n<figure class=\"wp-block-video\"><\/figure>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"954\" style=\"aspect-ratio: 1884 \/ 954;\" width=\"1884\" controls src=\"https:\/\/fikresekhel.com\/blog\/wp-content\/uploads\/2025\/05\/vulnerable-api.mp4\"><\/video><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Impacto<\/h2>\n\n\n\n<p>O impacto dessa vulnerabilidade \u00e9 cr\u00edtico. Um atacante pode:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Obter acesso total ao painel administrativo do WordPress.<\/li>\n\n\n\n<li>Inserir backdoors, malwares ou shells no servidor.<\/li>\n\n\n\n<li>Alterar ou deletar conte\u00fado do site.<\/li>\n\n\n\n<li>Modificar configura\u00e7\u00f5es, alterar DNS, derrubar o site ou distribuir c\u00f3digos maliciosos.<\/li>\n\n\n\n<li>Comprometer dados de usu\u00e1rios e clientes.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Causa Raiz<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Uso incorreto de <code>permission_callback<\/code>, permitindo acesso irrestrito.<\/li>\n\n\n\n<li>Aus\u00eancia total de verifica\u00e7\u00e3o de autentica\u00e7\u00e3o.<\/li>\n\n\n\n<li>Falta de valida\u00e7\u00e3o de privil\u00e9gios para a cria\u00e7\u00e3o de usu\u00e1rios com fun\u00e7\u00f5es elevadas.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Corre\u00e7\u00e3o<\/h2>\n\n\n\n<p>A corre\u00e7\u00e3o adequada exige duas medidas principais:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Implementar verifica\u00e7\u00e3o de autentica\u00e7\u00e3o no <code>permission_callback<\/code>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">phpCopiarEditar<code>'permission_callback' =&gt; function () {\n    return current_user_can( 'create_users' );\n}\n<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Realizar uma checagem extra dentro da fun\u00e7\u00e3o callback, caso necess\u00e1rio, refor\u00e7ando a seguran\u00e7a:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">phpCopiarEditar<code>if ( ! current_user_can( 'create_users' ) ) {\n    return new WP_Error( 'forbidden', 'Voc\u00ea n\u00e3o tem permiss\u00e3o para executar esta a\u00e7\u00e3o.', array( 'status' =&gt; 403 ) );\n}\n<\/code><\/pre>\n\n\n\n<p>Essas medidas garantem que apenas usu\u00e1rios devidamente autenticados e com privil\u00e9gios administrativos possam acessar e executar a funcionalidade.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Li\u00e7\u00f5es e Boas Pr\u00e1ticas<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Nunca exponha endpoints sem autentica\u00e7\u00e3o ou verifica\u00e7\u00e3o de permiss\u00f5es.<\/li>\n\n\n\n<li>Sempre valide as fun\u00e7\u00f5es do usu\u00e1rio com <code>current_user_can()<\/code> ao executar a\u00e7\u00f5es sens\u00edveis.<\/li>\n\n\n\n<li>Revise cuidadosamente o uso do par\u00e2metro <code>permission_callback<\/code> nas rotas da API REST.<\/li>\n\n\n\n<li>Realize testes de seguran\u00e7a em APIs e endpoints, mesmo em ambientes internos ou controlados.<\/li>\n\n\n\n<li>Acompanhe refer\u00eancias como OWASP API Security Top 10, que aborda as falhas mais comuns em APIs.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Concluindo<\/h2>\n\n\n\n<p>As APIs REST oferecem poderosas possibilidades para desenvolvimento em WordPress, mas tamb\u00e9m podem se tornar vetores cr\u00edticos de ataque quando mal implementadas. A vulnerabilidade analisada aqui demonstra de forma clara como uma falha simples pode comprometer completamente a seguran\u00e7a de um site. Seguran\u00e7a n\u00e3o deve ser tratada como um item opcional no desenvolvimento. \u00c9 uma obriga\u00e7\u00e3o.<\/p>\n\n\n\n<p>Se voc\u00ea ou sua empresa utilizam WordPress e dependem de plugins que exp\u00f5em APIs, \u00e9 essencial realizar auditorias regulares, implementar pr\u00e1ticas de desenvolvimento seguro e monitorar continuamente poss\u00edveis pontos de falha.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>O uso de APIs REST no desenvolvimento de [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":222,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,10,27,32],"tags":[],"class_list":["post-221","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cybersecurity","category-secure-coding","category-treinamento","category-wordpress"],"_links":{"self":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/221","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/comments?post=221"}],"version-history":[{"count":2,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/221\/revisions"}],"predecessor-version":[{"id":230,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/221\/revisions\/230"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media\/222"}],"wp:attachment":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media?parent=221"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/categories?post=221"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/tags?post=221"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}