Test Foro de elhacker.net SMF 2.1

Seguridad Informática => Seguridad => Mensaje iniciado por: z3nth10n en 9 Septiembre 2014, 14:38 PM

Título: ¿Protegerme ante posibles ataques de SQLi?
Publicado por: z3nth10n en 9 Septiembre 2014, 14:38 PM
Hola buenas, pues he decido hacer una API para un servicio un tanto especial, tan especial que no me deja manejar ni MySQL ni PHP, por tanto tengo que mandar todas las peticiones a mi página usando JS...

Entonces, ahora mismo lo hago de la siguiente manera:

File.js
====

Código (javascript) [Seleccionar]
var key = "md5 string";

function sendToDB(data) {
accedo al php con un post => sendpost("file.php?key=key&domain="+location.hostname+"&data=data");
}


File.php
=====

Código (PHP) [Seleccionar]
$domain = @$_GET['domain'];
$credentials = mysqli_fetch_array(mysqli_query("SELECT * FROM clientes WHERE domain = $domain", $conn));

if($key == $credentials['key']) {
//Allow access and send data...
$data = @$_GET['data'];
mysqli_query("ENVIAR INFO A LA DB");
}


Entonces eso va genial para las injections ya que si paso la "data" tal como viene, pues apaga y vámonos...

Y como no lo puedo hacer de otra manera, lo único que se me ha ocurrido es enviar la información ("data") de forma cifrada o bien en Base64 o serializando...

No se os ocurre nada más seguro que eso? Quizás por la parte de PHP me puedo proteger más y a parte de usar un mysqli_real_escape_string no se me ocurre nada más... Qué me recomendáis?

Un saludo.
Título: Re: ¿Protegerme ante posibles ataques de SQLi?
Publicado por: #!drvy en 9 Septiembre 2014, 16:18 PM
Usas mysqli_ como si fuese mysql_.  Tienes sentencias preparadas..

http://php.net/manual/es/mysqli.quickstart.prepared-statements.php

Cifrar no te va a servir de nada, tienes que proteger el receptor (file.php) no el emisor(file.js).

Saludos
Título: Re: ¿Protegerme ante posibles ataques de SQLi?
Publicado por: engel lex en 10 Septiembre 2014, 00:42 AM
si es algo que requiere seguridad puedes hacer lo siguiente por seguridad a costo de memoria y tiempo de procesamiento (si no tienes 100 peticiones simultaneas no hay problema por lo menos a mi en una tabla con 720 valores me tarda "0.0020 segundos" la búsqueda)

Código (php) [Seleccionar]
$domain = @$_GET['domain'];
$md5_domain = md5($domain);
$credentials = mysqli_fetch_array(mysqli_query("SELECT * FROM clientes WHERE MD5(domain) = $md5_domain", $conn));


y si quieres agilizar el proceso solo guardas la tabla con los valores listos en MD5 y le quitas al mysql el peso de convertirlos...

el asúnto es que allí ya no hay ataque que pase ya que cualquier cosa rara fue destruida y reducida a un md5...

por cierto, cuidado con ese fetch_array directo sin comprobar si hubo resultado o no, porque va a tirar un error...
Título: Re: ¿Protegerme ante posibles ataques de SQLi?
Publicado por: Graphixx en 10 Septiembre 2014, 02:05 AM
A mi se me ocurre que en el php puedes saber cuando es data oficial, filtrando la peticion por HTTP_REFERER.
Código (php) [Seleccionar]

<?php
$url
=$_SERVER['HTTP_REFERER'];
echo 
'<strong>'."viene de(ruta completa): ".'</strong>'.$_SERVER['HTTP_REFERER'].'<br />';

preg_match'@^(?:http://)?([^/]+)@i'$_SERVER['HTTP_REFERER'], $matches );
$host $matches[1]; 

echo 
'<strong>'."viene de(dominio): ".'</strong>'.$host;
?>


Es solo una idea, no se que tan falsificable sea el HTTP_REFERER.
Título: Re: ¿Protegerme ante posibles ataques de SQLi?
Publicado por: engel lex en 10 Septiembre 2014, 02:10 AM
Cita de: Graphixx en 10 Septiembre 2014, 02:05 AM
A mi se me ocurre que en el php puedes saber cuando es data oficial, filtrando la peticion por HTTP_REFERER.

Es solo una idea, no se que tan falsificable sea el HTTP_REFERER.
falsificable? XD si! lo es y mucho... pero el asunto aquí no es el enlazamiento externo... es que sea victima de un ataque de inyección