Como recuperar a senha de administrador no Zen Cart?

Vou mostrar como você pode recuperar a sua senha de administrador no Zen Cart, partindo do pressuposto de que pedir a recuperação via email não funcionou. Ainda há esperanças, desde que você seja o admin do site.
Este artigo é voltado para as versões superiores a 1.5.x, mas pode funcionar nas outras. Faça as adaptações cabíveis, caso a sua versão seja diferente, portanto.

LEIA MAIS

Remova o usuário antigo e crie um novo

logoVocê já tentou “de um tudo” – nem pedindo para receber um email com a senha deu certo. Vamos tentar outra abordagem – esta vem direto dos fóruns do Zen Cart.

Crie uma conta temporária

Você pode criar uma conta administrativa temporária no Zen Cart para ter acesso ao painel de controle do sistema de comércio eletrônico.
Para isto, você precisa ter acesso ao banco de dados do servidor em que o Zen Cart se encontra instalado.
Abra o PhpMyAdmin (que o seu provedor deve ter disponível), selecione o banco de dados da sua loja e clique na aba “SQL”. Vamos rodar o seguinte comando:

DELETE FROM admin WHERE admin_name = 'Admin'; 
INSERT INTO admin (admin_name, admin_email, admin_pass, admin_profile) 
VALUES ('Admin', 'admin@localhost', '351683ea4e19efe34874b501fdbf9792:9b', 1);

Não esqueça de alterar os comandos no caso de estar usando prefixos diferenciados nos nomes dos campos – prática comum, quando se está compartilhando o mesmo banco de dados com outras aplicações.

Faça login novamente

Você já pode fechar o PhpMyAdmin e abrir novamente a URL do painel administrativo da sua loja Zen Cart.

Username: Admin
Password: admin

Sem título14
Fique atento para o A maiúsculo da conta Admin.

Exclua a conta Admin e crie uma nova

… e não exatamente nesta ordem. Crie a nova conta primeiro.
Siga os passos:

  • No canto superior direito, clique em Admin Access Management e, em seguida, em Admin Users;
  • Agora, Clique o botão Add User;
  • Preencha com atenção as informações do novo usuário administrativo e selecione o perfil “superuser” para ele;
  • Quando terminar, clique em Insert;
  • Dê um “Logoff” e entre novamente com a nova conta criada;
  • Ao voltar para a tela inicial de administração de usuários, exclua o Admin.

Simples, não? 😉

Zen Cart: Como renomear o diretório admin/ com segurança.

Introdução

Este artigo complementa o artigo sobre como instalar o Zen Cart. Ao final, alguns procedimentos são recomendados para aumentar a segurança do seu site de compras na Internet (ecommerce).
Nas versões mais novas do Zen Cart, este procedimento é mandatório. Você não pode usar o painel de controle administrativo antes de alterar o nome do seu diretório.
Sem título12
Novamente, este procedimento não impede o acesso não autorizado ao seu sistema. Ele apenas o dificulta – uma vez que esconde o testouro dos “malfeitores”.
Nota: Os procedimentos, aqui descritos se referem à versão 1.5.x do Zen Cart. Se você estiver usando uma versão diferente, esteja atento para adequar as instruções à sua realidade.

Como funciona

Ainda que a área administrativa do seu site seja protegida com senha, o manual do Zen Cart recomenda, por segurança adicional, mudar o nome do diretório de acesso a este painel – tornando menos óbvia a sua localização.

Backup

Antes de iniciar este processo, é importante fazer uma cópia de segurança de todos os arquivos do seu sistema de comércio eletrônico e do banco de dados.
Se fazer backup ainda não é um hábito seu, convém adquiri-lo. 😉

O que será feito

O processo será dividido em 2 etapas:

  • mudança do nome do diretório/pasta admin/;
  • teste de login – para certificar de que tudo correu bem.

Mão na massa

Renomeie o diretório admin/

Com o uso do seu programa de FTP ou via SSH, encontre a pasta admin/. Renomeie-a.
Tome o cuidado de não divulgar este novo nome da pasta – ou todo este processo perde seu sentido. É interessante não ‘citar’ esta nova pasta no arquivo robots.txt, caso você o edite futuramente.

Login para testar…

Acesse o diretório renomeado, via web e faça a autenticação.
Por exemplo, em vez de usar a URL http://www.exemplo.com.br/admin, use http://www.exemplo.com.br/novapasta.
Sem título13
Deu tudo certo? Parabéns! Caso contrário, coloque sua dúvida embaixo, nos comments… 😉

Como encriptar um Shell Script com SHC

Neste texto, vou ensinar a baixar, instalar e usar SHC, um programa que encripta o código do seus scritps.
Antes de mais nada, preciso dizer que encriptar seus códigos não é uma prática recomendável. O ideal é documentar todo o script, de forma que qualquer pessoa o possa entender facilmente. Códigos fonte devem ser o mais acessíveis possível — já a informação com a qual eles lidam, é que deve ser restringida.

Se você precisa usar informações, usualmente confidenciais, como senhas, de forma automática, então deve procurar outra solução.
Hmmmm… você ainda está aqui?
bash shell logo on keyboard

Tenha em mente, contudo, que um script codificado através do SHC pode não ser legível para usuários comuns (creio que este seja o seu objetivo) — Contudo, uma pessoa que tenha conhecimento do seu funcionamento pode extrair o código criado pelo software.
Em tempo, SHC quer dizer SHell script Compiler.

Download e instalação

O software de que vamos tratar aqui, foi desenvolvido por Francisco Javier R. Garcia e você vai encontrar sua versão mais atualizada aqui.
Vamos começar com o download do código fonte do programa:


wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz

Uma vez baixado, desempacote e instale:


tar xvfz shc-3.8.9.tgz
cd shc-3.8.9
make

Verifique se tudo correu bem:


./shc -v

shc parse(-f): No source file specified
shc Usage: shc [-e date] [-m addr] [-i iopt] [-x cmnd] [-l lopt] [-rvDTCAh] -f script

Crie um shell script de exemplo

Para testar, você pode usar seu próprio script ou pegar este aqui:

#!/bin/bash
echo -n "Quantos numeros aleatorios voce deseja gerar? "
read max
for (( start = 1; start
do
echo -e $RANDOM
done

rode o script:


./alea.sh

Quantos numeros aleatorios voce deseja gerar? 3
24682
1678
491

Encriptando o seu shell script com shc

Use o comando, a seguir, para fazer o trabalho:


./shc -f alea.sh

isto deverá gerar os seguintes arquivos:


ls -l alea*.*

-rwxrw-r--. 1 user group 149 Mar 27 01:09 alea.sh
-rwx-wx--x. 1 user group 11752 Mar 27 01:12 alea.sh.x
-rw-rw-r--. 1 user group 10174 Mar 27 01:12 alea.sh.x.c

Dos quais:

  • alea.sh é o seu script original
  • alea.sh.x é o seu script em formato binário e encriptado
  • alea.sh.x.c é o código fonte do script original em linguagem C

Após transformar o código do seu script, originalmente escrito em Bash para um script em C, o shc o compila, gerando o executável alea.sh.x.
Veja como testar:


file alea.sh

alea.sh: Bourne-Again shell script text executable

file alea.sh.x

alea.sh.x: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

file alea.sh.x.c

alea.sh.x.c: ASCII C program text

Execute o seu script encriptado


./alea.sh.x

Quantos numeros aleatorios voce deseja gerar? 3
7489
10494
29627

Determine uma data de expiração pro seu script

Com o uso do shc, é possível evitar que o seu script seja executado após uma certa data. Se for feita a tentativa de executar um script que já tenha expirado, uma mensagem de erro será exibida na tela.
Crie um novo script, usando a opção “shc -e“, que permite a entrada de uma data de expiração (que deve ser fornecida no formato dd/mm/yyyy:


./shc -e 31/12/2011 -f alea.sh

Veja o que acontece quando alguém tenta executar um script vencido:


./alea.sh.x

./alea.sh.x: has expired!
Please contact your provider

Você pode criar a sua própria mensagem de expiração, para o caso de redistribuir o seu script para pessoas que não falem inglês, por exemplo. Use a opção ‘-m’ para isto.

Previna-se de ataques SQL Injection

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

Ainda que você não esteja fazendo uso de qualquer um deles (claro que MySQL está incluído), os conceitos se aplicam a qualquer situação que envolva um website com formulários a ser preenchidos pelos visitantes e que dão acesso ao banco de dados.

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