• Publicidad

Duda con módulo HTTP::Proxy

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Re: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-15 20:25 @892

No entiendo la segunda expresión regular porque es la que me falta. El código quedó así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $valor = "GET http://localhost/shell.php?upload= HTTP/1.1 dsadsad";
  2.  
  3. #[ver] : GET
  4. #[url] : http://localhost/shell.php?upload=
  5. #[version] : 1.1
  6.  
  7. #verb = request_line[/^\w+/]
  8. #url = request_line[/^\w+\s+(\S+)/, 1]
  9. #version = request_line[/HTTP\/(1\.\d)\s*$/, 1]
  10.  
  11. if($valor=~/^(.*?) (.*?)/) {
  12. print "[+] Metodo : ".$1."\n";
  13. }
  14.  
  15. if($valor=~/^\w+\s+(\S+)/) {
  16. #print $2;
  17. }
  18.  
  19. if($valor=~/HTTP\/1\.(.*) (.*)/) {
  20. print "[+] version : HTTP/1.".$1;
  21. }
  22.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¿ Cómo hago la segunda expresión regular en Perl ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Publicidad

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-03-15 20:33 @898

A ver... si el problema es obtener los campos que están separados por espacios en blanco, ¿no es más fácil usar un simple split()?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $valor = "GET http://localhost/shell.php?upload= HTTP/1.1 dsadsad";
  2.  
  3. my @valor = split " ", $valor;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-15 21:18 @929

explorer, quería preguntarte si había algún modo de obtener esta información usando algún módulo como LWP::UserAgent o Mechanize :

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  GET http://localhost/shell.php
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: __utma=111872281.314525818.1360496478.1360496478.1360759913.2; __utmz=11
1872281.1360496478.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); PHPSESSID=
ue0okrcmjmb6r80mbbkletg866
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿ hay otra forma que no sea con sockets ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-03-16 12:23 @557

Si la información la has obtenido mediante una petición HTTP, pues sí, puedes usar esos módulos para obtener todas las cabeceras de la respuesta.

Pero... ¿qué tiene esto que ver con un proxy?
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: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-16 13:31 @605

nada, solo una pregunta al aire, mira este código :

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $valor = "GET http://localhost/sql.php HTTP/1.1";
  2.  
  3. use IO::Socket;
  4.  
  5. my $socket = IO::Socket::INET->new(Proto => "tcp",PeerAddr=>"localhost",PeerPort =>"80") or die("error");
  6.  
  7. print $socket $valor."\r\n";
  8.  
  9. read $socket,$total,"1000";
  10.  
  11. print $total."\r\n";
  12.  
  13. $socket->close;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Se supone que debe devolver esa petición pero se queda tildado eternamente sin mostrar nada , ¿ hice algo mal ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-03-16 17:10 @757

Seguramente porque le estás pidiendo que lea 1000 bytes, y a lo peor la respuesta que recibes no llega a esa cifra. Y se queda esperando más.

Se puede hacer mucho más sencillo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use LWP::UserAgent;
  2. $ua = LWP::UserAgent->new;
  3. $req = HTTP::Request->new(
  4.     GET => 'http://localhost/sql.php',
  5. );
  6. $res = $ua->request($req);
  7. if ($res->is_success) {
  8.     print $res->as_string;
  9. }
  10. else {
  11.     print "Error: " . $res->status_line . "\n";
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ejemplo sacado del principio de la página de manual lwpcook (en tu ordenador, ejecuta man lwpcook).
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: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-03-16 19:29 @854

Tengo que hacerlo con sockets para hacer el proxy, por suerte ya avance en algo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $valor = "GET http://localhost/sql.php HTTP/1.0";
  2.  
  3. use IO::Socket;
  4.  
  5. my $socket = IO::Socket::INET->new(Proto => "tcp",PeerAddr=>"localhost",PeerPort =>"80") or die("error");
  6.  
  7. print $socket $valor."\r\n\r\n";
  8.  
  9. read $socket,$total,"9999";
  10.  
  11. print $total;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo raro es que si le cambio el 1.0 a 1.1 deja de andar, pero el proxy que te mostré hecho en Ruby usa 1.1 para cargar la misma página de ejemplo, ¿ qué tendría que hacer ?

Quería preguntarte cómo se tendría que cambiar el contenido de la respuesta por un "hola mundo" en este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #############################
  2. # proxy-adkiller
  3. # Mike Schilli, 2012
  4. #############################
  5. use strict;
  6. use HTTP::Proxy;
  7. use HTTP::Proxy::HeaderFilter::simple;
  8. use HTTP::Request::Common;
  9.  
  10. my $proxy = HTTP::Proxy->new(
  11.     host => "192.168.1.123",
  12.     port => 9999
  13. );
  14.  
  15. my $repl = "http://perlmeister.com/test/" . "sandy-beach.jpg";
  16.  
  17. $proxy->push_filter(
  18.     request => HTTP::Proxy::HeaderFilter::simple->new(
  19.         sub {
  20.             my ( $self, $headers, $req ) = @_;
  21.  
  22.             if ( $req->uri() =~ /eviladserver\.com/ ) {
  23.                 $_[2] = GET $repl;
  24.             }
  25.         }
  26.     )
  27. );
  28.  
  29. $proxy->start;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Intenté con
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $_[2] = "hola mundo";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero no funciona.

¿ Cómo se tendría que hacer ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-04-02 20:03 @877

En la carpeta de ejemplos de la distribución HTTP-Proxy hay uno que se llama adblock.pl, que copio y comento aquí:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use HTTP::Proxy qw( :log );
  4. use HTTP::Proxy::HeaderFilter::simple;
  5. use vars qw( $re );
  6.  
  7. # this is a very simple ad blocker
  8. # a full-fledged ad blocker should be a module
  9.  
  10. # this dot is *not* a web bug ;-)                    # en estas líneas creamos la modificación o respuesta del proxy
  11. my $no = HTTP::Response->new( 200 );                 # Creamos un objeto HTTP::Response, con código 200 (todo ha ido bien)
  12. $no->content_type('text/plain');                     # El contenido será texto
  13. $no->content('.');                                   # Ese texto (un simple punto)
  14.  
  15. my $filter = HTTP::Proxy::HeaderFilter::simple->new( sub {     # Definimos el filtro a poner en el proxy
  16.    my ( $self, $headers, $message ) = @_;                      # Siempre recibimos tres argumentos
  17.    $self->proxy->response( $no )                               # Respondemos con la respuesta creada antes...
  18.        if $message->uri->host =~ /$re/o;                       #  si el host en la petición es alguno de los
  19.                                                                #   definidos más abajo
  20. } );
  21.  
  22. my $proxy = HTTP::Proxy->new( @ARGV );                         # Aquí creamos el objeto Proxy
  23. $proxy->push_filter( request => $filter );                     # y le añadimos nuestro filtro
  24. $proxy->start;                                                 # y lo ponemos en marcha
  25.  
  26. # a short and basic list
  27. BEGIN {                                                        # lista de direcciones a filtrar
  28.     $re = join '|',
  29.       map { quotemeta } qw(
  30.         ads.wanadooregie.com
  31.         cybermonitor.com
  32.         doubleclick.com
  33.         adfu.blockstackers.com
  34.         bannerswap.com
  35.         click2net.com
  36.         clickxchange.com
  37.         dimeclicks.com
  38.         fastclick.net
  39.         mediacharger.com
  40.         mediaplex.com
  41.         myaffiliateprogram.com
  42.         netads.hotwired.com
  43.         valueclick.com
  44.     );
  45. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Lo que hace el programa es lanzar un proxy, que cuando recibe alguna petición para conectarse a alguno de los sitios listados, sustituye la petición por una respuesta prefabricada: un mísero punto.
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: Duda con módulo HTTP::Proxy

Notapor BigBear » 2013-04-03 15:37 @692

Ok, gracias por el ejemplo. Ya sé capturar la respuesta, ahora me falta capturar las cabeceras. Mira el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!usr/bin/perl
  2. #A simple Proxy Server
  3. #Coded By Doddy H
  4. #ppm install http://theoryx5.uwinnipeg.ca/ppms/HTTP-Proxy.ppd
  5.  
  6. use HTTP::Proxy;
  7. use HTTP::Proxy::BodyFilter::simple;
  8. use HTTP::Proxy::BodyFilter::complete;
  9. use Data::Dumper;
  10.  
  11. my $port = "8080";
  12. my $logs = "logs.txt";
  13.  
  14. print "\n\n[+] Proxy server Online in port $port\n\n";
  15.  
  16. my $server = HTTP::Proxy->new(port=>$port);
  17. $server->host();
  18.  
  19. $server->push_filter(mime=>undef,response => HTTP::Proxy::BodyFilter::complete->new());
  20.  
  21. $server->push_filter(
  22. mime=>undef,
  23. request=>HTTP::Proxy::BodyFilter::simple->new(\&enable),
  24. response => HTTP::Proxy::BodyFilter::simple->new(\&enable2));
  25.  
  26. $server->start();
  27.  
  28. sub enable {
  29.  
  30. my @logs;
  31. my($a,$b,$c,$d,$e) = @_;
  32. my ($f,$g)=($c->header("cookie"),$c->header("x-requested-with"));
  33. my ($h,$i)=($c->header("content-type"),$c->header("content"));
  34.  
  35. #print Dumper $c;
  36.  
  37. print $c->header("user-agent");
  38.  
  39. savefile($logs,"\n[Peticion] : ".$c->method." ".$c->uri);
  40. savefile($logs,"[Cookie] : ".$f) if $f;
  41. savefile($logs,"[x-requested-with] : ".$g) if $g;
  42. savefile($logs,"[Content Type] : ".$h) if $h;
  43. savefile($logs,"[Content] : ".$i) if $i;
  44. savefile($logs,"");
  45.  
  46. }
  47.  
  48. sub enable2 {
  49. my ($j,$k,$l,$m,$n) = @_;
  50. savefile($logs,"\n\n[START]\n\n".$$k."\n\n[END]\n") if $$k ne "";
  51. }
  52.  
  53. sub savefile {
  54. open (SAVE,">>".$_[0]);
  55. print SAVE $_[1]."\n";
  56. close SAVE;
  57. }
  58.  
  59. # ¿ The End ?
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El problema es que no muestra el User-Agent pero cuando vuelvo $c me muestra varias veces user-agent al contrario de cuando lo hago sin volcar. El volcado es así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = bless( {
                 '_protocol' => 'HTTP/1.1',
                 '_content' => '',
                 '_uri' => bless( do{\(my $o = 'http://localhost/shell.php')}, 'URI::http' ),
                 '_headers' => bless( {
                                        'user-agent' => 'Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0',
                                        'accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                                        'accept-language' => 'es-ar,es;q=0.8,en-us;q=0.5,en;q=0.3',
                                        'cookie' => 'PHPSESSID=g6p3jjfb34qcl4kjmpg1833th7',
                                        'host' => 'localhost',
                                        'via' => '1.1 doddy-701c8cb49 (HTTP::Proxy/0.20)',
                                        'x-forwarded-for' => '127.0.0.1'
                                      }, 'HTTP::Headers' ),
                 '_method' => 'GET'
               }, 'HTTP::Request' );
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿ Qué estoy haciendo mal ?
BigBear
Perlero frecuente
Perlero frecuente
 
Mensajes: 981
Registrado: 2009-03-01 18:39 @818

Re: Duda con módulo HTTP::Proxy

Notapor explorer » 2013-04-03 19:52 @869

¿Has probado a sacar un volcado de $b?

Debería salir un objeto HTTP::Headers.

Según el manual de HTTP::Proxy::HeaderFilter , $b guarda un objeto HTTP::Headers, que son las cabeceras que el filtro enviará al cliente en caso de que el proxy esté en el lado de la respuesta, o lo enviará al servidor, si está en el lado de la consulta (como creo que es tu caso). Entonces, el proxy puede modificar esas cabeceras cuando pasan a través de él.

En cambio, $c contiene un objeto HTTP::Response (si estamos filtrando la respuesta) o un objeto HTTP::Request (si estamos filtrando la consulta). De este último, quieres obtener el 'user-agent'. Bueno, no sé el porqué no te funciona el método header(). Según el manual de HTTP::Request, debería ser así. Y se ve en el volcado que sí que está.

Con este programa de una línea, se demuestra que sí se puede acceder a esa cabecera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
perl -MData::Dumper -MHTTP::Request::Common -E '$req = GET "http://perlenespanol.com", User_Agent => "Mi Agente"; say Dumper $req; say $req->header("user-agent")'
$VAR1 = bless( {
                 '_content' => '',
                 '_uri' => bless( do{\(my $o = 'http://perlenespanol.com')}, 'URI::http' ),
                 '_headers' => bless( {
                                        'user-agent' => 'Mi Agente'
                                      }, 'HTTP::Headers' ),
                 '_method' => 'GET'
               }, 'HTTP::Request' );

Mi Agente
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Lo que hacemos es crear un objeto HTTP::Request, con solo la URL y una cabecera User-Agent inventada. Luego hacemos un volcado para ver el contenido, y luego accedemos directamente al valor de esa cabecera.

(Nota: si te fijas, da igual escribirlo en minúsculas/mayúsculas o si el guión es bajo o medio. HTTP::Headers se ocupa de eso)

Así que no sé qué es lo que te pasa...
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

AnteriorSiguiente

Volver a Módulos

¿Quién está conectado?

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