Título: Filtro Anti- BatchInyection Publicado por: leogtz en 4 Abril 2009, 09:54 am Código La utilidad de esto es que podemos mostrar la informacion introducida por el usuario, sin temer por una inyeccion batch. Funcionamiento : Código: 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.
Código: @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: Código: @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. Código Salida : Código: 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ódigo: 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 : Código: @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ódigo: 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".
Código: @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 :
Código 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
Código: Teclee su nombre : ! Matt ! Has escrito : Variable asignada %algo% : ¿Se podría solucionar? @ 0x0309 Muy interesante la función Clean. Título: Re: Filtro Anti- BatchInyection Publicado por: leogtz en 20 Junio 2009, 20:08 pm @ Leo Gutierrez Código: Teclee su nombre : ! Matt ! Has escrito : Variable asignada %algo% : ¿Se podría solucionar? @ 0x0309 Muy interesante la función Clean. No me había puesto con el código, hoy lo hice, y si, si se puede solucionar: Código: Teclee su nombre : ! Matt ! Has escrito : ! Matt ! Variable asignada %algo% = ! Matt ! Teclee su nombre : Código: Código Salida: Código: 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:
Código Salida: Código: 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:\> Código: Name : |!""'\<<>><>&cmd&calc|find /i "lkasd" Cualquier error, haganlo saber.Has escrito : |!""'\<<>><>&cmd&calc|find /i "lkasd" Variable asignada %algo% = {|!""'\<<>><>&cmd&calc|find /i "lkasd"} Saludos. |