Professional Documents
Culture Documents
[REDOS AL DETALLE]
Por David Kotriksnov (a.k.a. SH4V) | N3t-Datagrams.net
N3T-DATAGRAMS [REDOS AL DETALLE]
DROP dataBASE
EL PROBLEMA:
Los sistemas NFA (marcha atrás) pueden confirmar con rapidez una
coincidencia, sin embargo identificar una no-coincidencia en la cadena puede
tomar mucho más tiempo ya que el motor tiene que confirmar que ninguna de
los posibles caracteres a través de la string coincide con la expresión regular.
Es decir, que todos los caracteres tienen que volver a ser testeados. Por tanto,
<script language='javascript'>
var str="abcdefg";
var reg=/^(\w+)+$/;
if (reg.test(str)){
alert('Match found!');
}else{
</script>
<script language='javascript'>
var str="abcdefg^";
var reg=/^(\w+)+$/;
if (reg.test(str)){
alert('Match found!');
}else{
</script>
<script>
var str="abcdefg";
var reg=/^w+$/;
reg.test(str);
</script>
<script>
var str="abcdefg";
var reg=/^(w+)+$/;
reg.test(str);
</script>
N= 2n
EXPLOTACIÓN:
Vamos a ver varios ejemplos de RegExp vulnerables a una Denegación de
Servicio (algunas de ellas sacadas de OWASP) y como explotarlas:
/^(a+)*$/= aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^
//Ingresamos "a" y finalizamos con una excepción. 2³⁹ rutas.
/^(([a-z])+.)+[A-Z]([a-z])+$/= 7
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa^ //2³⁹ rutas.
/^([a-zA-Z0-9])(([\-.]|[_]+)?([a-zA-Z0-9]+))*(@){1}[a-z0-9]+[.]{1}(([a-
z]{2,3})|([a-z]{2,3}[.]{1}[a-z]{2,3}))$/=
12345678901234567890123456789012345678901234567890^ // 2⁵⁰
rutas.
LOCALIZACIÓN:
Ponernos a analizar una expresión regular en busca de posibles DoS puede
ser algo tedioso si no estás familiarizado con las expresiones regulares. No
cuesta nada ponerse y es hasta divertido. Para ahorrar la tarea de analizar
manualmente he desarrollado un programa en JavaScript que analiza mediante
RegExp si hay alguna falla de reDoS. Analizar una expresión regular por medio
de RegExp de forma perfecta es muy complicado por lo que esta aplicación no
es perfecta y puede dar falsos resultados. Aún así tiene un porcentaje de
acierto muy alto, en torno al 95%. Sólo tienes que guardarlo en un archivo de
texto y renombrarlo con extensión htm/html.
David Kotriksnov (a.k.a. SH4V)| N3t-Datagrams.net
N3T-DATAGRAMS [REDOS AL DETALLE]
<html>
<!--
[-] RegExp DoS Analyzer.
[-] Programmed by SH4V.
[-] Visit http://n3t-datagrams.net/ &&
http://foro.undersecurity.net/
[-] Gr33tz to Pr0x, Protos, Lix, OzX, C1c4Tr1Z, N0b0dy,
Yoyahack, S[e]C, Seth, 1995, Dynamique and Undersec
members.
[-] Realizar un programa que localice RegExp
vulnerables a un DoS mediante RegExp es extremadamente
difícil por lo que el programa no es perfecto. En
ocasiones da falsos positivos/negativos.4
[-] Enjoy it :-)
8
-->
<head>
<meta http-equiv='Content-type'
Content='text/html;charset=utf-8'>
<style type="text/css">
#title {
text-align:center;
padding-top:15px;
padding-bottom:15px;
font-family: Arial, Georgia;
font-size: 35px;
color: white;
background-color: #01356e;
}
#form {
background-color: #819ab8;
David Kotriksnov (a.k.a. SH4V)| N3t-Datagrams.net
N3T-DATAGRAMS [REDOS AL DETALLE]
text-align:center;
padding-bottom:1px;
padding-top:10px;
color: white;
}
#result {
background-color:#FFFFFF;
color: #819ab8;
font-family: Arial, Georgia;
text-align:center;
padding-bottom: 400px;
}
#credits{ 9
text-align:center;
font-family: Arial, Georgia;
color: #01356e;
font-size: 11px;
font-weight: bold;
</style>
</head>
<title>RegExp Denial of Service Analyzer</title>
<body>
<div id='title'>RegExp Denial of Service Analyzer</div>
<div id='form'><form name='formu' method='post'>
<input type='text' name='entrada' size= 37>
<input type='button' onClick='proform()'
value='Comprobar RegExp'>
</form></div>
<div id='result'><h1><br /></h1></div>
<script>
function cutpast(strg,sym){
strg=strg.split(sym);
strg=strg.join('*');
return strg;
10
}
function proform(){
var str = document.formu.elements["entrada"].value;
if (str.match(/script/i)){
alert('Intentó un DOM bassed XSS. Si esta medida de
seguridad interfiere en el análisis de su RegExp,
desactívela modificando el código fuente.');
}else{
countdown();
}
}
function countdown(){
if(tru){
var str = document.formu.elements["entrada"].value;
str=cutpast(str,"+");
if (reg.test(str)){
control=reg.exec(str)[0];
control=cutpast(control, "|");
if(control.split('*').length){
alert("Posible reDoS! Revise las RegExp.");
var sh0w=
document.formu.elements["entrada"].value.split("\"").jo
in('').split("\'").join('');
result.innerHTML="<h2>Posible reDoS en:
"+sh0w+"</h2>";
}
}else{
alert('Sin riesgo de alerta... :)'); 11
result.innerHTML="<h2>No se encontraron patrones
peligrosos pero se recomienda hacer una revisión
manual.</h2>";
}
}else{
per++;
if (per==100){tru=true;}
countd=setTimeout('countdown()',25);
result.innerHTML="<h1>"+per+"% Completado</h1>";
}
}
</script>
<div id='credits'>N3t-Datagrams / David Kotriksnov
(a.k.a. SH4V)</div>
</body>
</html>
LECTURAS RECOMENDADAS:
http://www.owasp.org/index.php/Regular_expression_Denial_of_Se
rvice_-_ReDoS
http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
AGRADECIMIENTOS:
Gr33tz to Pr0x, Protos, Lix, OzX, C1c4Tr1Z, N0b0dy, Yoyahack, S[e]C, Seth,
1995, Dynamique and Undersec members.