Bem-vindo de volta.
Portanto, o último foi um pouco rápido, mas acho que não devemos nos esquecer de que este
é mais um aplicativo de aprendizado e não um desafio de CTF pesado.
Tudo bem.
Está bem.
Portanto, vamos simplesmente seguir em frente.
Vejamos.
Já temos todos eles.
O vazamento de dados de canal lateral é algo que ignoramos por enquanto.
Vamos dar uma olhada na validação de entrada.
Está bem.
Sim.
Aqui temos a injeção de SQL XYZ e Webviews.
Sim.
Isso é algo que eu quero fazer em um vídeo curto.
No entanto, temos isso aqui agora, ok.
Vamos ver, complete os exercícios abaixo.
Ok XSS.
Identificar códigos vulneráveis e assim por diante.
Está bem.
Portanto, temos o campo name aqui e exibimos ok.
Vamos ver se digitamos o teste e ele é exibido aqui.
Então, vamos dar uma olhada no código referente a isso.
Um.
Nós o temos aqui.
Atividade XSS.
Está bem.
Oncreate.
Sim.
Está bem.
Ele precisa ter um WebView e precisa ter o JavaScript ativado.
Tudo bem.
Portanto, um WebView é simplesmente um quadro de conteúdo em seu aplicativo no qual um site está sendo exibido.
Portanto, você pode pensar nisso como se tivesse um iframe, uh, nesse aplicativo móvel em execução que é exibido
na página.
E vamos ver qual é a página.
Portanto, temos dados de carga.
Está bem.
Vejamos.
Portanto, obtivemos a expressão de verificação do WebView, ok.
Configurações do cliente web WebView Configurações do cliente web habilitadas JavaScript ok.
Ah, sim, tudo bem.
Carregar dados.
Ah, sim, ok, entendo, então vamos abrir isso no Visual Studio Code.
Então, essas são todas as outras coisas.
E vamos ativar o Wordwrap.
Digamos que isso seja HTML.
Está bem.
Sim.
E vamos substituí-las por uma linha realmente nova, ok.
Portanto, aqui podemos ver que já temos um aplicativo da Web sendo renderizado.
Este aqui.
Nome e exibição.
Esse já é um aplicativo da Web.
Aqui temos o contexto HTML.
E podemos ver, quero dizer, podemos salvar isso agora mesmo.
em um arquivo HTML e exibi-lo.
Ou talvez façamos isso.
Salvar como.
WebView.
E vamos ver.
Sim, está bem.
Fiz uma bagunça aqui.
Mas você pode ver que temos esse nome e coisas do gênero.
Portanto, esse é o WebView em execução.
Ok, hum.
Vejamos.
Portanto, temos algum conteúdo de exibição de função.
Ele obtém o nome do elemento do documento get por ID, que é o nome correto.
E então, sim, tudo bem.
Portanto, estamos buscando o valor do nome.
E estamos escrevendo isso diretamente na página HTML.
Isso significa que agora já podemos inserir algumas tags HTML.
Por exemplo, se usarmos essa tag H1, estaremos criando um título.
E este deve ficar um pouco maior.
Perfeito.
Sim.
Assim, podemos ver que a entrada não está sendo filtrada.
Isso significa que agora podemos inserir tags HTML já existentes.
Mas agora também podemos ver que essa visualização da Web.
Isso é algo que você precisa procurar.
Tem esse JavaScript ativado, o que significa que ele também aceita JavaScript.
Portanto, o que deve funcionar é algo como um script de alerta.
Uh, script de edição de faixa preta da Udemy 3 para 1.
Está bem.
Talvez eu queira um pouco demais.
Portanto, o que deu errado foram definitivamente os parágrafos.
Portanto, vamos mantê-lo.
Devemos começar de forma simples antes de nos empolgarmos demais agora.
3 para 1.
Sim.
Agora, podemos ver que esse código JavaScript é executado, o que significa um alerta de script.
Udemy.
Sim.
Está bem.
E agora também podemos fazer essas outras coisas.
Um.
Alerta de script.
Udemy.
Hacking de aplicativos Android.
Faixa preta.
Certo, acho que não podemos usar algum contexto agora em relação ao documento de alerta de
script. cookie.
Assim, por exemplo, com esse código JavaScript, poderíamos acessar os atributos do cookie, mas
não temos uma sessão no momento.
Portanto, acho que esse é apenas um aplicativo de teste para verificar se o código JavaScript é executado.
321.
Sim.
Não está funcionando.
Acho que sim.
Então, o que você pode fazer?
Tendo acesso, você pode criar um novo layout.
Você pode carregar conteúdo adicional.
É possível se você tiver uma interface JavaScript, o que não é o caso aqui.
Em seguida, você pode executar diretamente o código Java.
Assim, você pode obter a execução remota de código com base no WebView, no JavaScript ativado e na interface JavaScript.
Portanto, ao ter uma interface JavaScript, é como ter uma função normal.
Vejamos.
Vejamos, por exemplo, esta função.
E acho que é algo como.
Interface JavaScript.
Algo parecido com isso.
E então podemos simplesmente chamar o método no JavaScript.
E, em seguida, o método Java aqui é executado.
Portanto, isso também é algo que você deve procurar.
Está bem.
Mas acho que, com relação ao XSS, sim, isso é tudo.
Muito bem, vamos continuar com a injeção de SQL.
Tão perto.
Ou talvez possamos mantê-lo aberto.
Está bem.
Compreender a injeção de SQL e identificar códigos vulneráveis.
Localize todos os usuários que não estão satisfeitos.
Conclua o exercício de armazenamento inseguro e certifique-se de que pelo menos dois usuários sejam criados.
Bem, acho que temos que criar o banco de dados primeiro porque, caso contrário, não poderemos executar ou acionar
essa injeção de SQL para obter alguns dados.
No entanto, vamos primeiro dar uma olhada nesse caso.
Injeção de SQL.
Aqui, temos o oncreate.
Temos o botão SQL.
Consulta do cursor.
Está bem.
Precisamos verificar qual é a nossa entrada.
Temos o nome de usuário e, em seguida, temos a visualização de texto e edição de texto.
Temos um texto de edição em algum lugar.
Hum, sim.
Aqui.
Está bem.
Pronto, já podemos ver nosso texto.
Termina no nome de usuário dois e, em seguida, verifica a expressão not null.
Verificamos se o nome de usuário tem algo e então temos sb append ok.
E sb é este aqui, o que significa que estamos pendurando nosso nome de usuário neste aqui.
E então estamos anexando ok.
Sim.
Precisamos dessa citação final.
Está bem.
Então, o que acontece é o seguinte.
Agora vamos mudar para o SQL.
Está bem.
Portanto, esta é a nossa primeira parte.
Em seguida, há esse campo de texto de edição.
Este aqui onde está o texto.
Armazenado no nome de usuário dois.
Aqui estamos obtendo o texto desse campo de texto.
E estamos anexando isso à sintaxe SQL.
Por exemplo, se tivermos um nome de usuário admin, ele será anexado.
Mas isso não seria uma sintaxe SQL inválida, pois esta aqui geraria um erro de que a consulta
não está fechada.
Algo parecido com isso.
Portanto, o que podemos ver aqui é que estamos acrescentando um ponto e vírgula depois.
Está bem.
Portanto, temos influência sobre essa parte aqui.
E o que podemos fazer é, por exemplo, deixar isso vazio.
E então poderíamos inserir algo como este.
E, então, talvez precisemos encerrar o assunto ou comentá-lo.
Acho que comentar isso deve funcionar.
E isso significaria selecionar tudo de usuários em que o nome de usuário está vazio ou um é igual a um, o que dá uma declaração verdadeira, o que significa
que estamos selecionando ou verdadeiro.
Portanto, estamos selecionando cada linha em nossa sintaxe SQL aqui.
Assim, recuperaremos todo o banco de dados do usuário.
Sim.
Sim, com todas as entradas também.
Está bem.
Então vamos ver.
Quero dizer, podemos tentar isso, mas acho que sim.
Dados não seguros.
Não há usuários de tabela.
Está bem.
Sim.
Em que desafio isso ocorre?
SQL de armazenamento inseguro.
Então vamos ver.
Mas eu não quero pular para esse, então sim, vamos mantê-los separados.
Acho que é isso.
Vejamos.
Senha de administrador.
Está bem.
Android.
Curso incrível.
Um pouco, uh, autocolante.
Aqui.
Pronto, agora criamos um banco de dados com duas entradas.
E vamos voltar à validação de entrada.
Está bem.
Vamos ver se estamos usando o admin.
Vamos ver o que deve acontecer.
Se usarmos o admin, estaremos selecionando todas as entradas corretamente.
E este vai para a consulta.
E aqui podemos ver que ele está executando essa consulta.
E, em seguida, ele retorna com os resultados desse teste.
Nome de usuário e senha.
Sim.
E aqui podemos ver algumas outras coisas.
O que acontece aqui?
Nome de usuário não encontrado.
Está bem.
Tudo bem.
Vejamos, então, se usarmos o verify, ele deverá imprimir algo como nome de usuário, senha, acho que esta parte
aqui, se tivermos uma entrada 321.
Sim.
A senha do administrador do nome de usuário é a senha com esses colchetes.
Exatamente.
Esta parte aqui.
Perfeito.
Portanto, esses são nossos dois resultados, ok.
Portanto, isso é se o usuário existir, se você tiver um usuário que não existe.
Usuário não encontrado.
Pode ser esta parte aqui.
Está bem.
E se a consulta SQL lançar uma exceção, acabaremos aqui.
Erro ao inserir dados.
Algo parecido com isso.
Portanto, vamos lançar uma exceção.
Uma exceção seria esta, pois vamos colocá-la no lado esquerdo, talvez.
Portanto, o que estamos fazendo agora é inserir ABC e depois em cólon, uh, não cólon e.
Citação.
É uma citação?
Aspas simples?
É uma aspa simples.
Sim.
Isso significa que estamos encerrando esta parte.
Mas agora temos novamente uma pergunta de abertura.
Portanto, isso deve gerar uma exceção.
Vamos ver 3 para 1.
Sim.
Perfeito.
Também podemos ver.
Sim, há dois lá dentro.
Código um, erro na claraboia e assim por diante.
Vamos ver se fechamos esse aqui, então isso deve funcionar.
Acho que precisamos fechá-lo aqui, é claro, porque agora já o temos.
Portanto, esta é a parte aqui.
E este é simplesmente uma string vazia.
Mas não tenho 100% de certeza.
Vejamos.
3 para 1.
Sim.
Usar ABC não encontrado.
Portanto, podemos ver que esse é um indicador muito bom, bastando lançar uma única citação no banco de dados.
Não é como se fosse sempre uma injeção de SQL.
Pode ser qualquer outra coisa, menos anexar o segundo e receber um resultado inválido.
Isso é um pouco suspeito, ok.
Portanto, o que poderíamos fazer agora é.
Se esse fosse um aplicativo da Web, eu nunca, jamais, lançaria um A ou um igual a um contra esse aplicativo.
Por quê?
Digamos que o comando select seja usado posteriormente em um comando update.
Assim, você sobrescreveria completamente todo o banco de dados.
E isso é definitivamente ruim neste caso.
No momento, temos um banco de dados local em nosso smartphone a partir de um aplicativo que pode ser facilmente restaurado.
Portanto, eu optaria pela abordagem fácil, o que significa que estamos inserindo este
e depois vamos ver.
Um.
Se este for o caso.
Portanto, isso corrige o problema.
Desculpe.
Este é o nosso.
Este aqui.
Sim.
Portanto, essa é a nossa contribuição.
Isso significa que estamos fechando a primeira consulta.
Estamos conectando-a com a segunda, que é sempre verdadeira.
E então estamos fechando o hífen final.
Uma única citação aqui.
Sim, tudo bem.
Vejamos.
Portanto, nossa entrada seria a seguinte.
Se isso não funcionar, teremos que adotar a abordagem de comando.
Sim.
Vejamos.
3 para 1.
Não.
Um.
Vamos ver se colocamos alguns dados inválidos no início.
3 para 1.
Não.
Está bem.
Não estou 100% certo.
Podemos ver.
Está bem.
Para mim, parece bom, mas, mesmo assim, vamos tentar a abordagem de comentários, o que significa.
Hum, estamos comentando o final, uh, uma única citação aqui.
Então vamos ver.
Três.
Dois, um.
Sim.
Está bem.
Perfeito.
Podemos ver.
Sim, podemos ver.
Agora estamos recebendo as duas entradas aqui.
Além disso, se você tiver um banco de dados com, digamos, 60 mil usuários, e lançar isso contra ele, a iteração será feita
sobre todos os usuários.
Portanto, isso pode causar muitos danos.
Vamos ver como podemos fazer isso ou como podemos fazer isso um pouco melhor.
Portanto, precisamos entrar na estrutura desse banco de dados.
E a maneira mais fácil é simplesmente examinar esse banco de dados.
Portanto, dados, dados.
Um, bancos de dados.
Sim, deveria ser.
É uma cabra, eu acho.
Sim.
Está bem.
Assim, podemos ver que temos.
Quero dizer, essa não é a maneira ideal de ver esse caso, mas tudo bem.
Podemos ver que temos um ID do tipo inteiro.
Essa é a chave primária.
Temos o nome de usuário e a senha, e é isso, tudo bem.
Portanto, normalmente você faria o download e o abriria com um navegador SQL Lite ou com uma ferramenta de linha de comando
SQL Lite.
Teremos isso se dermos uma olhada no armazenamento inseguro de dados mais uma vez.
Mas eu só estava interessado em uma senha e um nome de usuário.
Portanto, nesse caso, o que faríamos seria um onde o nome de usuário.
É isso.
E então vamos ver.
Usaríamos um sindicato.
Selecione.
E então dizíamos.
Temos três colunas, portanto, temos uma, duas, três.
Está bem.
Não tenho certeza se eles estão sendo exibidos aqui.
Está bem.
Antes que isso se torne muito complexo, vamos ver.
Hum, sim.
Union e selecione de 1 a 3.
Sim, podemos ver que agora temos as colunas dois e três.
Em nossa mensagem de brinde.
E essas colunas dois e três são o nosso nome de usuário e a nossa coluna de senha.
Portanto, nosso banco de dados se parece com o nome de usuário e a senha do ID.
E agora vamos analisar a abordagem típica de injeção de SQL.
Portanto, agora descobrimos quantas colunas estão sendo usadas.
Mas podemos dar uma olhada nisso.
Temos essa estrela selecionada, desculpe Asterix.
Isso significa que estamos selecionando todas as colunas.
E, em nosso banco de dados, vimos que temos três colunas.
Portanto, eu sabia que esses eram os três.
E então, sim, agora podemos usar algumas técnicas de injeção de SQL para explorar isso.
Portanto, poderíamos fazer isso dessa forma.
Podemos dizer, hum, nos dê o.
Uh groupconcat.
Acho que isso também funciona aqui.
Isso combina os primeiros 1024 caracteres do nome de usuário e, em seguida, 0X3A está na coluna com o caminho, uh, senha.
E então, a partir da tabela, desculpe, o banco de dados era o de usuários, certo.
Sim.
Está bem.
Então, vamos tentar.
Eu sinto muito.
Vamos tentar essa abordagem.
Está bem.
Um.
Concatenação de grupos.
Nome de usuário.
Senha dos usuários.
Portanto, o que a seleção de união faz é conectar a primeira consulta com a segunda.
A primeira consulta não nos dá um resultado.
E vimos os números dois e três, que são os números de consulta que temos aqui.
Portanto, dentro do número dois, haverá agora, se isso funcionar, não tenho certeza, o nome de usuário com dois pontos
e, em seguida, a senha, e o três permanecerá vazio, tudo bem.
Vamos ver 3 para 1.
Ok, temos um erro.
Está bem.
Vamos ver se podemos usar o Union Select com o Groupconcat.
Vamos simplificar um pouco mais.
Então, o e Union seleciona.
Um, um grupo de gatos.
Talvez possamos fazer isso desta forma.
Vamos ver se conseguimos obter algum texto.
Está bem.
Podemos obter algum texto.
Podemos conseguir um pouco?
As informações do banco de dados, por exemplo, podem ser usadas na função de versão.
Não, ele não pode usar a função de versão.
Ah, não posso usar anúncios.
Está bem.
Isso é estranho.
Talvez possamos encontrar uma solução alternativa.
Essa parte funciona?
Não.
Está bem.
Um.
Isso funciona?
Sim.
Portanto, podemos ver que agora temos o Admin e o Android em nosso.
Saída.
Segunda coluna.
Está bem.
Portanto, se aplicarmos uma senha, vamos ver se isso funciona.
Sim.
Mas agora não temos um separador.
Portanto, precisamos de um separador para ver a diferença.
Sim.
É claro que não podemos usar aspas simples porque isso bagunçaria nossa sintaxe.
Vamos fazer dessa forma.
Isso também bagunça nossa sintaxe.
Está bem.
O Hex também não funciona.
Então, sugiro que façamos desta forma.
Senha do Groupconcat.
Então, o que acontece agora é o seguinte.
Hum, este não está sendo exibido.
Portanto, não estamos vendo a coluna número um.
Hum, mas estamos vendo a coluna número dois.
A coluna número dois fornece agora todos os nomes de usuário do banco de dados dentro dos primeiros 1024 caracteres.
E a coluna número três devolve todas as senhas.
Então, vamos ver se isso funciona.
Acho que isso deve funcionar.
321.
Sim.
Está bem.
Portanto, é assim que podemos extrair esses dados desse banco de dados.
E essa abordagem é muito mais segura do que a abordagem "ou igual" ou "um igual a um".
Mas se você estiver em um dispositivo local com um banco de dados que possa ser facilmente restaurado, não haverá problema
algum.
Se você quiser ter um vídeo separado sobre injeção de SQL, porque agora eu joguei todas
essas coisas contra você, me avise.
Mas acho que essa técnica já existe há uns 15 ou 18 anos.
Portanto, você encontrará muitas informações na Internet sobre como explorar isso.
Está bem.
Portanto, este também.
Validação de entrada WebView.
O que temos aqui?
Acessar informações confidenciais usando URL.
Além do WebView.
Entender quais são as configurações.
O que eu realmente gosto nesses desafios são os objetivos dados pelo autor que conhecemos.
Qual é o contexto desse caso?
Por isso, um grande elogio em relação a ele.
Ok, então temos talvez um URL que pode ser definido por nós e definimos um acesso baixo a arquivos.
Esses dois, em combinação com o WebView, são perigosos.
Então vamos ver.
Validação de entrada WebView.
O que foi isso?
Está bem.
Validação de entrada WebView.
Vejamos.
Um.
Acho que é este aqui.
URL da visualização da Web de validação de entrada.
Certo, acho que é este aqui.
Então, vamos ver o que temos aqui.
Temos nosso método Oncreate.
Temos nossa visualização da Web.
Temos nosso URL que é recuperado deste campo de texto aqui.
E.
Você definiu as configurações da Web como JavaScript ativado.
Então também temos, eu acho.
Sim.
Você também tem nossa vulnerabilidade de script entre sites.
Aqui também temos um redirecionamento aberto.
Portanto, podemos ou parece que podemos definir o URL.
E depois temos o URL de carregamento.
Está bem.
Sim.
É isso aí.
Está bem.
Vamos ver se digitamos https no Google. com.
Sim.
Em seguida, a página da Web está sendo exibida aqui.
O autor menciona que definimos a permissão de acesso a arquivos.
Eu não vi isso aqui, então talvez eu esteja errado.
Aqui podemos ver as configurações da Web do Android definidas para permitir o acesso a arquivos.
Temos essa bandeira aqui.
Não está aqui, o que é interessante, mas pode não estar.
Necessário.
Quero dizer, este é do código QL.
Portanto.
Está bem.
Interessante.
Vamos resolver isso.
Então, acho que o objetivo desse desafio é o seguinte.
Se tivermos um arquivo, por exemplo, este aqui, e estivermos abrindo-o, poderemos ver que obtivemos
o URL do arquivo aqui.
Ele não está sendo exibido.
Aqui está.
Está bem.
Portanto, isso significa que podemos usar um esquema de URL para acessar arquivos locais fornecendo dois pontos e vírgula, barra e barra de arquivo.
São três barras.
E, em seguida, o caminho do arquivo.
Portanto, se agora você tiver essa visualização da Web aqui e pudermos definir o URL.
E a URL não está filtrando em relação a Http e Https, podemos fornecer nossos próprios esquemas, o que significa
que também podemos usar esse esquema de arquivo.
Portanto, três barras.
Estamos agora no contexto deste aplicativo.
Isso significa que, se tivermos acesso ao cartão SD de armazenamento externo, leitura e gravação, poderemos acessar esses
arquivos.
Mas o mais importante é que também podemos acessar nossos arquivos internos.
Então, vamos dar uma olhada.
Um.
Dados.
Bancos de dados próprios?
Talvez.
Sim, podemos usar esse banco de dados.
Acho que criamos.
Está bem.
Portanto, esse é um diretório protegido.
Mas estamos no contexto do aplicativo, o que significa que ele não está protegido para esse aplicativo, porque
esse é o armazenamento desse aplicativo.
Portanto, ao fornecer o nome do arquivo, como dados de dados de desculpas ou bancos de dados de ouro Rasp e, em seguida, uma cabra, tudo bem.
Devemos poder acessar esse arquivo e ele deve ser exibido aqui.
E vamos ver 3 para 1.
O quê?
Recebemos um erro, não recebemos nada.
Ok, então vamos tentar outra coisa e ver se podemos adicionar esse arquivo de texto simples, porque ele pode estar relacionado
aos dados binários que recebe.
Sim.
O formato dos tijolos.
Hum, esse processo de carregamento aqui.
Portanto, agora criamos um arquivo de texto de teste.
O que é isso.
Sim, tudo bem.
Também precisamos solicitar um usuário para esse caso.
Está bem.
E também fazemos isso.
Não são legíveis para o mundo externo.
Então, o usuário tem todas as permissões, mas ninguém mais pode acessá-lo.
Vamos ver se isso funciona.
Um.
Sim, tudo bem.
Perfeito.
Portanto, podemos ver que ele geralmente funciona com três barras.
Sim.
Faz sentido.
Está bem.
Infelizmente, não podemos carregar dados binários.
Temos isso em nosso banco de dados aqui, mas talvez possamos ver as preferências compartilhadas.
Ok, acho que não é isso.
Sim, isso não é interessante.
Um.
No entanto, vamos tentar fazer isso.
Portanto.
Prefs compartilhados.
E depois.
Este aqui.
Três.
Dois.
Um.
Sim.
Está bem.
Portanto, se tivermos dados confidenciais em nossas preferências compartilhadas, poderemos carregá-los pelo URL aqui.
Quero dizer, com relação ao cenário de ataque do mundo real, se for dentro do próprio aplicativo, tudo bem.
Mas seria muito melhor se você estivesse fazendo alguma recompensa por bugs, se pudesse acionar isso por
meio de um aplicativo externo, por exemplo, por meio de um link profundo que é passado para o aplicativo ou, por
exemplo, sim, por meio do URL, hum, parâmetro com a abordagem de arquivo, se isso não estiver sendo filtrado, que você
busque essas informações e as obtenha de volta em seu próprio aplicativo, hum, que você provou
que pode ler os dados confidenciais de um aplicativo externo.
Muito bem.
Está bem.
Vamos dar uma olhada rápida.
Temos um armazenamento de dados inseguro e vimos preferências compartilhadas.
Então, talvez possamos criar um exemplo.
Está bem.
Vejamos.
Curso de administração do Android.
Dados salvos.
Está bem.
Portanto, temos agora o.
Senha e nome de usuário.
Nesse XML de usuário de Preferências compartilhadas.
Vamos voltar.
E vamos executá-lo mais uma vez.
Validação de entrada WebView.
Está bem.
Um.
Arquivo de texto de entrada, duas barras.
Em seguida, esse caminho que faz três e usa XML.
Está bem.
3 para 1.
Sim.
Perfeito.
Portanto, os dados XML são fáceis de visualizar aqui.
Muito bem.
Em seguida, sugiro que continuemos com o armazenamento inseguro de dados, mas em um vídeo separado.
Se você tiver dúvidas sobre exibições na Web, injeções de SQL e coisas desse tipo, entre em contato comigo.
Mas sim, haverá também um vídeo adicional sobre Web Views que aborda todos esses
truques e desvios.
Com relação ao armazenamento de dados, eu não consideraria esse tipo de armazenamento inseguro porque, mesmo que você
criptografe seus dados, a chave estará disponível localmente e, portanto, você não terá nenhuma vantagem
com isso.
Mas isso é algo que descobriremos no próximo vídeo.
Talvez uma pequena nota final.
Você pode fazer isso melhor se tiver um dispositivo com suporte de ambiente não confiável e, em seguida, usar o Android Keystore
para armazenar seus dados com segurança.
Está bem.
E mais sobre isso no próximo vídeo.
Portanto, estou ansioso para vê-lo lá.