Filtro Anti- BatchInyection

Iniciado por leogtz, 4 Abril 2009, 09:54 AM

0 Miembros y 1 Visitante están viendo este tema.

leogtz

Código (dos) [Seleccionar]
@echo off
:code
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


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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SmartGenius

Simple y efectivo  ;D

Gracias por compartirlo... !!

Saludos.


M a t t

Muy bueno Leo, felicitaciones.

0x0309

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.

leogtz

Cita de: 0x0309 en  4 Abril 2009, 19: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 (dos) [Seleccionar]

@echo off
setlocal enabledelayedexpansion
:code
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 : %%_
set "algo=%%_"
goto :_123456789:
)
:_123456789:
echo Variable asignada %%algo%% : !algo!
goto:code


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)?

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

0x0309

buen trabajo, lo que yo quise decir, es que lo intentarás sin:
!algo!
sino con:
%algo%

¿filtro?

Germaniac

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

Cita de: 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?


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

0x0309

#7
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
:::::::::::::::::::::::::::::::::::::::::::::::::::::::

leogtz

Cita de: 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?


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.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

leogtz

Creo que así ya quedaría bien :
Código (dos) [Seleccionar]
@echo off
setlocal enabledelayedexpansion
:code
set "name="
set /p "name=Teclee su nombre : "
if not defined name (goto:code)
for /f "tokens=1* delims==" %%l in ('set name ^| findstr /r /i "^Name="') do (
echo.Has escrito : %%m
set "algo=%%m"
goto :_123456789:
)
:_123456789:
echo Variable asignada %%algo%% : !algo!
goto:code


Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com