Foro de elhacker.net

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
  1. @echo off
  2. :code
  3. set "name="
  4. set /p "name=Teclee su nombre : "
  5. if not defined name (goto:code)
  6. for /f "tokens=2 delims==" %%_ in ('set name') do (
  7. echo.Has escrito : %%_
  8. )
  9. goto:code

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
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :code
  4. set "name="
  5. set /p "name=Teclee su nombre : "
  6. if not defined name (goto:code)
  7. for /f "tokens=2 delims==" %%_ in ('set name') do (
  8. echo.Has escrito : %%_
  9. set "algo=%%_"
  10. goto :_123456789:
  11. )
  12. :_123456789:
  13. echo Variable asignada %%algo%% : !algo!
  14. goto:code

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
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :code
  4. set "name="
  5. set /p "name=Teclee su nombre : "
  6. if not defined name (goto:code)
  7. for /f "tokens=1* delims==" %%l in ('set name ^| findstr /r /i "^Name="') do (
  8. echo.Has escrito : %%m
  9. set "algo=%%m"
  10. goto :_123456789:
  11. )
  12. :_123456789:
  13. echo Variable asignada %%algo%% : !algo!
  14. 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

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
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :code
  4. set "name="
  5. set /p "name=Teclee su nombre : "
  6. if not defined name (goto:code)
  7. for /f "tokens=1* delims==" %%l in ('set name ^| findstr /r /i "^Name="') do (
  8. echo.Has escrito : %%m
  9. set "algo=%%m"
  10. goto :_123456789:
  11. )
  12. :_123456789:
  13. setlocal enabledelayedexpansion
  14. echo Variable asignada %%algo%% = !algo!
  15. goto:code

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
  1. @echo off
  2. copy /y nul+nul "char.txt" > nul 2>&1
  3. for /f "tokens=1" %%_ in (char.txt) do set "char=%%_"
  4. :code
  5. set /p "name=Name : "
  6. if not defined name (goto:code)
  7. set "name=%char%%name%"
  8. for /f "tokens=1* delims=%char%" %%a in ('set name ^| findstr /r /i "^Name"') do (
  9. echo Has escrito : %%b
  10. set "algo=%%b"
  11. )
  12. setlocal enabledelayedexpansion
  13. echo Variable asignada %%algo%% = {!algo!}
  14. pause>nul
  15. exit /b 0

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"
Has escrito : |!""'\<<>><>&cmd&calc|find /i "lkasd"
Variable asignada %algo% = {|!""'\<<>><>&cmd&calc|find /i "lkasd"}
Cualquier error, haganlo saber.

Saludos.