SQL Injection, como prevenir falhas de segurança em PHP / MySQL

Posted by chavesfop | Artigo, Hacking, Programação | Tuesday 7 July 2009 11:44

O QUE É SQL INJECTION ?

A técnica de injetar um código malicioso em um trecho de código de tratamento SQL.
A maioria das tentativas de SQL Injection irão ser realizadas em um input form, de seu código html, mas também podem ser manipuladas atraves das urls de seu site.

O comando mais básico de SQL Injection é parecido com este:

	Variável' or 1=1--

Vamos supor agora que temos um form de login, e que ele irá receber esta variável na forma em que foi escrita, sem nenhum tratamento.

Portanto, o código SQL que seria executado ficaria assim:

SELECT * FROM users WHERE username = 'Variável' or 1=1--'

Viu como o código serve como uma luva no nosso SQL Injection :D ? O resultado irá nos dar acesso a um usuário, levando em conta que retornara verdadeiro, porque ? porque 1=1.

E o ‘–’ ? Isto serve para dizer ao SQL que ele irá ignorar qualquer outro comando SQL que foi colocado no final, portanto isso ira garantir que nenhum outro código SQL feito na programação interfira em nosso SQL Injection.

Algumas outras sintaxes comuns de SQL Injection são:

    ') or ('1'='1
    "or "1"="1
    ' or '1'='1
    Or 1=1--
    " or 1=1--
    ' or 1=1--

SQL INJECTION, ATACANDO ATRAVÉS DE URLS:

Você sabia que é possivel fazer um ataque de SQL Injection através de URLs ? E isso com certeza é mais perigoso. Geralmente quando utilizamos PHP + SQL, nossas urls ficam no formato:

http://YourWebsite.com/login.php?id=2

e adicionando o código sql ao final da url poderia ficar assim:

http://YourWebsite.com/login.php?id=2‘; DROP TABLE login; #

o caracter # é que nem o — que utilizamos anteriormente…

TÉCNICAS DE PREVENÇÃO DE SQL INJECTION

Editando o tamanho das nossas forms:
Isto apenas irá dar um trabalho a mais ao atacante, neste caso ele teria que refazer os formulários, removendo o tamanho, levando em consideração que os forms são feitos em html puro, portanto qualquer um pode ver seu código…

Validação do tipo de dado:
Uma outra boa idéia é fazer a verificação de dados, quando são digitados na form, portanto, se houver caracteres estranhos, como ‘, ; ou até mesmo um #, já pode acusar erro e não executar o código SQL :D

Privilégios de usuários:
Uma técnica que deve ser praticada também é de nunca acessar o banco de dados como root, e sim como um usuário que tenha certos privilégios, por exemplo, para pesquisas podemos fazer um usuário que seja apenas leitura, assim quando entramos com dados na form, mesmo que seja executado um comando sql malicioso, o usuário ira apenas poder ler dados, impedindo-o de inserir ou deletar registros.

A Verdadeira solução:
Utiliza-se a função ‘mysql_real_scape_string();’, veja como ele funciona:

 $name = "John";
    $name = mysql_real_escape_string($name);
    $SQL = "SELECT * FROM users WHERE username = '$name'";

portanto, quando um alguém mal intencionado tenta executar o SQL Injection, com esta função ele ficaria da seguinte forma:

    $malcious_input = "' OR 1'";
    // Não se assuste!!
    // Com o uso de mysql_real_escape_string()
    // o seguinte é retornado:
	\' OR 1\'

    // Veja como os contra barras escapam as aspas!
    // Agora usuários não podem colocar dados maliciosos...

CONCLUSÃO:
a função mysql_real_escape_string() – não tem um nome tão incrivelmente mágico, mas estes 24 caracteres são a bondade do SQL Injection, o que salva os programadores descuidados… agora, é só aplicar a teoria em seus projetos ;D

  • Share/Bookmark

Tunning Firefox

Posted by demoncyber | Dicas, Hacking | Monday 15 September 2008 06:19
CLICK-ME

CLICK-ME

Este artigo visa mostrar algumas dicas colhidas na net para otimizar o firefox, para ajudar à todas aquelas pessoas que acham o Firefox pesado tornar ele mais rápido. A necessidade disto veio por causa de um dos projetos o qual esta ferramenta estava consumindo muito processamento e memória.

Segue as configurações mudadas e os processo que utilizamos no projeto.( Lembrete antes de fazer as alterações faça backups )

Inicialmente trabalhamos com a sessão de configuração do firefox que pode ser acessada por about:config dentro do seu browser.

Flags modificadas para obter melhor desempenho:

Nome:content.notify.interval
Type: Integer
Value: 2000000
Chave: Teve que ser criada manualmente

- Diminui o intervalo de renderização das paginas do firefox

Nome:content.notify.ontimer
Type: Boolean
Value: true
Chave: Teve que ser criada manualmente

- É uma chave dependente para ativar o content.notify.interval

Nome: browser.tabs.closeButtons
Type: interger
Value: 0 (valor opcional, você pode tentar outros valores citados acima) (valor padrão: 1) (valores opcionais: 0, 1, 2, 3)

- Aqui vem uma das partes que as pessoas não percebem mas consome bastante memória e desempenho botão de fechar nas abas com a opção 0 este botão somente aparece na janela corrente.

Nome: browser.cache.memory.enable
Status: user set
Type: boolean
Value: false

- A chave milagrosa a que deixa o firefox rápido pra caramba, esta chave habilita o cache de memória do firefox nada de ficar sobrecarregando e criando firefox utilizando 100 ou mais de ram.

Nome: browser.sessionhistory.max

Nome: browser.sessionhistory.max_total_viewersStatus: user set
Type: integer
Value: 0 (valor opcional, desativa o cache completamente)

- Reduz o tamanho do cache de memória do histórico .

Para fazer com que estas flags sejam ativas para todos o usuários do firefox é necessário mudar os arquivos que mantém a configuração:

No arquivo defaults/pref/firefox.js altere a linha para o valor 0

pref(”browser.tabs.closeButtons”, 0);

E inseridas as linhas no final do arquivo

pref(”content.notify.ontimer”,true);
pref(”content.notify.interval”,2000000);

No arquivo /usr/lib/firefox/greprefs/all.js

pref(”browser.cache.memory.enable”, false);
pref(”browser.sessionhistory.max_total_viewers”, 0);

Pronto agora você está com o seu firefox Tunado esse sim é um 2.0 XD

Agradecimentos ao Cidoloco e a sua publicação no fórum do slackbr, a comunidade do Slackware e principal ao autor do artigo na computerworld.

Referências:
http://www.slackbr.org/forum/viewtopic.php?t=15050
http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=9020880&pageNumber=1


Marco Carvalho de Oliveira
Certificate Linux Professional I – LPI
Colméia – Grupo de Pesquisa em Software Livre
Joinville – UDESC – Ciencia Da Computação

  • Share/Bookmark

Como configurar o file type do seu firefox

Posted by demoncyber | Dicas, Hacking, Linux | Monday 15 September 2008 06:19
CLICK-ME

CLICK-ME

Eis que um colega que está começando a utilizar Slackware me pergunta porque quando ele mandava abrir um arquivo pdf pelo firefox ele não abria, e responde porque o Slackware não vem com isto configurado é apenas um caso de configurar o mimetype ou filetype, daí lhe falo vai lá edit->preferences aba content e clica no botão Manage em File Types, e aí em seguida que nasce o problema aquele X.X trubisco não serve para editar e adicionar um novo file type de jeito maneira, aquilo me revoltou … ( como devem perceber estes artigos ultimamente sobre firefox é porque não gosto dele mesmo… ) então instalei um plugin de firefox que fazia isto resolvi fazer engenharia reversa no bichinho para descobrir qual arquivo precisava alterar e enfim achei que é o mimeTypes.rdf, seguindo na minha procura encontrei mais sobre como configurar ele em um dos sites da mozilla que está nas referências do texto.

Atributos

RDF:about – identificador ( Atributo especial pertencente a raíz )

NC:description – O nome do tipo de arquivo que será mostrado dentro da janela de download
NC:fileExtension – Extensão do arquivo que será manipulado
NC:value – O tipo do MIME de arquivo a ser manipulado
NC:path – caminho da aplicação que será usada para abrir este arquivo
NC:useSystemDefault – true (usa o sistema padrão do seu window manager para este tipo de MIME) ou false (define uma ação diferente para especificar no arquivo qual programa usar)
NC:saveToDisk – true (ação padrão que é baixar o arquivo) ou false ( não baixa o arquivo na máquina)
NC:alwaysAsk – true (perguntar qual a ação ao tratar deste tipo de arquivo) or false (não pergunta ação)
NC:editable – true (entrada pode ser modificada pelo usuário) ou false (entrada como travado)
NC:prettyName – um curto nome da aplicação que será usada para abrir

———————————————————

Cabeçalho do arquivo

Esta é a sessão inicial do seu arquivo de configuração, mantém o cabeçalho indicando onde estão os arquivos de padrão da sintaxe xml do arquivo rdf a ser utilizado.

<?xml version=”1.0″?>
<RDF:RDF xmlns:NC=”http://home.netscape.com/NC-rdf#”
xmlns:RDF=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”>

</RDF:RDF>

/.mozilla/firefox/identificador.defaults/mimeTypes.rdf

———————————————————

Identificador do tipo de arquivo

Neste exemplo estamos criando um identificador global “office/pdf” para o nosso arquivo, passando os atributos de identificação explicados acima.

( NC:handlerProp – Apesar de ter procurado em muitos sites e nas rfcs do MIME não encontrei o atributo handlerProp e o meu empenho em fazer engenharia reversa nos arquivos de especificação do xml utilizado para analizar o arquivo de xml em questão já estavam no máximo -.-, nota eu acredito que o handlerProp serve para apontar para o identificador que contém o recurso do manipulador da especificação descrita)

<RDF:Description RDF:about=”urn:mimetype:office/pdf”
NC:fileExtensions=”pdf”
NC:description=”PDF Files”
NC:value=”office/pdf”
NC:editable=”true”>
<NC:handlerProp RDF:resource=”urn:mimetype:handler:office/pdf”/>
</RDF:Description>

———————————————————

Identificador do manipulador do tipo de arquivo

Neste exemplo estamos criando o manipulador do tipo de arquivo identificador global “office/pdf” para o nosso arquivo, passando os atributos de identificação explicados acima.

( NC:externalApplication – Apesar de ter procurado em muitos sites e nas rfcs do MIME não encontrei o atributo externalApplication e o meu empenho em fazer engenharia reversa nos arquivos de especificação do xml utilizado para analisar o arquivo de xml em questão já estavam no máximo -.-, nota eu acredito que o externalApplication serve para apontar o identificador que contem o recurso de aplicativo externo)

<RDF:Description RDF:about=”urn:mimetype:handler:office/pdf”
NC:alwaysAsk=”false”
NC:handleInternal=”false”
NC:useSystemDefault=”false”
NC:saveToDisk=”false”>
<NC:externalApplication RDF:resource=”urn:mimetype:externalApplication:office/pdf”/>
</RDF:Description>

———————————————————

Identificador do programa externo utilizado para

<RDF:Description RDF:about=”urn:mimetype:externalApplication:office/pdf”
NC:path=”/usr/bin/kpdf” />

———————————————————

Identificador pertencente a raíz que serve para adicionar os identificadores utilizados pelo webbrowser
- Mostrar texto das mensagens anteriores -

<RDF:Seq RDF:about=”urn:mimetypes:root”>
<RDF:li RDF:resource=”urn:mimetype:image/png”/>
<RDF:li RDF:resource=”urn:mimetype:office/pdf”/>
</RDF:Seq>

———————————————————
Segue um exemplo concluído

<?xml version=”1.0″?>
<RDF:RDF xmlns:NC=”http://home.netscape.com/NC-rdf#”
xmlns:RDF=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”>
<RDF:Description RDF:about=”urn:mimetype:office/pdf”
NC:fileExtensions=”pdf”
NC:description=”PDF Files”
NC:value=”office/pdf”
NC:editable=”true”>
<NC:handlerProp RDF:resource=”urn:mimetype:handler:office/pdf”/>
</RDF:Description>
<RDF:Description RDF:about=”urn:mimetype:externalApplication:image/png”
NC:path=”/usr/bin/gimp”
NC:prettyName=”Gimp” />
<RDF:Description RDF:about=”urn:mimetype:handler:image/png”
NC:alwaysAsk=”false”
NC:handleInternal=”false”
NC:useSystemDefault=”false”
NC:saveToDisk=”false”>
<NC:externalApplication RDF:resource=”urn:mimetype:externalApplication:image/png”/>
</RDF:Description>
<RDF:Description RDF:about=”urn:mimetype:externalApplication:office/pdf”
NC:path=”/usr/bin/kpdf”
NC:prettyName=”KPDF” />
<RDF:Description RDF:about=”urn:mimetype:image/png”
NC:fileExtensions=”png”
NC:description=”PNG Image”
NC:value=”image/png”
NC:editable=”true”>
<NC:handlerProp RDF:resource=”urn:mimetype:handler:image/png”/>
</RDF:Description>
<RDF:Description RDF:about=”urn:mimetype:handler:office/pdf”
NC:alwaysAsk=”false”
NC:handleInternal=”false”
NC:useSystemDefault=”false”
NC:saveToDisk=”false”>
<NC:externalApplication RDF:resource=”urn:mimetype:externalApplication:office/pdf”/>
</RDF:Description>
<RDF:Seq RDF:about=”urn:mimetypes:root”>
<RDF:li RDF:resource=”urn:mimetype:image/png”/>
<RDF:li RDF:resource=”urn:mimetype:office/pdf”/>
</RDF:Seq>
</RDF:RDF>

Espero que tenham gostado =] ….

” Existem aqueles que se contentam em apenas resolver os problemas e existem aqueles que não se contentam resolver sem entender ….” – Demoncyber

Referências:
(Lidas na integra)
http://en.wikipedia.org/wiki/MIME – wikipedia sobre mime
http://www.iana.org/assignments/media-types/ – lista completa de mime media types
http://kb.mozillazine.org/MimeTypes.rdf – exemplo e documentação sobre o arquivo configurado
http://www.w3schools.com/media/media_mimeref.asp – referência para o padrões MIME

RFS
( Obs nenhuma destas RFS foram lidas apenas foi procurado pelos campos chaves os quais não foram encontradas as documentações referentes )

http://www.rfc-editor.org/rfc/rfc2047.txt

http://www.rfc-editor.org/rfc/rfc822.txt

http://www.rfc-editor.org/rfc/rfc2045.txt

http://www.rfc-editor.org/rfc/rfc2046.txt

http://www.rfc-editor.org/rfc/rfc2047.txt

http://www.rfc-editor.org/rfc/rfc2048.txt

http://www.rfc-editor.org/rfc/rfc2049.txt

  • Share/Bookmark

Como verificar as conexões abertas no seu Linux de várias maneiras

Posted by demoncyber | Artigo, Dicas, Hacking, Linux, Programação | Monday 15 September 2008 05:56
CLICK-ME

NO CLICK-ME THIS TIME :/

Este artigo foi publicado no blog do Colméia , no fórum do slackbr e no vivaolinux :) e por fim público aqui

Como verificar as conexões abertas no seu Linux de várias maneiras

Estivemos com um problema em um projeto que precisava verificar se o serviço xdmcp estava aberto, porém ele não é um processo independente, ele fica interligado ao X, kdm, gdm, xdm, para tanto a solução mais cabível era procurar saber se a porta estava aberta na máquina.

Sim, talvez pudesse existir outras maneiras de resolver isso, mas esta se fez mais interessante. A clássica solução que me veio a cabeça foi usar o netstat, mas pensei em porque não ir mais a fundo e como resultado venho por este artigo mostrar algumas coisas que aprendi.

As formas que executei este processo foram:

  • Geek hacker ninja style form – procura no proc pelas conexões abertas (mais interessante e a que mais aprendi);
  • Status network – usa o comando de status de rede para listar;
  • Open Files – Procura baseado nos arquivos abertos o que está ligado a porta.

Geek hacker ninja style form

A forma mais baixo nível e estilosa =], vamos aos arquivos de kernel analisar suas saídas, está é a base utilizada por programas como o netstat, o qual converte os dados deste e mostra com uma saída personalizada. Foi publicado um artigo antes explicando sobre a conversão de bases, então não vou abordar este assunto aqui.

O arquivo em questão utilizado é o /proc/net/tcp.

Exemplo de /proc/net/tcp:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

0: 9E00A8C0:D3FD E1D7BCCD:1F4A 01 00000000:0003163C 00:00000000 00000000  1000        0 383991 1 cb042500 102 12 4 2 100

1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 626508 1 c299db80 750 0 0 2 -1

Onde:

  • sl: O número de identificador da linha.
  • local_address: O endereço local e o número da porta do socket. O endereço local está codificado em little-endian em quatro seqüências de números em hexadecimal, isso significa que o byte mais importante é listado primeiro e você necessita fazer a inversão da ordem dos bytes para converter para o endereço de IP. O número da porta é um hexadecimal simples utilizado pelo programa.
  • rem_address – O endereço remoto e o número da porta do socket. O endereço local está codificado em little-endian em quatro seqüências de números em hexadecimal, isso significa que o byte mais importante é listado primeiro e você necessita fazer a inversão da ordem dos bytes para converter para o endereço de IP. O número da porta é um hexadecimal simples.
  • st: Status do socket (depois de muita busca encontrei onde estava o padrão de código daqui e o porque do valor ficar com 0A – segue tabela de referência no final).
  • tx_queue rx_queue: O tamanho de transmissão e recebimento das filas de pacotes.
  • tr tm->when: tr é o campo que indica se o medidor de tempo está ativo para este socket. Um valor zero indica que o medidor de tempo não está ativo. O tm->when indica tempo que o sock está sendo utilizado em jiffies (usado basicamente para debug).
  • retrnsmt: Campo de informação interna do socket do kernel (usado basicamente para debug).
  • uid: O uid do usuário dono da conexão.
  • time-out: Campo de informação interna do socket do kernel (usado basicamente para debug).
  • inode: Um número encriptado de identificação do socket para o sistema de arquivos do Linux (não encontrei qual é a criptografia utilizada aqui).

Achei a representação padrão do cat do arquivo /proc/net/tcp muito extensa, então refiz ela na horizontal para melhor explicar o exemplo acima e traduzi alguns dados:

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode

0: 9E00A8C0:D3FD E1D7BCCD:1F4A 01 00000000:0003163C 00:00000000 00000000  1000        0 383991 1 cb042500 102 12 4 2 100

1: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 626508 1 c299db80 750 0 0 2 -1

sl : 0 – linha indicadora da primeira conexão

local_address: 9E00A8C0:D3FD – convertendo fica 192.168.0.158:151775

rem_address: E1D7BCCD:1F4A – convertendo fica 205.188.215.225:8010

st: 01 – TCP ESTABELISHED – conexão estabelecida

tx_queue rx_queue: 00000000:0003163C – fila de dados transmitidos

tm->when retrnsmt: 00:00000000 00000000 – dados utilizados para debug

uid: 1000 – id do usuário dono da conexão

timeout: 0 – dado utilizado para debug

inode: 383991 1 cb042500 102 12 4 2 100 – identificador criptografado

sl : 1 – linha indicadora da primeira conexão

local_address: 00000000:0016 – convertendo fica localhost:22

rem_address: 00000000:0000 – não tem ninguém conectado

st: 0A – TCP_LISTEN – escutando conexão

tx_queue rx_queue: 00000000:0003163C – fila de dados transmitida

tm->when retrnsmt: 00:00000000 00000000 – dados utilizados para debug

uid: 1000 – id do usuário dono da conexão

timeout: 0 – dado utilizado para debug

inode: 383991 1 cb042500 102 12 4 2 100 – identificador criptografado

Status network

Podemos ver as conexões abertas através do comando netstat. O mesmo é um programa de estatísticas de rede utilizado amplamente para este fim. Não tem muitos segredos e as informações que ele mostra são muito legíveis. Alguém percebeu a similaridade com um outro arquivo no modo que as informações aparecem? :)

# netstat -tl – lista as conexões abertas de tcp em modo de escuta

# netstat -t – lista as conexões tcp estabelecidas

# netstat -p – lista os programas que estão usando a conexão

# netstat –numeric-ports – não converte o número da porta para ser listado

# netstat –numeric-hosts – não converte o número de ip para nome do host

Comando que resolveu meu problema:

# netstat -t -l -p –numeric-ports

Open Files

Vendo as conexões abertas através do comando lsof. O comando lsof lista os arquivos abertos, através disto vamos procurar o arquivo aberto relacionado às portas tcp.

Obs.: Ele pode pegar muitas informações interessantes sobre os arquivos abertos, mas não é escopo deste artigo. :)

Sintaxe: lsof -i protocolo

Exemplo:

# lsof -i tcp

Tabela de dados para o status do socket – versão do kernel 2.6.21.5 Slackware Linux 12

st status socket values
significado valor
TCP_ESTABLISHED 01
TCP_SYN_SENT 02
TCP_SYN_RECV 03
TCP_FIN_WAIT1 04
TCP_FIN_WAIT2 05
TCP_TIME_WAIT 06
TCP_CLOSE 07
TCP_CLOSE_WAIT 08
TCP_LAST_ACK 09
TCP_LISTEN 0A
TCP_CLOSING 0B
TCP_MAX_STATES 0C

Ambiente de teste

  • Slackware 12.0
  • kernel 2.6.21.5

Conclusão

Estas foram apenas algumas maneiras, devem ter mais. Espero que tenham gostado e que algum dia isto seja útil a alguém =], bom para mim foi um grande aprendizado.

(Desculpe qualquer erro de português :X)

Definições

jiffy – medida utilizada para representar o uso de uma tarefa em chamadas de interrupção no processador (medida em um Linux com kernel 2.6.13 em um Intel 386 é de 4 ms ou 1/250 avos de um segundo)

Referências

  • Share/Bookmark
Get Adobe Flash playerPlugin by wpburn.com wordpress themes