Test Foro de elhacker.net SMF 2.1

Programación => Scripting => Mensaje iniciado por: leogtz en 4 Abril 2009, 09:54 AM

Título: Filtro Anti- BatchInyection
Publicado por: leogtz en 4 Abril 2009, 09:54 AM
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.
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
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)?

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

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
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
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.
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 (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.
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?

@ 0x0309

Muy interesante la función Clean.
Título: Re: Filtro Anti- BatchInyection
Publicado por: leogtz en 20 Junio 2009, 20:08 PM
Cita de: 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?

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

Teclee su nombre : ! Matt !
Has escrito : ! Matt !
Variable asignada %algo% = ! Matt !
Teclee su nombre :


Código:
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 (
endlocal
echo.Has escrito : %%m
set "algo=%%m"
goto :_123456789:
)
:_123456789:
setlocal enabledelayedexpansion
echo Variable asignada %%algo%% = !algo!
goto:code


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:
Código (dos) [Seleccionar]
@echo off
copy /y nul+nul "char.txt" > nul 2>&1
for /f "tokens=1" %%_ in (char.txt) do set "char=%%_"
:code
set /p "name=Name : "
if not defined name (goto:code)
set "name=%char%%name%"
for /f "tokens=1* delims=%char%" %%a in ('set name ^| findstr /r /i "^Name"') do (
echo Has escrito : %%b
set "algo=%%b"
)
setlocal enabledelayedexpansion
echo Variable asignada %%algo%% = {!algo!}
pause>nul
exit /b 0


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.