… mais um blog sobre software livre e outros assuntos.
Random header image... Refresh for more!

Category — Uncategorized

Como prevenir-se de ataques SQL Injection (explicado com um exemplo)

Este artigo explica o básico do SQL Injection (Injeção de SQL), com um exemplo que mostra como ele se dá e provê métodos de prevenção a estes ataques
Tal como o nome sugere, este ataque pode ser feito através de queries SQL. Muitos programadores não têm idéia de como um agressor pode usar uma query. Basicamente, um SQL Injection pode ser feito em uma aplicação web que não efetue a filtragem apropriada dos dados fornecidos pelos usuários, confiando em tudo que ele digita – o que pode ser uma requisição SQL não prevista pelo idealizador do software.
Os exemplos mencionados aqui foram testados com os seguintes softwares:

  • PHP 5.3.3-7
  • Apache/2.2.16
  • Postgresql 8.4

Um exemplo de SQL Injection

Vamos começar pelo fato de que muitas aplicações web têm uma página de autenticação. Vamos usar o código seguinte, como um exemplo:

index.html

<html>
<head><title>SQL Injection Demo</title></head>
<body onload=”document.getElementById(‘user_name’).focus();” >
<form name=”login_form” id=”login_form” method=”post” action=”login.php”>
<table border=0 align=”center” >
<tr>
<td colspan=5 align=”center” ><font face=”Century Schoolbook L” > Login Page </font></td>
</tr>
<tr>
<td> User Name:</td><td> <input type=”text” size=”13″ id=”user_name” name=”user_name” value=”"></td>
</tr>
<tr>
<td> Password: </td><td> <input type=”password” size=”13″ id=”pass_word” name=”pass_word” value=”"></td>
</tr>
<tr>
<td colspan=2 align=”center”><input type=”submit” value=”Login”> </div></td>
</tr>
</table>
</form>
</body>
</html>

Ao fornecer o nome de usuário (user_name) e senha (pass_word), seus valores são postados em login.php via HTTP_POST.

login.php

<?php
$Host= ’192.168.1.8′;
$Dbname= ‘john’;
$User= ‘john’;
$Password= ‘xxx’;
$Schema = ‘test’;

$Conection_string=”host=$Host dbname=$Dbname user=$User password=$Password”;

/* Conecta ao banco de dados e pede uma nova conexão*/
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);

/* Erro ao verificar a string de conexao */
if (!$Connect) {
echo “Falha ao conectar ao banco de dados”;
exit;
}

$query=”SELECT * from $Schema.users where user_name=’”.$_POST['user_name'].”‘ and password=’”.$_POST['pass_word'].”‘;”;

$result=pg_query($Connect,$query);
$rows = pg_num_rows($result);
if ($rows) {
echo “Sucesso ao logar!”;
}
else {
echo “Não foi possivel logar.”;
}
?>

Pois bem. A linha 19, no código acima, é vulnerável a uma ataque (me refiro à linha que começa com “$query=”SELECT *…”). Trata-se de uma requisição cujo objetivo é encontrar no banco de dados o nome e a senha fornecidos pelo usuário. Tudo vai funcionar bem se forem fornecidos dados corretos e válidos. Contudo, um usuário malicioso pode fornecer outro tipo de informação ao sistema.
No campo nome do usuário, em vez de digitar o que se espera, ele pode digitar o seguinte:

' or 1=1;--

e deixar o campo senha em branco.
Ao clicar em submit, as informações serão postadas em login.php, onde a requisição será vista como:

SELECT * from test.members where user_name='' or '=';--' and password='';

O que se vê acima é uma requisição SQL plenamente válida. No postgresql o — é um indicador de início de um comentário, ou seja, tudo o que vier depois deste caractere será ignorado. O que será executado é o seguinte:

select * from test.members where user_name='' or '=';

o que será verdadeiro (true) e retornará a mensagem “Login Success”.
Caso o agressor conheça os nomes das tabelas contidas no banco de dados, ele poderá apagar as tabelas com a seguinte entrada, no campo nome do usuário:
';drop table test.lop;--
Alguns scripts de autenticação tendem a agir da seguinte forma:

  • Guardar as senhas no formato md5.
  • Selecionar primeiro o nome,senha no banco de dados, com base no que foi fornecido pelo digitador.
  • Formatar em md5 a senha fornecida e compará-la com a senha no banco.
  • caso sejam iguais, a autenticação segue adiante.

Vejamos como contornar isto, no caso de a query ser vulnerável a um SQL-Injection.

login.php

<?php
$Host= ’192.168.1.8′;
$Dbname= ‘john’;
$User= ‘john’;
$Password= ‘xxx’;
$Schema = ‘test’;

$Conection_string=”host=$Host dbname=$Dbname user=$User password=$Password”;

/* Conecta ao banco de dados e pede nova conexão */
$Connect=pg_connect($Conection_string,$PGSQL_CONNECT_FORCE_NEW);

/* Erro ao verificar a string de conexao */
if (!$Connect) {
echo “Falha ao conectar ao banco de dados”;
exit;
}

$query=”SELECT * from $Schema.users where user_name=’”.$_POST['user_name'].”‘ and password=’”.$_POST['pass_word'].”‘;”;

$result=pg_query($Connect,$query);
$rows = pg_num_rows($result);
if ($rows) {
echo “Sucesso ao logar!”;
}
else {
echo “Erro ao logar.”;
}
?>

Agora digite o seguinte no campo nome de usuário:


' UNION ALL SELECT 'laksh','202cb962ac59075b964b07152d234b70

em seguida, entre “123″ no campo senha e clique em submit, sabendo que md5(123) é igual a 202cb962ac59075b964b07152d234b70.
Agora, a query vai se expandir para

SELECT user_name,password from test.members where user_name='' UNION ALL SELECT 'laksh','202cb962ac59075b964b07152d234b70';

e quando for executada, o banco de dados vai retornar ‘laksh’ como nome de usuário e ’202cb962ac59075b964b07152d234b70′ como senha. E, uma vez que postamos “123″, no campo pass_word, o strcmp vai retornar 0 e a autenticação ocorrerá com sucesso.
O que se vê, acima, são algumas das inúmeras possibilidades de ataques SQL Injection. Seguem, abaixo, algumas coisas que podem ser feitas para reduzir as possibilidades de ataques:

  • Sempre verificar o que é digitado (nunca confie no que o usuário vai digitar);
  • Se você espera que se digite um nome de usuário em um determinado campo, certifique-se de que ele contenha apenas caracteres alfanuméricos;
  • Elimine ou filtre caracteres especiais e entradas possivelmente maliciosas dos usuários;
  • Use expressões preparadas para executar as requisições;
  • Não permita que várias requisições sejam feitas em uma única expressão;
  • Não deixe vazar informações sobre o banco de dados através das mensagens de erro, etc…

Esta é uma tradução livre do artigo original, de Lakshmanah Ganapathy, que pode ser encontrado http://miud.in/1aYd

February 7, 2012   No Comments

Instale um servidor Linux, Apache, MySQL e PHP (LAMP) – com apenas um comando.

Com um servidor LAMP, é possível aprender a programar PHP, com o uso de um banco de dados MySQL. Aqui, partimos do pressuposto de que você está usando uma máquina com Linux (Ubuntu, para ser mais específico).
O trabalho será feito com o tasksel um aplicativo de instalação de softwares que é parte integrante do instalador do Debian e também funciona no Ubuntu. Ele agrupa os pacotes de softwares necessários para realizar determinadas tarefas e permite personalizar a sua instalação a partir das atividades que vocẽ deseja que sejam realizadas na máquina.
Com o tasksel, o administrador seleciona tarefas e não aplicativos para a instalação.
Como ele não vem instalado por padrão, vamos ter que cuidar disto antes de tudo. Abra um terminal, pressionando simultaneamente as teclas Ctrl + Alt + T e digite:
sudo apt-get install tasksel
Quando o processo de instalação for concluído, rode o tasksel na linha de comando:
sudo tasksel
Na tela que surge, selecione a opção LAMP server, com a barra de espaços do seu teclado e, em seguida, clique em OK.

Durante o processo de instalação será pedido para digitar e confirmar a nova senha de acesso ao servidor MySQL – cabe a você fazer esta escolha.

Testando

Feito isto, resta testar o nosso novo servidor LAMP. Dentro do terminal, digite o seguinte:
gksudo gedit /var/www/teste.php
Digite o seguinte:
<?php

phpinfo();

?>

Grave o arquivo e feche o editor. E, na linha de comando do terminal, reinicie o Apache:
sudo apache2ctl restart
Agora abra o seu navegador e acesse o seguinte endereço:
http://localhost/teste.php
Se tudo correu bem, você vai visualizar uma página semelhante à da figura abaixo.

Para tornar a administração do MySQL mais fácil, instale o phpmyadmin:
sudo apt-get install phpmyadmin
Durante o processo de instalação, será pedida uma senha nova para o phpmyadmin e, em seguida, que você informe que o servidor de Internet desejado é o Apache:

Para testar o phpMyAdmin aponte para o seguinte endereço no seu navegador:
http://localhost/phpmyadmin
Se uma página semelhante a esta (abaixo) aparecer, é provável que tudo tenha corrido bem por aqui:

Peraí! Não era só um comando?!

Tenho certeza de que você não achou o processo complicado até aqui. Ainda assim, é possível, sim, simplificar tudo com um só comando.
Um servidor rodando Linux, como sistema operacional (no nosso caso, a distribuição é Ubuntu); Apache, como aplicativo servidor web; MySQL como servidor de banco de dados e, por fim, um interpretador PHP, pode ser instalado de uma vez só com a seguinte linha de comando:
sudo tasksel install lamp-server
Em seguida, teste o serviço e instale o phpmyadmin, conforme foi ensinado acima.

November 1, 2011   Comments Off

Ubuntu 11.10 – aumentando a duração da sua bateria

Ubuntu Netbook

Instale Jupiter em seu notebook.


Há quem diga que o Jupiter ajuda a poupar energia. Se isto verdadeiramente funciona, só há uma maneira de se saber: experimentando. A instalação é simples. Abra um terminal (Ctrl + Alt + T) e digite (ou copie e cole) a seguinte linha:

sudo add-apt-repository ppa:webupd8team/jupiter
sudo apt-get update
sudo apt-get install jupiter

Se você tem um netbook Asus Eee PC…

Alguns equipamentos da Marca Asus dispõem de uma tecnologia de optimização de recuros, chamada SHE – Super Hyprid Engine. Se você quiser, pode adicionar suporte a este recurso com a seguinte linha de comando:

sudo apt-get install jupiter-support-eee

October 31, 2011   Comments Off

44 Novos papéis de parede pra nova versão do Ubuntu

Tablet with Ubuntu

Em função do tamanho restrito de um CD, muitos dos papéis de parede sugeridos por usuários ficarão de fora. Mas você pode baixá-los gratuitamente, desde já e usá-los – mesmo que não use o Ubuntu.
Clique aqui  para dar uma olhada e, se quiser, baixar pra conferir.

September 30, 2011   Comments Off

How about wput to send files to the server?

This one is simple. Every time you want to send files to the server using a FTP connection, you can use wput.
If you are in front of an Ubuntu box and don’t have it, just install it:
sudo aptitude install wput
Ah, yes! You can download a Windows version on this site at sourceforge.
To send all files from a local directory to your server you can make this use of the command:
wput --background myfiles ftp://username:password@hostname/recipient-folder/
Where the background option frees your terminal from the verbosity of the command and allows you to do other stuff here. Don’t forget to substitute the other parameters with the correct information. Where:

  • myfiles: are the file(s) you want to upload. You can surely use things like: *.php or name several files separated by spaces.
  • username and password: you should know what to put here
  • recipient-folder: a folder where the files will be sent. If you omit it, they will be written on the root.

Since wput logs everything by default on a local file called wput-log you can check if it all worked fine with cat:
cat wput-log | grep --context 2 -i fail
The command line above should show the files which wput failed to send up to the server. Try also typing
man wput
to know a little more about and have some more fun.

April 23, 2011   Comments Off

Readyboost no Ubuntu

Embora seja apresentado como “readyboost” em Linux, o cenário aqui descrito não tem muito a ver com o que a Microsoft propõe em seu sistema operacional – um sistema de cache do disco rígido em memória flash (pendrive). A única semelhança da solução demonstrada aqui é o uso do seu pendrive. Mas o propósito é outro: direcionar o swap para a memória flash, o que não tem qualquer coisa a ver com caching. Sob certo ponto de vista, são duas coisas completamente opostas.

Ainda que seja divertido, provavelmente será inútil para você

O tom, aqui, não é o de desencorajar, mas o de sermos realistas. O Linux funciona muito bem em sistemas com poucos recursos. Se a sua máquina é nova, ela terá no mínimo 1 GB de memória RAM. Numa configuração destas, possivelmente nenhuma diferença será percebida na performance do sistema. O recurso do Readyboost usa memória de troca (swap). Numa configuração como estas, o swap raramente é usado por um usuário normal.

O truque

O Readyboost, no Linux, consiste em direcionar prioritariamente os dados que iriam pra partição dedicada ao swap, em seu HD, para o seu pendrive que, por não conter partes mecãnicas, é mais rápido. Em um sistema com 512MB de memória RAM, ou menos, será possível notar diferença na performance. Uma advertência inicial: todo o conteúdo do seu pendrive será apagado durante este processo. Tire backup antes, portanto. Ao inserir o seu pendrive, o Ubuntu o montará e exibirá o seu conteúdo automaticamente. Clique sobre o ícone do pendrive na área de trabalho, com o botão direito do seu mouse e selecione Ejetar. Nós precisamos dele desmontado. Os comandos que seguem, partem do pressuposto de que o seu pendrive esteja conectado em /dev/sdb1. Adeque-os ao seu caso. Feito isto, abra um terminal com Ctrl+Alt+T e digite o seguinte comando:

sudo mkswap /dev/sdb1

Agora vamos direcionar o swap para o pendrive, com a máxima prioridade possível (32767):

sudo swapon -p 32767 /dev/sdb1

Para verificar se tudo foi feito corretamente, o comando a seguir mostra as partições swap em uso: cat /proc/swaps No meu caso, ele exibe o seguinte:

cat /proc/swaps

Filename Type Size Used Priority

/dev/sda1 partition 1951740 0 -1

/dev/sdb1 partition 249820 0 32767

A quarta coluna exibe o quanto está sendo usado do swap: 0 (zero).

<h4>Considerações finais</h4>

A função do swap é servir de extensão à memória RAM – De forma resumida, quando esta fica saturada, os arquivos menos usados são realocados pro swap, que fica em um arquivo ou em uma partição exclusiva (recomendado). Este é o principal motivo pra solução descrita aqui não ter grande efeito em um sistema com grande quantidade de memória RAM, onde o swap raramente é usado.

Contudo, ele tem outra utilidade, a de guardar todas as informações do estado atual do sistema quando este é posto pra hibernar. Neste caso, é possível experimentar melhor velocidade no processo de restabelecer o sistema. Neste caso, é necessário que o swap tenha, pelo menos, o mesmo tamanho da memória RAM disponível.

March 14, 2011   Comments Off

Geeqie

Visualizador de imagens é uma ramificação de outro projeto.

Geeqie

O Geeqie é um programa para apresentar/visualizar imagens. O projeto nasceu em Março de 2008, após 3 anos de inatividade do GQview, cujo código foi aproveitado pelos desenvolvedores. Por isto, aqueles que já usavam o programa anterior (o GQview), se sentirão em casa aqui.

Sua tela inicial se divide em um navegador, onde você escolhe os arquivos que deseja visualizar, as pastas que quer abrir e uma janela, à direita, onde as imagens selecionadas são exibidas.

Profissionais ou aficcionados por fotografia podem gostar muito da velocidade e eficiência com que ele trata imagens RAW (formato que contém todos os dados da imagem tal como foi captada pelo sensor da câmera. Normalmente, estes arquivos não são comprimidos).

Entre os recursos que eu achei interessantes está a janelinha de confirmação de exclusão de um arquivo, em que o Geeqie exibe uma prévia da imagem a ser removida. Pode evitar acidentes.confirmação

Usuários do Ubuntu, podem instalá-lo facilmente através da Central de Programas do Ubuntu, que pode ser acessada do Menu de Aplicativos (Alt + F1). Pros(as) aventureiros(as), sempre tem a linha de comando:

sudo apt-get install geeqie

March 3, 2011   Comments Off

Bug do KnetworkManager – solução

De forma objetiva, tenho notado a presença do bug no uso do KDE 4, no Kubuntu, desde a versão 10.04, Lucid Lynx. O problema já foi relatado por usuários do Maverick Meerkat 10.10 também.

Costuma-se dizer que, do nada, o KnetworkManager deixa de funcionar e o seu ícone passa a exibir uma das seguintes mensagens: “rede indisponível”, “não gerenciado”, “unmanaged” ou “disabled” (nas versões em inglês). Comigo, isto tem ocorrido quando o PC ou o notebook entra em hibernação. Tive que reinstalar tudo algumas vezes e sair desligando todas as opções de hibernar disponíveis – pra evitar que ocorresse de novo.
A solução é mais simples do que isto.
Como root (administrador do sistema) abra o arquivo /var/lib/NetworkManager/NetworkManager.state e ajuste-o para que fique assim:

[main]
NetworkingEnabled=true
WirelessEnabled=true
WWANEnabled=true

Entendeu? Todas as opções têm que estar “true”. Não esqueça de reiniciar a máquina, depois.

Continuando…

Para as próximas vezes em que o problema ocorrer, faça download do seguinte script.
Agora, abra um terminal e mude sua condição para executável. Quando o KNetworkManager parar de funcionar de novo, basta rodá-lo como administrador (root):
falken@Joshua:~/Download$ chmod aug+x raxb300P.txt
falken@Joshua:~/Download$ sudo ./raxb300P.txt

password for falken:
Checking for root…
You are root. moving on
Problem found..
Problem repaired.

E não esqueça de reiniciar.
Fontes: http://pastebin.com/raxb300P, http://ubuntuforums.org/showthread.php?t=1464187

November 23, 2010   Comments Off