Aporte: Seguridad PHP - CSRF

jtsamper Seguir

Beta
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
26 Dic 2013
Mensajes
60
No se si conoceis este tipo de fallo de seguridad, pero es muy común y en algo puede perjudicar a los bots.

Lo que hace el script es generar un TOKEN para el formulario cada vez qe se carga una pagina. Y que 100% necesario ejecutarlo con javascript para evitar coger su valor, desde texto plano.

Tengo varias funciones que deben estar siempre activas...
PHP:
if (!empty($_POST)) {
    $token = $_POST[$_SESSION["token"]];
    if ($token != $_SESSION["token_seg"]) {
        echo "Acción no permitida";
        exit;
    }
}
generarToken();

function generarToken() {
    $_SESSION["token"] = uniqid("token_");
    $_SESSION["token_seg"] = md5(uniqid());
}

function ToHex($string) {
    $hex = '';
    for ($i=0; $i < strlen($string); $i++) {
        $hex .= '%' . bin2hex($string[$i]);
    }
    return $hex;
}
Y donde tengas un formulario coges y metes esto...
PHP:
<script>document.write(unescape('<?= strtoupper(stringToHex('<input type="hidden" name="' . $_SESSION["token"] . '" value="' . $_SESSION["token_seg"] . '" />')) ?>'));</script>
Esto sacaria algo asi...
HTML:
<script>document.write(unescape('%3C%69%6E%70%75%74%20%74%79%70%65%3D%22%68%69%64%64%65%6E%22%20%6E%61%6D%65%3D%22%74%6F%6B%65%6E%5F%35%32%64%31%33%32%34%35%62%63%36%32%37%22%20%76%61%6C%75%65%3D%22%32%36%61%64%31%31%64%34%31%64%66%36%62%64%37%65%66%64%38%30%61%63%32%66%61%38%30%63%35%32%31%62%22%20%2F%3E'));</script>
Por tanto alguien que intente ver la pagina en texto plano no le mostrara correctamente, esto..
HTML:
<input type="hidden" value="ba7edc0a320ea1577b8afd48dc2d17de" name="token_52d133287ee46">

Pero el navegador si lo leera correctamente siempre y cuando tenga activado JAVASCRIPT...


Espero que os sirva, de esta forma no os pondran inyectar los formularios y no tendreis que depender de ReCaptch o sistemas similares...

Un saludo
 
Última edición:

jtsamper

Beta
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
26 Dic 2013
Mensajes
60
Es propio, lo tuve que hacer para un trabajo.
:)

Tuve que hacer de distintos agujeros que se pueden encontrar en PHP : RFI, Inyection SQL ..
 

snake8d2

Gamma
Programador
Verificado por Whatsapp
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
23 Jun 2012
Mensajes
162
Me parece que estas un poco equivocado... se puede seguir inyectando de igual manera al crear el input manualmente usando una función para decodificar el js:
PHP:
function hexToString( $hexString ) {
    return pack("H*" , str_replace('%', '', $hexString));
}
No es para nada seguro ese sistema.
 
Arriba