Explorando XSS no sanitize_text_field do WordPress. Método que supostamente protegeria.

Sim, esse é o segundo post que eu falo sobre sanitize_text_field, alguma coisa está errada com esse método, ou com o que ele se diz que faz. Na documentação do WordPress diz “Sanitizes a string from user input or from the database.”. Ele supostamente te protegeria contra ataques de XSS, como seu nome deduz, “sanitize text filed”.

The last post we told that this method no protect you when have attacks using path traversal. You can check here.

Nós temos um caso real de um plugin WordPress que tenta limpa o campo value do input. E o resultado é que nós podemos quebrar esse método.

Exemplo real:

update_option('wpdb_dropbbox_dir', sanitize_text_field( $_POST['wpdb_dropbbox_dir'] );

Inserindo esse conteúdo no input você quebra o filtro.

" onmouseover=javascript:alert(1); test="

This image has an empty alt attribute; its file name is Screenshot-from-2019-05-31-10-46-49-1024x611.png

Com esse código nós inserimos um comando de quando a pessoa passar o ponteiro do mouse no field ele executa o comando.

This image has an empty alt attribute; its file name is Screenshot-from-2019-04-13-19-04-20-1024x606.png

Vídeo:

Antes de inserir o código malicioso.

<input type="text" id="wpdb_dest_amazon_s3_bucket" class="form-control" name="wpdb_dest_amazon_s3_bucket" value="test" size="25" placeholder="Buket name" >

Depois de inserir o código malicioso.

<input type="text" id="wpdb_dest_amazon_s3_bucket" class="form-control" name="wpdb_dest_amazon_s3_bucket" value="\" onmouseover="javascript:alert(1);" \"="" test="\""" size="25" placeholder="Buket name" >

Mas como podemos fazer isso?

Eu vou explicar esse caso real em outro post.

Mas o real problema é que ele faz muitas verificações mas apenas se a string vier com a tag ‘<‘.

Mas não necessitamos de inserir o ‘<‘ para ter sucesso no ataque.

O código entende que ele vai limpar quando nós tentamos criar uma nova tag, mas nós não precisamos criar uma nova tag para ter sucesso com um ataque XSS. Eu só preciso alterar tag que está sendo inserido o valor para ter sucesso.

Veja o código:

Veja o código do arquivo wp-includes/formatting.php of WordPress no core:

if( strpos( $filtered, '<') !== false ) {
$filtered = wp_pre_kses_less_than( $filtered );
  // This will strip extra whitespace for us.
   $filtered = wp_strip_all_tags( $filtered, false );
  // Use html entities in a special case to make sure no later
  // newline stripping stage could lead to a functional tag
   $filtered = str_replace( "<\n", "<\n", $filtered );
}

wp_strip_all_tags é o método mágico que limpa as strings especiais, mas nesse caso apenas se você tiver ‘<‘ no valor do input.

Qual o pior problema?

Esse método é recomendado pelo WordPress e muitos outros posts, artigos dizem para o developer utilizar. Mas a realidade como você pode ver nesse post e no anterior, é que isso não é verdade.

Em nossos números, existem cerca de 1061 plugins que usam sanitize_text_field sendo chamado em torno de 25551 vezes.

Por hoje, apenas um hacking, mas nos próximos posts, vamos mostrar como se proteger e o caso real que mostramos aqui.

Até mais pessoal… =)

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *