Aporte: Seguridad PHP - CSRF

  • Autor Autor jtsamper
  • Fecha de inicio Fecha de inicio
jtsamper

jtsamper

Beta
Programador
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
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:
tambien hay que publicar la web donde la sacaste 🙂
 
Es propio, lo tuve que hacer para un trabajo.
🙂

Tuve que hacer de distintos agujeros que se pueden encontrar en PHP : RFI, Inyection SQL ..
 
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.
 
Atrás
Arriba