¿Cómo inyecta HTML una inyección SQL?

2

He descubierto dos intentos de inyección de SQL en mis registros del servidor web:

declare @c cursor;
set @c=cursor for select TABLE_NAME,c.COLUMN_NAME FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id=o.id INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON o.NAME=TABLE_NAME WHERE(indid=0 or indid=1) and DATA_TYPE like '%text';declare @a varchar(99);
declare @s varchar(99);
declare @f varchar(99);
declare @q varchar(8000);
open @c;fetch next from @c into @a,@s;
while @@FETCH_STATUS=0 
begin set @q='declare @f binary(16);
declare @x cursor;
set @x=cursor for SELECT TEXTPTR(['+@s+']) FROM ['+@a+'] where not ['+@s+'] like ''%edf40wrjww2%'';
open @x;
fetch next from @x into @f;
while @@FETCH_STATUS=0 
begin declare @s varchar(8000);
set @s=''UPDATETEXT ['+@a+'].['+@s+'] ''+master.dbo.fn_varbintohexstr(@f)+'' 0 0 ''''''+char(60)+''div style="display:none"''+char(62)+''edf40wrjww2'+@a+':'+@s+'''+char(60)+char(47)+''div''+char(62)+'''''';'';exec(@s);
fetch next from @x into @f;
end;close @x';
exec(@q);
fetch next from @c into @a,@s;end;close @c--
 
declare @c cursor;
set @c=cursor for select TABLE_NAME,c.COLUMN_NAME FROM sysindexes AS i INNER JOIN sysobjects AS o ON i.id=o.id INNER JOIN INFORMATION_SCHEMA.COLUMNS c ON o.NAME=TABLE_NAME WHERE(indid=0 or indid=1) and DATA_TYPE like '%text';
declare @a varchar(99);
declare @s varchar(99);
declare @f varchar(99);
declare @q varchar(8000);
open @c;
fetch next from @c into @a,@s;
while @@FETCH_STATUS=0 begin set @q='declare @l int;set @l=44+len('''+@s+''')+len('''+@a+''');declare @f binary(16);
declare @x cursor;
set @x=cursor for SELECT TEXTPTR(['+@s+']) FROM ['+@a+'] where ['+@s+'] like ' '%edf40wrjww2%'';
open @x;
fetch next from @x into @f;
while @@FETCH_STATUS=0 begin declare @s varchar(8000);
set @s=''UPDATETEXT ['+@a+'].['+@s+'] ''+master.dbo.fn_varbintohexstr(@f)+'' 0 ''+cast(@l as varchar)+'' '''''''''';exec(@s);fetch next from @x into @f;end;close @x'; 
exec(@q);
fetch next from @c into @a,@s;

end;
close @c--

Así es como imagino que funciona el ataque: el primer intento intenta inyectar el elemento <div> en el código HTML de las páginas web con el código de seguimiento. Entonces, un usuario malintencionado podría buscar fácilmente los sitios web infectados. El segundo intento busca el código en la base de datos y luego intenta extraer información de él (?).

También busqué en este sitio web este código y parece que hay muchos sitios web infectados (alrededor de 200, principalmente chinos) y puedes ver el "código de ruta" en sus códigos fuente.

Mis preguntas son:

  1. Si la primera inyección inyecta el código en la base de datos, ¿cómo "viaja" el código HTML de la base de datos al código fuente HTML real?
  2. ¿Qué intenta hacer exactamente el atacante con el segundo intento? ¿Agregar valores de fila / columna a los campos infectados con UPDATETEXT y extraer información de tal manera?
pregunta Gabrielius 19.01.2018 - 09:35
fuente

3 respuestas

1

Inteligente. Creo que la idea es que intente realizar inyecciones de SQL en páginas web dirigidas a SQL Server. La idea es que las inyecciones de SQL exitosas se pueden descubrir al determinar si se propagan a páginas web. Cualquier dato / campo, etc., que sea aprovechado por una aplicación o página web ahora mostrará la cadena única. Es probable que busquen la cadena inmediatamente (reflejada), así como también exploren la aplicación o el sitio (las inyecciones de SQL almacenadas). Incluso se puede aprovechar su motor de búsqueda favorito para encontrarlos (como descubrió). Los escáneres web comerciales utilizan una técnica similar para etiquetar inyecciones.

El primer script actualiza todos los campos en la base de datos con una cadena única (edf40wrjww2) envuelta por algún HTML. La segunda secuencia de comandos recorre todos los campos actualizados en la primera secuencia de comandos y agrega información específica sobre la tabla y la columna comprometida. No estoy seguro de por qué esto se divide en dos secuencias de comandos: podría ser para reducir la duración de la inyección o para asegurarse de que la longitud de la columna al menos se ajuste a la etiqueta.

Si usa SQL Server, es posible que desee revisar su base de datos para esta cadena.

    
respondido por el Egret 20.01.2018 - 05:17
fuente
1
  1. El script escribe el nombre de tabla etiquetado <div> : nombre de campo en un campo de texto que contiene los datos que espera que se muestren en la página. Cuando el sitio está representando la página, está extrayendo el texto de la base de datos y colocándolo en la página que se mostrará. La etiqueta div está ahí para ocultarlo; pero no se permite que todos los elementos HTML mostrados contengan una etiqueta div, por lo que puede ver la etiqueta div en el título de un sitio.

  2. Creo que la primera secuencia de comandos está intentando etiquetar cualquier campo no infectado adecuadamente que pueda usarse para exfiltrar texto (un pase de reconocimiento). El segundo parece que informa el nombre de tabla exacto: nombre de campo que contiene el texto inyectado. O es posible que el primer script no hiciera exactamente lo que el atacante quería, y lo modificó e hizo un segundo intento.

respondido por el John Deters 20.01.2018 - 17:32
fuente
1

El atacante está intentando realizar inyecciones de SQL fuera de banda que son popularmente posibles en los servidores MS SQL. Las técnicas SQLi fuera de banda dependerían de la capacidad del servidor de base de datos para realizar solicitudes de DNS o HTTP para entregar datos a un atacante. Tal es el caso con el comando xp_dirtree de Microsoft SQL Server, que se puede usar para hacer solicitudes de DNS a un servidor que controla un atacante, así como el paquete UTL_HTTP de la base de datos Oracle, que se puede usar para enviar solicitudes HTTP desde SQL y PL / SQL a un servidor que controla un atacante.

Pocos sitios de Taiwán & aquellas aplicaciones que dependen en gran medida de los servidores MS SQL son vulnerables a Inferential & Inyección fuera de banda de SQL si el inferencial no funciona.

PararealizarunseguimientodeInyeccióndeSQLfueradebanda,unatacantetendríaquedependercompletamentedehacerpingorealizarunasolicituddeDNS&inyectandolascargasútilescomosilascargasútilestuvieransuresultadoencanalesfueradelabanda,comoun Servidor de Colaboradores .

Rara vez hay artículos de técnicas MySQL fuera de banda, pero aquí hay uno: enlace

Para responder a sus preguntas:

  1. No se realizan pruebas para extraer la información mediante la representación. Si esto fuera posible, el atacante podría no haber intentado de nuevo. En caso de casos inferenciales o basados en errores, ¡la forma en que funciona! Pero esos ensayos fallaron, por lo que el atacante optaría por una Inyección de SQL fuera de banda.
  2. El atacante está intentando iterar hasta que se extraigan todos los detalles de la tabla.
respondido por el Shritam Bhowmick 20.01.2018 - 19:58
fuente

Lea otras preguntas en las etiquetas