elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Temas
Páginas: [1] 2
1  Seguridad Informática / Nivel Web / Efectividad de los Procedimientos Almacenados. en: 15 Febrero 2010, 04:03 am
Abri este post en relacion a una desvirtuacion que estaba creando aca :

http://foro.elhacker.net/nivel_web/asp_vulnerable_a_sqli_por_iis-t284500.0.html

Y entiendo tu punto WHK, revise el link que colocaste pero... el procedimiento es mas dificil de alterar los valores que recibe en relacion a las magic quotes o escape_querys, ya que el procedimiento si valida todos los datos que le llegan y no permite concatenaciones raras ni mucho menos. No digo que sea 100% no vulnerable porque creo que nada es 100% seguro, pero el que ataca la tiene mas chungo intentando bypassear un procedimiento almacenado... imaginate que en vez el id en este caso sea el numero de identificacion personal de alguien... claro puedes despues de mucho intento al azar encontrar una persona que tenga un id personal parecido a otra... pero considerando que las posibilidades son como el numero de la loteria. Las excepciones ya te comente como podria manejarlas para que el gracioso que ataque ni se entere de ver una excepcion retornada por el motor.

Quiero enterarme de la efectividad de vulnerar un procedimiento almacenado, como obligarlo a que llegue la query que alguien le manda? ese es mi dilema. Porque le estoy dando vueltas (no para atacar a nadie) sino para conocer que tan efectivo es y que tanto aplicaria llevarlo a una aplicacion de escritorio.
2  Programación / Bases de Datos / Mini-Bug en MySQL en: 4 Enero 2010, 22:42 pm
Puesto que reporte esto al bug tracking tool de MySQL y ellos hicieron caso omiso, diciendome que el tipo BINARY leia binarios no caracteres y cerraron el tema (Esto yo ya lo sabia), cuando les pregunte otra cosa  :xD  quiero advertir a todos los que alguna vez quieran usar tipo de datos BINARY en sus tablas.

Tengo este escenario de ejemplo:

Código
  1.  
  2. mysql> CREATE TABLE ejemplo(
  3.    -> nombres BINARY(20));
  4. Query OK, 0 ROWS affected (0.39 sec)
  5.  
  6. mysql> INSERT INTO ejemplo VALUES('Juan'),('Pepe'),('Jose');
  7. Query OK, 3 ROWS affected (0.00 sec)
  8. Records: 3  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> SELECT * FROM ejemplo;
  11. +----------------------+
  12. | nombres              |
  13. +----------------------+
  14. | Juan                 |
  15. | Pepe                 |
  16. | Jose                 |
  17. +----------------------+
  18. 3 ROWS IN SET (0.00 sec)
  19.  

Hasta ahi como pueden ver todo funciona perfectamente bien  :D  ahora que ocurre si se quiere actualizar o eliminar algun dato, observen:

Código
  1.  
  2. mysql> UPDATE ejemplo SET nombres = 'Carlos' WHERE nombres = hex('Juan');
  3. Query OK, 0 ROWS affected (0.00 sec)
  4. ROWS matched: 0  Changed: 0  Warnings: 0
  5.  
  6. mysql> UPDATE ejemplo SET nombres = 'Carlos' WHERE nombres = 'Juan';
  7. Query OK, 0 ROWS affected (0.00 sec)
  8. ROWS matched: 0  Changed: 0  Warnings: 0
  9.  
  10. mysql> DELETE FROM ejemplo WHERE nombres = 'Pepe';
  11. Query OK, 0 ROWS affected (0.00 sec)
  12.  
  13. mysql> SELECT * FROM ejemplo;
  14. +----------------------+
  15. | nombres              |
  16. +----------------------+
  17. | Juan                 |
  18. | Pepe                 |
  19. | Jose                 |
  20. +----------------------+
  21. 3 ROWS IN SET (0.00 sec)
  22.  

Un poco chungo no??? no elimino, ni actualizo nada... (Utilize la funcion HEX por recomendacion de la gente de MySQL ya que ellos decian que usase esta funcion para actualizar los datos y cerraron el reporte del bug, pero obviamente No funciona como pueden ver).

Ahora se que muchos diran ese problema se resuelve con un simple ALTER si claro, observen:

Código
  1.  
  2. mysql> DESCRIBE ejemplo;
  3. +---------+------------+------+-----+---------+-------+
  4. | FIELD   | TYPE       | NULL | KEY | DEFAULT | Extra |
  5. +---------+------------+------+-----+---------+-------+
  6. | nombres | BINARY(20) | YES  |     | NULL    |       |
  7. +---------+------------+------+-----+---------+-------+
  8. 1 ROW IN SET (0.00 sec)
  9.  
  10. mysql> ALTER TABLE ejemplo MODIFY nombres VARCHAR(25);
  11. Query OK, 3 ROWS affected (0.45 sec)
  12. Records: 3  Duplicates: 0  Warnings: 0
  13.  
  14. mysql> UPDATE ejemplo SET nombres = 'Carlos' WHERE nombres = 'Juan';
  15. Query OK, 0 ROWS affected (0.00 sec)
  16. ROWS matched: 0  Changed: 0  Warnings: 0
  17.  
  18. mysql> DELETE FROM ejemplo WHERE nombres = 'Pepe';
  19. Query OK, 0 ROWS affected (0.00 sec)
  20.  
  21. mysql> SELECT * FROM ejemplo;
  22. +----------------------+
  23. | nombres              |
  24. +----------------------+
  25. | Juan                 |
  26. | Pepe                 |
  27. | Jose                 |
  28. +----------------------+
  29. 3 ROWS IN SET (0.00 sec)
  30.  

Agur... no funciona. He reiniciado el servidor MySQL he reiniciado mi PC, he vuelto a ingresar al motor despues de reiniciado todo he intentado nuevamente lo anterior expuesto y NADA sigue sin Eliminar o Actualizar ningun dato.

Este problemita aplica tambien para tablas con otro tipo de dato (CHAR, VARCHAR, etc) y le cambies dicho campo a BINARY con ALTER, por ejemplo:

Código
  1.  
  2. mysql> CREATE TABLE ejemplo2(
  3.    -> nombres VARCHAR(20));
  4. Query OK, 0 ROWS affected (0.38 sec)
  5.  
  6. mysql> INSERT INTO ejemplo2 VALUES('pepe'),('Juan'),('pedro'),('luis');
  7. Query OK, 4 ROWS affected (0.00 sec)
  8. Records: 4  Duplicates: 0  Warnings: 0
  9.  
  10. mysql> SELECT * FROM ejemplo2;
  11. +---------+
  12. | nombres |
  13. +---------+
  14. | pepe    |
  15. | Juan    |
  16. | pedro   |
  17. | luis    |
  18. +---------+
  19. 4 ROWS IN SET (0.00 sec)
  20.  
  21.  
  22.  

Hasta ahi todo bien... de hecho puedo borrar o actualizar con el tipo de datos VARCHAR:

Código
  1.  
  2. mysql> UPDATE ejemplo2 SET nombres = 'Cucu' WHERE nombres = 'pepe';
  3. Query OK, 1 ROW affected (0.00 sec)
  4. ROWS matched: 1  Changed: 1  Warnings: 0
  5.  
  6. mysql> SELECT * FROM ejemplo2;
  7. +---------+
  8. | nombres |
  9. +---------+
  10. | Cucu    |
  11. | Juan    |
  12. | pedro   |
  13. | luis    |
  14. +---------+
  15. 4 ROWS IN SET (0.00 sec)
  16.  
  17.  
  18.  

Hasta ahi todo bien ahora miren esto:

Código
  1.  
  2. mysql> ALTER TABLE ejemplo2 MODIFY nombres BINARY(20);
  3. Query OK, 4 ROWS affected (0.27 sec)
  4. Records: 4  Duplicates: 0  Warnings: 0
  5.  
  6. mysql> SELECT * FROM ejemplo2;
  7. +----------------------+
  8. | nombres              |
  9. +----------------------+
  10. | Cucu                 |
  11. | Juan                 |
  12. | pedro                |
  13. | luis                 |
  14. +----------------------+
  15. 4 ROWS IN SET (0.00 sec)
  16.  
  17. mysql> UPDATE ejemplo2 SET nombres = 'Marta' WHERE nombres = 'Cucu';
  18. Query OK, 0 ROWS affected (0.00 sec)
  19. ROWS matched: 0  Changed: 0  Warnings: 0
  20.  
  21.  
  22.  

No actualizo el dato tampoco borra para el que quiera intentarlo, ahora hago nuevamente ALTER para que mi tipo de dato sea otra vez VARCHAR pensando vagamente que esto resolvera este problema:

Código
  1.  
  2. mysql> ALTER TABLE ejemplo2 MODIFY nombres VARCHAR(20);
  3. Query OK, 4 ROWS affected (0.10 sec)
  4. Records: 4  Duplicates: 0  Warnings: 0
  5.  
  6. mysql> DESCRIBE ejemplo2;
  7. +---------+-------------+------+-----+---------+-------+
  8. | FIELD   | TYPE        | NULL | KEY | DEFAULT | Extra |
  9. +---------+-------------+------+-----+---------+-------+
  10. | nombres | VARCHAR(20) | YES  |     | NULL    |       |
  11. +---------+-------------+------+-----+---------+-------+
  12. 1 ROW IN SET (0.00 sec)
  13.  
  14. mysql> UPDATE ejemplo2 SET nombres = 'Marta' WHERE nombres = 'Cucu';
  15. Query OK, 0 ROWS affected (0.00 sec)
  16. ROWS matched: 0  Changed: 0  Warnings: 0
  17.  
  18.  
  19.  

Como pueden ver en el campo Changed:0 indica que no actualizo los datos aun siendo VARCHAR  :-\  tampoco elimina los datos siempre y cuando usemos constantes digase campo = algo

Reiniciar el motor MySQL no resuelve este problema, tampoco reiniciar el servidor como tal.

Porque coloco esto aqui? por el simple hecho de que si alguien tuviera un foro como este, con tablas llenas de datos millones de ellos, y alguien de alguna manera hackea la DB y hace un ALTER y coloca campo BINARY y luego un ALTER para retornar a VARCHAR y digamos que ese campo donde se aplico eso, es el campo Mensajes (POST) del foro, y luego ese usuario se antoja de entrar al foro y insultar , ofender y llenarlo de SPAM y el Admin no va a poder eliminar dichos posts... y tampoco recibira Error no Warnings recibira nada... Y asumo que lo mismo podria ocurrir a la hora de Banear a un usuario por su nick.

Por eso posteo eso aca, porque aunque es dificil lograr acceder como admin a un motor MySQL para hacer estos cambios, siempre buscan la via de llegar, y no es nada gracioso para ningun DBA ver que no puede borrar ni actualizar datos del motor y No saber porque.

Un saludo.
3  Programación / Scripting / Quitar 1 expresion con SED en: 13 Diciembre 2009, 23:01 pm
Hola.  :D

Estoy haciendo una migracion manual de un dumpeo de un esquema de MySQL hacia Oracle. (Se que puedo utilizar ETL gratuitos o Oracle Workbench) pero no es el caso, no hay servidor grafico y no puedo instalar muchas cosas raras en el PC que es.

Bien asi que la migracion que en este caso son sencillas (tablas nada de procedimientos, ni triggers ni funciones) he creado el siguiente script en bash que me serviria con una unica falla:

Código
  1. #!/bin/bash -x
  2.  
  3. mensaje="UNLOCK TABLES*";
  4. mensajito="LOCK TABLES*";
  5. archivo="/home/marian/pepe/backup.sql";
  6. mensaje1="*";
  7. mensaje2="*";
  8. mensaje3="ENGINE*";
  9. new="/home/marian/pepe/nuevo.txt";
  10. fin="NULL  ";
  11. curva=")";
  12. indices="KEY";
  13. tabla="DROP TABLE*"
  14. extra="``";
  15.  
  16. sed "/$mensaje/d"  $archivo > nuevo.txt
  17. sed "/$mensajito/d" $new > tmp && mv tmp $new
  18. sed "/$mensaje1/d" $new > tmp && mv tmp $new
  19. sed "/$mensaje2/d" $new > tmp && mv tmp $new
  20. sed "/$tabla/d" $new > tmp && mv tmp $new
  21. sed "/$extra/d" $new > tmp && mv tmp $new
  22. sed "s/$indices/UNIQUE/" $new > tmp && mv tmp $new
  23. sed "/^$/d" $new > tmp && mv tmp $new
  24. sed -e "/$mensaje3/G" $new > tmp && mv tmp $new
  25. sed "/$mensaje3/d" $new > tmp && mv tmp $new
  26. sed "s/^$/$curva/" $new > tmp && mv tmp $new
  27.  
  28.  

Mi falla es en la variable $extra="`" como bien saben la comilla inclinada (`) sirve para ejecucion, y no encuentro forma de quitarla con SED en el archivo generado por mysqldump:

Código
  1.  
  2. bash-3.1$ cat nuevo.txt                                        
  3. -- MySQL dump 10.13  Distrib 5.4.3-beta, for pc-linux-gnu (i686)
  4. --                                                              
  5. -- Host: localhost    Database: primaria                        
  6. -- ------------------------------------------------------      
  7. -- Server version       5.4.3-beta                              
  8. --                                                              
  9. -- Table structure for table `copia`                            
  10. --                                                              
  11. CREATE TABLE `copia` (                                          
  12.  `data` int(11) DEFAULT NULL,                                  
  13.  `apellidos` char(20) DEFAULT NULL,                            
  14.  UNIQUE `data` (`data`)                                        
  15. )                                                              
  16. --                                                              
  17. -- Dumping data for table `copia`                              
  18. --                                                              
  19. INSERT INTO `copia` VALUES (1,'Lopez'),(2,'Sanchez'),(2,'Sanz'),(5,'Heredia'),(4,'Mendeira');
  20. --                                              
  21.  
  22.  

Lo que la variable $extra en este caso me esta haciendo es eliminandome todas las lineas donde encuentre la dichosa comilla `valor` la linea completa  :-\  y yo solo quiero que por ejemplo a:

CREATE TABLE `copia`

me lo deje como

CREATE TABLE copia

lo unico que quiero eliminar es la comillita simple inclinada no el valor dentro de la misma.

Alguien sabe como puedo hacer eso con el comando SED en Linux?
4  Seguridad Informática / Hacking / Ocultar virus sin cambiar tamano en: 27 Noviembre 2009, 16:57 pm
Hola, quisiera saber si existe la manera de ocultar un archivo de cualquier extension dentro de una imagen por ejemplo, sin que se afecte el tamanio de la imagen como tal.

El objetivo es tener una copia del archivo original pero con un archivo extra copiado dentro de si mismo. Pero tanto el archivo original como el modificado con una copia de otro dentro deben tener el mismo tamanio.

Existe alguna herramienta para ello?

PD: No estoy intentando infectar ni ocultar virus, es para otro asunto.
5  Programación / Bases de Datos / Optimizacion MySQL (Para programadores y DBA) en: 18 Noviembre 2009, 15:24 pm
Esto solo es el primer paso de como optimizar un motor MySQL para mejores resultados. Ire ofertando mas nuevas implementaciones en el futuro cercano.

Citar

EXPLAIN MySQL es una herramienta indispensable (no la única) a la hora de realizar tareas de otpimización sql.

Explain MySQL no es más que una manera de mostrar como MySQL procesa las sentencias SQL mediante sus índices y uniones. El uso de Explain MySQL permite ayudar a los DBAs, en una primera instancia, a mejor el diseño de base de datos agregando índices y permitiendo una selección de consultas más óptimas.

Lo único que debemos hacer para hacer uso de Explain MySQL es anteponer “Explain” a la SQL deseada.


    
Código
  1. EXPLAIN SELECT * FROM `localidades` WHERE id =1


Ejecutando esta SQL, MySQL nos indica como la está procesando y nos mostrará un listado con información sobre índices, tablas, resultados, etc.

En el resultado de explain de mysql visualizaremos una tabla con 10 columnas de información para cada tabla implicada




De las columnas anteriores cabe destacar:

1. type: Esta columna indica el tipo de unión que se está usando (de más a menos óptimo).

Donde SIMPLE (Es cuando no se usan Uniones o SubConsultas)
Donde UNION (Es cuando usamos la clausula UNION en 2 tablas)
Donde SubQUERY ( Es cuando usamos Subconsultas)


2. const: Es la más óptima y se dá cuando la tabla tiene como máximo una fila que coincide. Como solo hay una fila coincidente, MySQL la considerará como constante por el optimizador.

3. eq_ref: Una fila será leída de la tabla A por cada combinación de fila de la tabla B. Este tipo es usada cuando todas las partes de un índice son usados para la consulta y el índice es UNIQUE o PRIMARY

4. ref: Todas las filas con valores en el índice que coincidan serán leídos desde esta tabla por cada combinación de filas de las tablas previas. Si la clave que es usada coincide sólo con pocas filas, esta unión es buena.

5. range: Sólo serán recuperadas las filas que estén en un rango dado, usando un índice para seleccionar las filas. La columna key indica que índice se usará, y el valor key_len contiene la parte más grande de la clave que fue usada. La columna ref será NULL para este tipo.

6. index: Este es el mismo que ALL, excepto que sólo el índice es escaneado. Este es usualmente más rápido que ALL, ya que el índice es usualmente de menor tamaño que la tabla completa.

7. ALL: Realiza un escaneo completo de tabla por cada combinación de filas de las tablas previas. Este caso es el peor de todos.

8. possible_keys: Esta columna indica los posibles índices a utilizar en la consulta

9. key: Esta columna indica el indice que MySQL actualmente está usando. Esta columna es NULL si no se ha elegido ninguno. Es interesante saber que podemos forzar a MySQL a usarlo (y también a ignorarlo) mediante el uso de FORCE INDEX, USE INDEX o IGNORE INDEX

10. key_len: El tamaño del índice usado. A menor valor mejor.

11. ref: La columna ref muestra que columna o constante es usada junto a la key para seleccionar las columnas de la tabla

12. rows: Indica el número de columnas que MySQL cree necesario examinar para ejecutar la SQL.

13. extra: Indica información adicional de como MySQL ha resuelto la SQL y hay que prestar atención si aparece USING FILESORT o USING TEMPORARY. En el primer caso, indica que MySQL debe hacer un paso extra para recuperar la información. En el segundo, MySQL necesita generar una tabla extra para mantener la información y después mostrarla y es típico al usar GROUP BY u ORDER BY.

En ocasiones, MySQL puede mostrar ALL en la columna type cuando:

1. La tabla es tan pequeña que MySQL ve más rapido hacer un escaneo completo de la tabla.

2. No hay restricciones usando las cláusulas ON o WHERE.

3. Se compara columnas indexadas con valores constantes.

4. Las claves utilizadas devuelven muchos registros que coinciden con el valor.

Aún así, hay que decir que éste no es el único método de optimización SQL, aunque es uno bueno


Fuente de lo publicado Anteriormente:
http://www.sergiquinonero.net/explain-mysql-o-como-optimiza-sql.html
6  Foros Generales / Sugerencias y dudas sobre el Foro / Falla al validar sección en: 1 Septiembre 2009, 19:51 pm
Hola.

En varias ocasiones navegando y posteando por el foro me ha ocurrido esto, al clickear Enviar o Modificar o Refrescar pagina:



Aun permaneciendo logeada, y no puedo postear o responder o hacer nada (Si navegar) durante al menos 3 minutos... esto no solia pasarme.

Existe alguien mas que haya tenido este inconveniente con este foro?
7  Programación / Scripting / Python, que es __name__ == "__main__"? en: 15 Agosto 2009, 19:30 pm
Es una pregunta extremadamente tonta lol...  ;D

Pero realmente como no he encontrado definicion exacta sobre el tema. En que ocasiones, para que y que significado tiene en Python hacer :

if __name__ == "__main__"

:)

Gracias.
8  Programación / PHP / Organizar Tabla HTML en: 25 Abril 2009, 07:14 am
Hola.

Tengo un sencillo hasta el momento formulario en Html lo unico que hace es tener un textbox para que el usuario inserte la palabra a buscar en la base de datos. Bien tengo el archivo PHP que recibe los datos del formulario html :

Código
  1.  
  2. require_once("requisito.php");
  3.  
  4. class Seleccion extends Rosa {
  5.  
  6. public function Conectando() {
  7.  
  8. $varia = $_POST['palabra'];
  9.  
  10. try {
  11.  
  12. if ( $conexión = mysql_connect($this->servidor, $this->usuario, $this->contrasena) ) {
  13. mysql_select_db("primaria", $conexión);
  14.  
  15. $consulta = mysql_query("SELECT * FROM ejemplo WHERE nombres LIKE '$varia%'", $conexión) or die(mysql_error());
  16.  
  17. if ( mysql_num_rows($consulta) == 0 ) {
  18.  
  19. echo "No hay datos\n";
  20.  
  21. }
  22.  
  23. /* Aca en este Punto me imprime la tabla primero lo que esta dentro del bucle While,
  24.     y al finalizar la devuelta de registros, me imprime la cabecera de la tabla */
  25.  
  26. print "<table border=2><tr><td bgcolor='red'>TITULO</td><td bgcolor='gray'>NOMBRES</td></tr>";
  27.  
  28. while ($registros = mysql_fetch_array($consulta, MYSQL_NUM)) {
  29. print "<td bgcolor='orange'>$registros[0]</td><td  bgcolor='blue'>$registros[1]</td></tr>";
  30.  
  31. }
  32. print "</table>";
  33.  
  34. mysql_free_result($consulta);
  35.  
  36. } else {
  37.  
  38. throw new Exception("Error al consultar\n");
  39.  
  40. }
  41.  
  42.  
  43. } catch ( Exception $e ) {
  44.  
  45. print $e->getMessage();
  46.  
  47. }
  48.  
  49. }
  50.  
  51. function __destruct() {
  52.  
  53. $this->servidor = null;
  54. $this->usuario = null;
  55. $this->contrasena = null;
  56.  
  57. }
  58.  
  59. }
  60.  
  61. $personas = new Seleccion();
  62. $personas->Conectando();
  63.  
  64.  
  65.  

Como indico dentro del codigo en la linea del While, al imprimirme los resultados en una web, me salen primero los registros devueltos encontrados en la tabla y luego al final me pone la cabecera de la Tabla  :-\  no deberia funcionar al inverso? puesto que declaro la tabla primero que el bucle while....? O estoy obviando algo...
9  Foros Generales / Sugerencias y dudas sobre el Foro / El mensaje personal no se pudo enviar excediste limite mensajes personales en: 4 Diciembre 2008, 23:19 pm
Tengo como 8 dias que no envio 1 solo mensaje personal a nadie.....

Como es esto que excedi el envio de mensajes personales??? Queria enviar uno hoy y me sale con esa.   :P
10  Programación / Java / Evaluar Variable cuando esta vacia en: 3 Diciembre 2008, 23:19 pm
Hola, estoy recien aprendiendo Java.  :rolleyes:

Bueno tengo una variable tipo caracteres, y quiero que cuando el usuario deje esto vacio, pues salga algun warning o algo asi, pero el codigo me esta obviando eso, y me esta imprimiendo el otro valor  :-\  todavia estoy un poco liada en cuanto al manejo de excepciones en Java ... cualquier tipo de explicacion se apreciaria  :rolleyes:

Código
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class Sol {
  5.  
  6. public static String palabra;
  7.  
  8. public static void main(String[] args) throws IOException {
  9.  
  10.  
  11. int numeral = 15;
  12.  
  13. Verdura.naranja(numeral);
  14.  
  15. System.out.println("Inserta palabra");
  16. palabra = a.readLine();
  17.  
  18. if ( palabra == "" ) {
  19. System.out.println("Debiste poner algo");
  20. } else {
  21. Verdura.naranja(palabra);
  22. }
  23. }
  24. }
  25.  
  26. class Verdura {
  27.  
  28. private static int numero = 10;
  29. private static int numero1 = 20;
  30.  
  31. public static int naranja(int numeral) {
  32.  
  33. System.out.println("Respuesta es " + numeral+(numero*numero1));
  34.  
  35. return 0;
  36. }
  37.  
  38. public static void naranja(String catarata) {
  39.  
  40. try {
  41.  
  42. PrintWriter b = new PrintWriter(new FileWriter("archivo.txt"));
  43.  
  44. b.println(numero);
  45. b.println(numero1);
  46.  
  47. b.close();
  48. } catch (IOException e) {
  49.  
  50. System.out.println("No se puede crear el archivo");
  51.  
  52. }
  53. }
  54. }
  55.  
Páginas: [1] 2
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines