PCF-3

Questões comentadas, artigos e notícias

Prova 2002: Q42 Programação web

Posted by mike em 07/03/2009

A questão 42 da prova de 2002 possui algumas pegadinhas e sentenças mal formuladas. Só nesta questão foram anuladas 3 sentenças, vamos tentar entender a questão.

Considere uma página Web utilizada por um grupo de usuários para alimentar um banco de dados SQL Server. Os usuários realizam o logon sobre uma conexão SSL e, se autenticados, podem inserir informações e(ou) realizar consultas no banco de dados, que, após as inserções, envia como retorno um e-mail de confirmação.

O firewall interno só aceita conexões nas portas 443 e 25, nos dois extremos da DMZ. Alguns trechos de código correspondentes a essa página e ao script de logon são mostrados a seguir.

• página Web

<form name=”Logon” method=”post”
action=”https://www.bigbucks.org/scripts/Logon.asp&gt;
<p><font face=”Tahoma”> <i><b>Please enter username and
password:</b></i><br>
Username
<input type=”text” name=”uname” maxlength=”25″>
<br>
<br>
Password
<input type=”text” name=”pword” maxlength=”25″>
<br>
</font></p>
<p>
<input type=”submit” name=”Submit” value=”Submit”>
</p>
</form>

• script de logon

Conn.Open Set rst= Conn.Execute(“select * from userinfo where
username = ‘ ” & Request.Form(“uname”) & ” ‘ and password = ‘ &
Request.Form(“uname”) & ” ‘ ”
If rst.eof then
Response.Redirect “badlogon.asp”

Com base nessas informações, julgue os itens seguintes.

Questões e comentários:

1- Independentemente do que possa acontecer com as informações do banco de dados, é correto afirmar que o servidor hospedeiro desse banco de dados é seguro, já que as conexões são encriptadas e os acessos são intermediados pelo servidor Web.

Errado. A conexão cliente <=> servidor web está segura através do SSL, porém o mesmo não ocorre com a conexão servidor web <=> servidor banco de dados. A conexão aqui está sendo feita por meio de ADO (ActiveX Data Objects), e todo tráfego SQL é realizado em claro.

2- A simplicidade com que os dados de entrada são validados, repassando-os diretamente para a montagem do statement SQL, atesta o bom design da solução do controle de acesso, pois o código é facilmente auditável.

Errado. Neste caso a simplicidade do código mostra exatamente o contrário, que não houve auditoria, pois o mesmo não possui validações de entrada de dados, verificação do tipo de dados inseridos. Este problema ocorre tanto na declaração SQL quanto no código HTML. Além disso existe um problema de lógica que está sendo utilizado p/ se estabelecer a conexão com o banco de dados (senha = usuário).

3- A crítica inexistente aos dados fornecidos por um usuário permite que se monte consultas que resultariam no fornecimento das tabelas com as informações dos usuários.

Certo. Conforme explicado na questão anterior, não existe qualquer controle de segurança durante a montagem da declaração SQL. Podemos exemplificar isto da seguinte maneira:

<input type=”text” name=”uname” maxlength=”25″>
Como não há validação de entrada, é possível inserir qualquer string. No nosso exemplo, iremos inserir o valor admin’ or 1=1

<input type=”text” name=”pword” maxlength=”25″>
Neste caso como não sabemos a senha, vamos inserir um valor qualquer, pois este campo não é utilizado para se estabelecer a conexão (pegadinha do malandro!!!).

O form ficará preenchido da seguinte forma:

Quando a declaração SQL for montada, ficará da seguinte forma:

select * from userinfo where username = ‘admin’ or 1=1 —‘ and password = ‘admin’ or 1=1 –‘

A declaração em vermelho será ignorada, pois os caracteres “–” indicam que o restante da linha é um comentário. O retorno da declaração será sempre verdadeira, pois a declaração diz que ou o usuário é admin ou é verdadeiro.

Se não existir o usuário admin, o acesso será realizado com o primeiro usuário da tabela userinfo. Isto é uma simplificação de SQL Injection, mas neste caso pode-se inserir comandos SQL para que fosse realizado subqueries e listagens de informações do banco de dados.

4- Na situação apresentada, é possível forçar o banco de dados a enviar um e-mail com tabelas inteiras.

Errado. Mesmo com a porta 25/tcp aberta no firewall, só seria possível enviar um e-mail através do Banco de dados ou do servidor web se:

– existir uma package/procedure no banco de dados p/ envio de e-mail
– servidor SMTP aberto (open relay)

Ou através de outras técnicas de hacking que necessitariam de acesso ao servidor web ou de banco de dados.

5- Alguém desautorizado pode alterar as informações do banco de dados.

Errado. Neste caso o usuário que se conecta com o banco de dados necessita de privilégios de gravação nas tabelas. Porém esta não é uma verdade (ou falsidade) absoluta. Mesmo sem privilégios de gravação, através de SQL injection seria possível subverter as queries e escalar privilégios e assim ganhar acesso ao banco de dados e alterar as informações.

2 Respostas to “Prova 2002: Q42 Programação web”

  1. cidus said

    Discordo do último gabarito (deve ter sido anulado). Afinal, como foi dito no próprio comentário, através do SQL injection seria possível alterar informações.

  2. Myke said

    Neste caso o usuário de conexão precisa ter privilégios de update/delete na tabela onde ele vai alterar. É importante frisar que mesmo sem privilégios de gravação seria possível elevar o privilégio (escalação de privilégios) em determinados cenários. A questão foi realmente anulada pois foi mal formulada. Neste caso a sentença não deixa claro qual o privilégio do usuário de conexão do banco, não especifica versões e patch level do banco de dados que poderiam estar ou não vulneráveis. Existem uma série de variáveis que não foram esclarecidas, logo não há como afirmar que é possível alterar dados de forma inadvertida. É muito comum encontrar vetores que SQL injection que só permitem select na aplicação. Isso depende de como o banco de dados e a aplicação foram criados.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: