Título: Filtro Anti- BatchInyection
Publicado por: leogtz en 4 Abril 2009, 09:54 am
:code set /p "name=Teclee su nombre : " for /f "tokens=2 delims==" %%_ in (' set name' ) do ( )
La utilidad de esto es que podemos mostrar la informacion introducida por el usuario, sin temer por una inyeccion batch. Funcionamiento : Teclee su nombre : &cmd Has escrito : &cmd Teclee su nombre : &echo on Has escrito : &echo on Teclee su nombre : > Has escrito : > Teclee su nombre : < Has escrito : < Teclee su nombre : | Has escrito : | Teclee su nombre : * ? & < ^&cmd^ Has escrito : * ? & < ^&cmd^ Teclee su nombre : %homepath% Has escrito : %homepath% Teclee su nombre : set|more Has escrito : set|more Teclee su nombre : &echo on Has escrito : &echo on Teclee su nombre : &goto:Eof Has escrito : &goto:Eof Teclee su nombre : &goto:Eof^ Has escrito : &goto:Eof^ Teclee su nombre : |calc.exe Has escrito : |calc.exe Teclee su nombre : PD : Al final del post esta la versión final. Saludos.
Título: Re: Filtro Anti- BatchInyection
Publicado por: SmartGenius en 4 Abril 2009, 15:32 pm
Simple y efectivo ;D
Gracias por compartirlo... !!
Saludos.
Título: Re: Filtro Anti- BatchInyection
Publicado por: M a t t en 4 Abril 2009, 19:24 pm
Muy bueno Leo, felicitaciones.
Título: Re: Filtro Anti- BatchInyection
Publicado por: 0x0309 en 4 Abril 2009, 19:40 pm
felicitacione Leo, solo una leve corrección, si tienes otra variable con el prefijo name, como por ejemplo: namespace te mostrará ese también. @echo off :code set namespace=current set "name=" set /p "name=Teclee su nombre : " if not defined name (goto:code) for /f "tokens=2 delims==" %%_ in ('set name') do ( echo.Has escrito : %%_ ) goto:code solución: @echo off :code set namespace=current set "name=" set /p "name=Teclee su nombre : " if not defined name (goto:code) for /f "tokens=2 delims==" %%_ in ('set name') do ( echo.Has escrito : %%_ goto :_123456789: ) :_123456789: goto:code Buen método Leo, yo ya había hecho uno, te desafío a que intentes asignar a una variable el contenido de %%_, si así lo haces, ya no hay filtración.
Título: Re: Filtro Anti- BatchInyection
Publicado por: leogtz en 4 Abril 2009, 20:40 pm
Buen método Leo, yo ya había hecho uno, te desafío a que intentes asignar a una variable el contenido de %%_, si así lo haces, ya no hay filtración.
:code set /p "name=Teclee su nombre : " for /f "tokens=2 delims==" %%_ in (' set name' ) do ( ) :_123456789: echo Variable asignada %%algo%% : !algo!
Salida : Teclee su nombre : &cmd Has escrito : &cmd Variable asignada %algo% : &cmd Teclee su nombre : &echo on Has escrito : &echo on Variable asignada %algo% : &echo on Teclee su nombre : < > &cmd Has escrito : < > &cmd Variable asignada %algo% : < > &cmd Teclee su nombre : |calc Has escrito : |calc Variable asignada %algo% : |calc Teclee su nombre : |cmd Has escrito : |cmd Variable asignada %algo% : |cmd Teclee su nombre : set|more Has escrito : set|more Variable asignada %algo% : set|more Teclee su nombre : &goto:eof Has escrito : &goto:eof Variable asignada %algo% : &goto:eof Teclee su nombre : &goto:eof^ Has escrito : &goto:eof^ Variable asignada %algo% : &goto:eof^ Teclee su nombre : %homepath% Has escrito : %homepath% Variable asignada %algo% : %homepath% Teclee su nombre : ^CTeclee su nombre : Teclee su nombre : ^C¿Desea terminar el trabajo por lotes (S/N)?
Título: Re: Filtro Anti- BatchInyection
Publicado por: 0x0309 en 4 Abril 2009, 22:11 pm
buen trabajo, lo que yo quise decir, es que lo intentarás sin: !algo! sino con: %algo%
¿filtro?
Título: Re: Filtro Anti- BatchInyection
Publicado por: Germaniac en 4 Abril 2009, 23:56 pm
Muy bien, solo que no muestra lo introducido despues de un caracter = C:\>C:\code.bat Teclee su nombre : no muestra lo que sigue depues de un "=" igual Has escrito : no muestra lo que sigue depues de un " Teclee su nombre :
@echo off :code set "name=" set /p "name=Teclee su nombre : " if not defined name (goto:code) for /f "tokens=1* delims==" %%a in ('set name^|findstr /b "name="') do ( echo.Has escrito : %%b ) goto:code
C:\>C:\code.bat Teclee su nombre : muestra incluso depues de un "=" igual Has escrito : muestra incluso depues de un "=" igual Teclee su nombre :
El chiste de un filtro Anti-BatchInyeccion seria trabajar con lo introducido por el usuario sin temor a una posible inyeccion por cararteres especiales buen trabajo, lo que yo quise decir, es que lo intentarás sin: !algo! sino con: %algo%
¿filtro?
No creo que se pueda porque este filtro no elimina los caracteres especiales y al llamar a %algo% en vez de !algo! el cmd.exe es vulnerable a una inyeccion. Saludos
Título: Re: Filtro Anti- BatchInyection
Publicado por: 0x0309 en 5 Abril 2009, 02:06 am
Dejo, otro filtro que encontré, que filtra, es decir, quita los carácteres considerados "nocivos". @ECHO OFF SETLOCAL :INICIO SET TEXT= SET /P TEXT=give me your text: IF DEFINED TEXT (CALL:CLEAN TEXT) IF DEFINED TEXT (ECHO.%TEXT%) GOTO:INICIO ENDLOCAL GOTO:EOF
::::::::::::::::::::::::::::::::::::::::::::::::::::::: :CLEAN ::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::Autor Carlos ::version 1.0 more restricted SETLOCAL ENABLEDELAYEDEXPANSION IF NOT DEFINED %~1 (GOTO:_CLEANE) || (GOTO:_CLEANE) SET "CONTENT=!%~1!" IF NOT DEFINED CONTENT (GOTO:EOF) SET /A COUNT=0 :_LOOP SET "CHAR=!CONTENT:~%COUNT%,1!" IF NOT DEFINED CHAR (GOTO:_ENDLOOP) SET ADD=FALSE FOR %%A IN (0 1 2 3 4 5 6 7 8 9) DO ( IF [^!CHAR!] EQU [%%A] (SET ADD=TRUE) ) FOR %%A IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) DO ( IF /I [^!CHAR!] EQU [%%A] (SET ADD=TRUE) ) IF /I [!ADD!] EQU [TRUE] ( SET "STRING=!STRING!!CHAR!" ) SET /A COUNT +=1 GOTO:_LOOP :_ENDLOOP ENDLOCAL&&SET "%~1=%STRING%" GOTO:EOF :_CLEANE ECHO.CLEAN FUNCTION RECEIVE A DEFINED VARIABLE. PAUSE GOTO:EOF :::::::::::::::::::::::::::::::::::::::::::::::::::::::
Título: Re: Filtro Anti- BatchInyection
Publicado por: leogtz en 5 Abril 2009, 04:49 am
buen trabajo, lo que yo quise decir, es que lo intentarás sin: !algo! sino con: %algo%
¿filtro?
Pues no le veo ningun problema en usar !! en ves de %% ya que no estoy usando ningun comando externo (.exe) a cmd.exe, es totalmente valido. Saludos.
Título: Re: Filtro Anti- BatchInyection
Publicado por: leogtz en 5 Abril 2009, 05:05 am
Creo que así ya quedaría bien : :code set /p "name=Teclee su nombre : " for /f "tokens=1* delims==" %%l in (' set name ^| findstr /r /i " ^Name="' ) do ( ) :_123456789: echo Variable asignada %%algo%% : !algo!
Saludos.
Título: Re: Filtro Anti- BatchInyection
Publicado por: 0x0309 en 5 Abril 2009, 07:41 am
simplemente es para dejar claro la forma de utilizar tu código, ya que no es un filtro propiamente tal, sino una forma de tratar a las variables para que su contenido no se ejecute.
Título: Re: Filtro Anti- BatchInyection
Publicado por: M a t t en 5 Abril 2009, 08:20 am
-
Título: Re: Filtro Anti- BatchInyection
Publicado por: M a t t en 5 Abril 2009, 12:27 pm
@ Leo Gutierrez Teclee su nombre : ! Matt ! Has escrito : Variable asignada %algo% :
¿Se podría solucionar? @ 0x0309Muy interesante la función Clean.
Título: Re: Filtro Anti- BatchInyection
Publicado por: leogtz en 20 Junio 2009, 20:08 pm
@ Leo Gutierrez Teclee su nombre : ! Matt ! Has escrito : Variable asignada %algo% :
¿Se podría solucionar? @ 0x0309Muy interesante la función Clean. No me había puesto con el código, hoy lo hice, y si, si se puede solucionar: Teclee su nombre : ! Matt ! Has escrito : ! Matt ! Variable asignada %algo% = ! Matt ! Teclee su nombre : Código: :code set /p "name=Teclee su nombre : " for /f "tokens=1* delims==" %%l in (' set name ^| findstr /r /i " ^Name="' ) do ( ) :_123456789: echo Variable asignada %%algo%% = !algo!
Salida: Teclee su nombre : &cm Has escrito : &cm Variable asignada %algo% = &cm Teclee su nombre : Teclee su nombre : &cmd Has escrito : &cmd Variable asignada %algo% = &cmd Teclee su nombre : &echo on Has escrito : &echo on Variable asignada %algo% = &echo on Teclee su nombre : < > cmd Has escrito : < > cmd Variable asignada %algo% = < > cmd Teclee su nombre : |calc Has escrito : |calc Variable asignada %algo% = |calc Teclee su nombre : %% Has escrito : %% Variable asignada %algo% = %% Teclee su nombre : %leo% Has escrito : %leo% Variable asignada %algo% = %leo% Teclee su nombre : %random% Has escrito : %random% Variable asignada %algo% = %random% Teclee su nombre : &goto:Eof Has escrito : &goto:Eof Variable asignada %algo% = &goto:Eof Teclee su nombre : &goto:eof^ Has escrito : &goto:eof^ Variable asignada %algo% = &goto:eof^ Teclee su nombre : %homepath% Has escrito : %homepath% Variable asignada %algo% = %homepath% Teclee su nombre : Saludos.
Título: Re: Filtro Anti- BatchInyection
Publicado por: leogtz en 23 Junio 2009, 07:03 am
Por fin, volví a hacer el código desde 0, aqui esta la versión final: for /f "tokens=1" %%_ in (char.txt ) do set "char= %%_" :code for /f "tokens=1* delims= %char%" %%a in (' set name ^| findstr /r /i " ^Name"' ) do ( ) echo Variable asignada %%algo%% = { !algo!}
Salida: C:\>este Name : &cmd Has escrito : &cmd Variable asignada %algo% = {&cmd}
C:\>este Name : ! leo ! Has escrito : ! leo ! Variable asignada %algo% = {! leo !}
C:\>este Name : !! Has escrito : !! Variable asignada %algo% = {!!}
C:\>este Name : && Has escrito : && Variable asignada %algo% = {&&}
C:\>este Name : || Has escrito : || Variable asignada %algo% = {||}
C:\>este Name : |calc Has escrito : |calc Variable asignada %algo% = {|calc}
C:\>este Name : < Has escrito : < Variable asignada %algo% = {<}
C:\>este Name : > leo.txt Has escrito : > leo.txt Variable asignada %algo% = {> leo.txt}
C:\>este Name : %homepath% Has escrito : %homepath% Variable asignada %algo% = {%homepath%}
C:\>este Name : &goto:eof Has escrito : &goto:eof Variable asignada %algo% = {&goto:eof}
C:\>^goto:eof
C:\>este Name : ^^ Has escrito : ^^ Variable asignada %algo% = {^^}
C:\> Name : |!""'\<<>><>&cmd&calc|find /i "lkasd" Has escrito : |!""'\<<>><>&cmd&calc|find /i "lkasd" Variable asignada %algo% = {|!""'\<<>><>&cmd&calc|find /i "lkasd"}
Cualquier error, haganlo saber. Saludos.
|