• Publicidad

Ayuda con expresión regular

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ayuda con expresión regular

Notapor BigBear » 2011-11-16 11:05 @503

Tengo el siguiente código HTML
Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <meta name="description" content="SecurityFocus is designed to facilitate discussion on computer security related topics, create computer security awareness, and to provide the Internet&apos;s largest and most comprehensive database of computer security knowledge and resources to the public. It also hosts the BUGTRAQ mailing list.">
  7. <meta name="keywords" content="securityfocus, security focus, computer security, information security, security, hack, full disclosure, bugtraq, bugtrack, bugtrac, bugtrag, vulnerability, vulnerabilities, vulnerability database, auditing, spoofing, sniffer, sniffing, exploit, advisory, antivirus, virus, firewall, buffer overflow, overflow, password, windows, windows nt, solaris, linux, crack, cracker, cracking, IDS, intrusion detection, backdoor, backdoors, trojan, cryptography, encryption, authentication, DoS, DDoS, denial of service, syn flooding, smurf, internet security, web security, security tools, security products, vuln-dev, security incidents, incident responce, bugtraq-jp, bugtraq-es, security jobs, sf-news, focus-ms, focus-sun, focus-linux, focus-ids, focus-ih, infowar, information warfare, VPN, virtual private network">
  8. <script language="JavaScript">
  9. var pathname='/home';
  10. var OAS_listpos = 'Top,Middle,Bottom1,Right1,x29,x30,x28';
  11. </script>
  12. <SCRIPT LANGUAGE="JavaScript1.2" SRC="/js/standard.js"></SCRIPT>
  13. <script src="/__utm.js" type="text/javascript"></script>
  14. <link rel="stylesheet" type="text/css" href="/new_SFPS_style.css" />
  15. <title>ISC BIND 9 Recursive Queries Remote Denial of Service Vulnerability</title>
  16.  
  17. </head>
  18.  
  19. <body bgcolor="#ffffff">
  20. <map name="ButtonMap">
  21.   <area shape="rect" coords="139,25,190,45" href="/about">
  22.   <area shape="rect" coords="191,25,249,45" href="/contact">
  23. </map>
  24. <!-- start header -->
  25.  
  26. <a href="/"><div id="logo_new">
  27.                 <div class="headerButtonBar"><img src="/images/site/header_button_bar.gif" width="258" height="45" alt="" usemap="#ButtonMap" border="0"></div>
  28. </div></a>
  29. <div id="bannerAd">
  30. <table width="890" cellpadding="0" border="0" cellspacing="0">
  31.  
  32. <tr><td width="728">
  33. <a href="http://www.symantec.com/connect/" target="_blank"><img src="/images/site/sf-symc-connect-banner.jpg" width="728" height="90" alt="" border="0"/></a>
  34. </td>
  35. <td width="12">&nbsp;</td>
  36. <td width="150" align="right">
  37. &nbsp;
  38. <td>
  39. </tr>
  40. </table>
  41.  
  42. </div>
  43.  
  44. <!-- end header -->
  45.  
  46. <table width="900" cellpadding="0" cellspacing="4" border="0">
  47.         <tr valign="top">
  48.  
  49.                
  50.                 <td>
  51.                         <!-- Start Content -->
  52. <br/>
  53.  <div id="tabs">
  54.   <ul>
  55.         <li><a href="/bid/50690/info">info</a></li>
  56.         <li><a href="/bid/50690/discuss">discussion</a></li>
  57.         <li><a href="/bid/50690/exploit">exploit</a></li>
  58.  
  59.         <li class="here"><a href="/bid/50690/solution">solution</a></li>
  60.         <li><a href="/bid/50690/references">references</a></li>
  61.         </ul>
  62. </div>
  63. <div id="vulnerability">
  64.         <span class="title">ISC BIND 9 Recursive Queries Remote Denial of Service Vulnerability</span><br/><br/>        <b>Solution:</b><br/>
  65.         Currently we are not aware of any vendor-supplied patches. If you feel we are in error or if you are aware of any more recent information, please mail us at: [email protected].<br/><br/>
  66.  
  67.        
  68.        
  69.        
  70.        
  71.        
  72.        
  73.        
  74.        
  75.        
  76.        
  77. </div>
  78.  
  79. <br/><br/>
  80.  
  81.  
  82.                         <!-- End Content -->
  83.                 </td>
  84.         </tr>
  85. </table>
  86. <!-- start footer -->
  87. <table width="900" cellpadding="0" cellspacing="4" border="0">
  88.         <tr valign="top">
  89.  
  90.                 <td width="120">
  91.                 &nbsp;
  92.                 </td>
  93.                 <td>
  94.  
  95. <br/>
  96. <p align="center" style="color: #666; font-size: 8pt;"><a href="/privacy">Privacy Statement</a><br>Copyright 2010, SecurityFocus</p>
  97.  
  98.                 </td>
  99.                 <td width="160">
  100.  
  101.                 &nbsp;
  102.                 </td>
  103.         </tr>
  104. </table>
  105. </body>
  106. </html>
  107.  
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4


Y la expresión regular que tengo es esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($code=~/<div id="vulnerability">
  2. (.*?)  
  3. <\/div>/) {
  4. print "yeah\n";
  5. }
  6.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Como ven solo quiero sacar todo lo que está en <div id="vulnerability"> pero estoy haciendo algo mal, porque no puedo sacar la información que quiero.

¿ Alguien me puede ayudar ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Ayuda con expresión regular

Notapor explorer » 2011-11-16 12:37 @567

No se puede romper un patrón de expresiones regulares en varias líneas, salvo que uses la opción '/x'.

Lo mejor es que lo escribas en una sola línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ($code =~ /<div id="vulnerability">(.*?)<\/div>/s) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Además, le hemos agregado la opción '/s', para indicar que $code consiste en un sola cadena, por lo que el comodín '.' localizará también los finales de línea (y, por lo tanto, podremos buscar texto que está repartido entre varias líneas).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con expresión regular

Notapor BigBear » 2011-11-16 12:44 @572

Gracias por la ayuda, explorer, pero tengo otra duda: mediante la expresión que vos me diste me saca lo que quiero perfecto pero aun así quedan muchos espacios de más en la consola. Mi pregunta es si no hay alguna forma de sacar los espacios de más. Intenté con chomp(), pero nada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
        Adobe Acrobat and Reader CVE-2011-2442 Remote Code Execution Vulnerabili
ty      Solution:
        Updates are available. Please see the references for more information.































































































































































 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con expresión regular

Notapor explorer » 2011-11-16 12:52 @578

Depende de si quieres quitar los que están al principio, al final, o en medio.

Para los dos primeros, lo tienes resuelto en perlfaq4, sección How do I strip blank space from the beginning/end of a string?.

Para el tercero... deberás decidir antes lo que significa "en medio".

El caso extremo sería quitar todos los espacios: s/\s+//g;

O, más prudente, quitar los espacios repetidos: s/\s+/ /g;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con expresión regular

Notapor BigBear » 2011-11-16 13:14 @593

Lo he intentado con los tres casos y directamente no me aparece nada.
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con expresión regular

Notapor explorer » 2011-11-16 15:39 @693

Sin ver el código, es difícil decirte dónde tienes el fallo...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con expresión regular

Notapor BigBear » 2011-11-16 15:44 @697

En la línea 56 está el problema con la hash que te estaba preguntando en otro post.
En línea 113 está el problema de mostrar la respuesta que estaba preguntando en este mismo post.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #DB Exploit Helper 0.4
  3. #(C) Doddy Hackman 2011
  4. ##ppm install http://www.bribes.org/perl/ppm/HTML-Strip.ppd
  5.  
  6. use LWP::UserAgent;
  7. use HTML::Parser;
  8. use HTML::Strip;
  9.  
  10. use Data::Dumper;
  11.  
  12. my $nave = LWP::UserAgent->new;
  13. $nave->agent("Mozilla/5.0 (Windows; U; Windows NT 5.1; nl; rv:1.8.1.12) Gecko/20080201Firefox/2.0.0.12");
  14. $nave->timeout(5);
  15.  
  16. head();
  17. refrescar();
  18.  
  19. sub refrescar {
  20.  
  21.     print "\n[+] List of vulnerabilities\n\n\n";
  22.  
  23.     my %links    = getlinks($code);
  24.     my $contador = -1;
  25.  
  26.     for my $da ( keys %links ) {
  27.         $contador++;
  28.  
  29.         #$links{$da}
  30.         print "[$contador] : $da\n";
  31.     }
  32.     print qq(
  33.  
  34. [1] : Refresh
  35. [2] : All INFO
  36. [3] : Info
  37. [4] : Discussion
  38. [5] : Exploit
  39. [6] : Solution
  40. [7] : References
  41. [8] : Exit
  42.  
  43. );
  44.  
  45.     print "\n[Option] : ";
  46.     chomp( my $op = <stdin> );
  47.  
  48.     if ( $op eq 1 ) { resfrescar(); }
  49.     elsif ( $op eq 2 ) {
  50.     }
  51.     elsif ( $op eq 3 ) {
  52.  
  53.         #http://www.securityfocus.com/bid/50631/info
  54.         print "\n[+] Number : ";
  55.         chomp( my $se = <stdin> );
  56.         print $links[0]{1};
  57.         <stdin>;
  58.         refrescar();
  59.     }
  60.     elsif ( $op eq 4 ) {
  61.         dar( 'Adobe Acrobat and Reader CVE-2011-2442 Remote Code Execution Vulnerability', '49585', "cuatro" );
  62.  
  63.         #http://www.securityfocus.com/bid/50631/discuss
  64.     }
  65.     elsif ( $op eq 5 ) {
  66.  
  67.         #http://www.securityfocus.com/bid/50631/exploit
  68.     }
  69.     elsif ( $op eq 6 ) {
  70.  
  71.         #http://www.securityfocus.com/bid/50631/solution
  72.     }
  73.     elsif ( $op eq 7 ) {
  74.  
  75.         #http://www.securityfocus.com/bid/50631/references
  76.     }
  77.     elsif ( $op eq 8 ) {
  78.         copyright();
  79.         exit(1);
  80.     }
  81.     else {
  82.         refrescar();
  83.     }
  84. }
  85.  
  86. sub dar {
  87.  
  88.     my ( $title, $numero, $op ) = @_;
  89.  
  90.     if ( $op eq "uno" ) {
  91.         $link = "http://www.securityfocus.com/bid/$numero/info";
  92.     }
  93.     if ( $op eq "dos" ) {
  94.         $link = "http://www.securityfocus.com/bid/$numero/discuss";
  95.     }
  96.     if ( $op eq "tres" ) {
  97.         $link = "http://www.securityfocus.com/bid/$numero/exploit";
  98.     }
  99.     if ( $op eq "cuatro" ) {
  100.         $link = "http://www.securityfocus.com/bid/$numero/solution";
  101.     }
  102.     if ( $op eq "cinco" ) {
  103.         $link = "http://www.securityfocus.com/bid/$numero/references";
  104.     }
  105.  
  106.     my $code = toma($link);
  107.  
  108.     if ( $code =~ /<div id="vulnerability">(.*?)<\/div>/s ) {
  109.         my $code = $1;
  110.         chomp $code;
  111.         my $uno = HTML::Strip->new( emit_spaces => 1 );
  112.         my $final = $uno->parse($code);
  113.         print $final;
  114.     }
  115.  
  116.     <stdin>;
  117.  
  118. }
  119.  
  120. sub getlinks {
  121.  
  122.     my $code = toma("http://www.securityfocus.com/");
  123.  
  124.     my $test = HTML::Parser->new(
  125.         start_h => [ \&start, "tagname,attr" ],
  126.         text_h  => [ \&text,  "dtext" ],
  127.     );
  128.     $test->parse($code);
  129.  
  130.     sub start {
  131.         my ( $a, $b ) = @_;
  132.         my %e = %$b;
  133.         unless ( $a ne "a" ) {
  134.             $d = $e{href};
  135.             $c = $a;
  136.         }
  137.     }
  138.  
  139.     sub text {
  140.         my $title = shift;
  141.         chomp $title;
  142.         unless ( $c ne "a" ) {
  143.             if ( $d =~ /\/bid\/(.*)/ ) {
  144.                 my $id = $1;
  145.                 unless ( $title =~ /www.securityfocus.com/ ) {
  146.                     $links{$title} = $id;
  147.                 }
  148.             }
  149.             $d = "";
  150.         }
  151.     }
  152.     return %links;
  153. }
  154.  
  155. sub toma {
  156.     return $nave->get( $_[0] )->content;
  157. }
  158.  
  159. sub repes {
  160.     foreach $test (@_) {
  161.         push @limpio, $test unless $repe{$test}++;
  162.     }
  163.     return @limpio;
  164. }
  165.  
  166. sub head {
  167.     print "-- == SecurityFocus Manager == --\n\n";
  168. }
  169.  
  170. sub copyright {
  171.     print "\n\n\n(C) Doddy Hackman 2011\n\n";
  172. }
  173.  
  174. # The End ?
  175.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2011-11-17 04:20 @222, editado 1 vez en total
Razón: Formateado de código con Perltidy
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con expresión regular

Notapor explorer » 2011-11-17 04:23 @224

No veo que estés aplicando las expresiones regulares a la variable $final.

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$final =~ s/\s+$//g;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra cosa, en la línea 111 tienes puesta emit_spaces => 1. ¿No has probado con emit_spaces => 0?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda con expresión regular

Notapor BigBear » 2011-11-17 08:35 @399

Gracias, explorer, el tema de los espacios ya está solucionado. Ahora me falta el problema del hash en la línea 56, que te venía preguntando en otro post. ¿No me podrías decir cómo puedo usar el hash para poder mandar los parámetros en la función dar() en la línea 61 cuando el usuario presione el número?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Ayuda con expresión regular

Notapor explorer » 2011-11-17 14:05 @628

Por lo que se ve en la línea 146, se trata de un hash que guarda como claves el texto de los enlaces, y como valores el valor de lo que sigue a bid/, del atributo href.

Así que... yo no veo que se guarden los enlaces. Salvo que sea el texto que se guarde como clave.

Se podría hacer un menú numerado con todos los enlaces:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $i = 0;
  2. for my $link (keys %links) {
  3.     print "$i : $link\n";
  4.     $i++;
  5. }
  6. print "Seleccione el enlace: ";
  7. chomp(my $j = <>);
  8. my $enlace_elegido = (keys %links)[$j];   # de la lista de claves, nos quedamos con el $j-ésimo
  9.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esto se puede hacer porque Perl nos garantiza que keys() (y values()) siempre devuelven las claves (y los valores) de un hash en el mismo orden. Así que primero le mostramos una lista al usuario, él elige un número, y ese número lo usamos de índice dentro de la lista de claves.

(keys %links)[$j]

quiere decir:
1.- extrae las claves (keys()) de %links, y agrúpalas en una lista de valores (los paréntesis nos ayudan a agrupar esos valores
2.- de esa lista de valores, ponemos unos corchetes, para acceder a un cierto elemento dentro de esa lista de valores, tal como si tuviéramos un array.

Una vez que tenemos el valor elegido, pues ya podemos pasarlo como argumento a otra función.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 14 invitados