Análisis del código fuente de la pieza de inyección AWVS14.7sql

Análisis de código fuente parcial de inyección AWVS-SQL

**PD:**En el artículo, sangraré algunos patrones de oraciones, el texto está fijo de forma predeterminada y la sangría de entrada corresponde a la sangría del código, así que preste atención a la sangría de mi párrafo.

classErrorBasedSQLInjection.inc

claseSQLErrorMessages()

this.plainArray

Almacene mensajes de error comunes de inyección de sql, como

'Microsoft OLE DB Provider for ODBC Drivers',
'Error Executing Database Query',
'Microsoft OLE DB Provider for SQL Server',
'ODBC Microsoft Access Driver',

este.regexArray

Almacene la información de coincidencia regular de la inyección sql común, como

/(Incorrect\ssyntax\snear\s'[^']*')/,
/(Syntax error: Missing operand after '[^']*' operator)/,
/Syntax error near\s.*?\sin the full-text search condition\s/,
/column "\w{5}" does not exist/,
/near\s[^:]+?:\ssyntax\serror/,
/(pg_query\(\)[:]*\squery\sfailed:\serror:\s)/,
/('[^']*'\sis\snull\sor\snot\san\sobject)/,
/(ORA-\d{4,5}:\s)/,

**PD:** Aquí hay una explicación de la diferencia entre this.plainArray y this.regexArray, los cuales coinciden con cadenas, pero this.plainArray coincide directamente con el contenido de la matriz con las cadenas, lo que requiere una coincidencia completa Las variables cumplen con el requisitos de coincidencia, y this.regexArray enfatiza una regla de coincidencia regular. Siempre que haya contenido en la cadena que cumpla con las reglas de coincidencia, se considera que cumple con los requisitos de coincidencia.

this.FalsePositivesPlainArray

Almacene las características obvias de los informes de errores de inyección de SQL, como

"Connection Timeout",
"(0x80131904)",
"org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object"

this.FalsePositivesRegexArray

Temporalmente vacío, a juzgar por el nombre de la matriz, se utiliza para almacenar las características de la expresión cuando se notifican errores de inyección SQL.

classSQLErrorMessages.prototype.isFalsePositive = función (texto)

Función

Una función utilizada para juzgar si hay características obvias del mensaje de error de sql.

contenido

Haga coincidir los datos obtenidos con los datos en this.FalsePositivesPlainArray a su vez y devuelva verdadero si existe.

Haga coincidir los datos obtenidos con los datos en this.FalsePositivesRegexArray a su vez y devuelva verdadero si existe.

Devuelve falso si ninguno.

classSQLErrorMessages.prototype.searchOnText = función (texto)

Función

Por medio de la coincidencia de cadenas, se juzga a qué tipo de características de inyección SQL pertenece la cadena.

contenido

Declare una variable primero _in, el valor predeterminado es cuerpo

Haga coincidir los datos obtenidos, si se reconoce "HTTP/1." o "HTTP/0.", la información obtenida se reconoce como un paquete de respuesta y el valor se asigna _incomo respuesta .

Haga coincidir los datos obtenidos con los datos en this.plainArray a su vez. Si lo hay, devuelva HighlightFromTextSearch(this.plainArray[i], text, _in) . La función de esta función es hacer coincidir el valor de this.plainArray[i] en texto Volver a _in .

Haga coincidir los datos obtenidos con los datos en this.regexArray a su vez, si hay un retorno de resaltado de RegexMatch (m, _in) , esta función devuelve el resultado de coincidencia regular en m a **_in**, donde m=this.regexArray[ i] .exec(texto)

Devuelve falso si ninguno.

Resultado de inyección (datos, elemento de anuncio)

Función

Asigne valores a las propiedades de clase this.data y this.adItem

contenido

this.data = data;
this.adItem = adItem;

classErrorBasedSQLInjection(targetUrl, mensajes de error, esquema, índice de entrada, índice de variación, punto de reflexión)

Función

Asigne valores a los atributos de clase, especialmente guarde el contenido de entrada (cambiar valor) this.variations e inicialice algunos atributos de clase.

contenido

Primero asigna valores a algunas variables de clase

this.scheme = scheme;
this.targetUrl = targetUrl;
this.errorMessages = errorMessages;
this.inputIndex = inputIndex;
this.reflectionPoint = reflectionPoint;
this.foundVulnOnVariation = false;
this.lastJob = null;
this.lastJobConfirm = null;
this.disableSensorBased = false;

Si el esquema no está vacío, inicialice this.currentVariation y this.origValue = this.getOrigValue();

Si el esquema no está vacío y inputIndex no está vacío, cree la matriz this.variations y asigne inputIndex a this.variations .

Si el esquema no está vacío pero inputIndex está vacío, cree una matriz this.variations y asigne this.scheme.selectVariationsForInput(inputIndex) a this.variations .

classErrorBasedSQLInjection.prototype.isSQLInjection = función (sensorData, inicio, fin)

Función

Determine el tipo de base de datos en función de la función de huella digital y almacene el resultado del intento de inyección.

contenido

Inicialice los elementos primero , elementos = sensorData.getItems ("SQL_Query") , sensorData.getItems aquí puede entenderse como una función para capturar y analizar paquetes de solicitud http.

Si los artículos están vacíos, nulo .

El elemento de valor se extrae secuencialmente de los elementos .

Si el elemento no está vacío, inicialice dbType = "mysql" addData = item.additional

​ Si la longitud de addData es mayor o igual a 2, db = addData[1]

Si coincide en db database=, db = db.substr(9) dbType = db.toLowerCase()

Tome la entrada de valor de item.dataList a su vez

​ Si la cadena de inicio variable coincide en la entrada

​ Si dbType == 'mysql' y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío (el valor de retorno de la función de inyección intentada no está vacío), devuelva InjectionResult (entrada, elemento)

​ Si dbType == 'mssql' o dbType == 'mssql_or_access' y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío, devuelva InjectionResult(entry, item)

​ Si dbType == 'pg' y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío, devuelve InjectionResult(entry, item)

​ Si dbType == 'sqlite' y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío, devuelve InjectionResult(entry, item)

​ Si dbType == 'oracle' y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío, devuelve InjectionResult(entry, item)

​ Si dbType == 'sybase' y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío, devuelve InjectionResult(entry, item)

​ Si dbType no cumple con las condiciones anteriores y ax.util.testForInjection(entry, ax.util.InjectionType.MySQL, start, end) no es igual a vacío, devuelva InjectionResult(entry, item)

De lo contrario devuelve falso

classErrorBasedSQLInjection.prototype.getOrigValue = función ()

Función

Coincide con si los datos de entrada (this.inputIndex) ya se han ingresado.

contenido

Inicialice el valor de la variable , el valor inicial está vacío.

Tome valores secuencialmente de this.variations (esta matriz es el contenido de entrada almacenado en classErrorBasedSQLInjection), haga coincidir los datos de entrada (this.inputIndex) con los datos almacenados previamente (this.variations), y el resultado coincidente es varValue, si contiene la relación (las variaciones contienen los datos de entrada this.inputIndex). Si value está vacío y varValue no está vacío, asigne valor a varValue , salga del bucle y devuelva value .

classErrorBasedSQLInjection.prototype.request = función (valor)

Función

Agrega un valor de valor a la variación actual y envía una solicitud HTTP.

contenido

Si se carga un archivo ( this.scheme.hasFileInput ) y los datos de entrada tienen un indicador clave ( this.scheme.getInputFlags(this.inputIndex) ) y los datos cargados son un archivo ( INPUT_FLAG_IS_FILE ), configure el nombre del archivo de carga (setInputFileName) en value , establezca el tipo de archivo de carga (setInputContentType) en image/png y establezca el valor del archivo de carga (setInputValue) en value . De lo contrario, establezca el valor del archivo de carga en value .

Inicialice lastJob ( this.lastJob = new THTTPJob() ), asigne this.lastJob.url a this.targetUrl

Si el valor en targetHasAcuSensor ( this.scheme.targetHasAcuSensor ) no está vacío, llame a this.lastJob.addAspectHeaders()

Llame a populateRequest , pasando lastjob ( this.scheme.populateRequest(this.lastJob) )

PD: La función de llamar a populateRequest es completar el encabezado de solicitud perfecto.

Si la cadena Referer no existe en el encabezado de la solicitud , llame a la función addHeader para agregar el encabezado de la solicitud Referer

Luego envíe un paquete a lastJob ( this.lastJob.execute() ).

Inicializar variable tmp = falso

Si el resultado de la solicitud no informa un error ( wasError )) y se puede recibir el paquete de respuesta, envíe un paquete a reflectionPoint , copie los datos del paquete de respuesta al paquete de respuesta lastJob y asigne tmp al valor de wasError .

Finalmente devuelva !this.lastJob.wasError && !tmp

classFileInclusion.prototype.requestProof = función (valor, dontEncode)

Función

Extraiga la prueba y juzgue si existe la prueba de extracción ( Prueba ).

contenido

Si se carga un archivo ( this.scheme.hasFileInput ) y los datos de entrada tienen un indicador clave ( this.scheme.getInputFlags(this.inputIndex) ) y los datos cargados son un archivo ( INPUT_FLAG_IS_FILE ), configure el nombre del archivo de carga (setInputFileName) a value , establezca el tipo de archivo de carga ( setInputContentType ) a image/png .

Si dontEncode == TRUE , llame a setEncodedInputValue , establezca el valor de entrada codificado ( this.inputIndex ) en value ( this.scheme.setEncodedInputValue(this.inputIndex, value) ), de lo contrario, establezca el valor de entrada ( this.inputIndex ) en value .

de lo contrario

Si dontEncode == TRUE , llame a setEncodedInputValue , establezca el valor de entrada codificado ( this.inputIndex ) en value ( this.scheme.setEncodedInputValue(this.inputIndex, value) ), de lo contrario, establezca el valor de entrada ( this.inputIndex ) en value .

Inicialice this.lastJobProof = new THTTPJob()

Inicialice this.lastJobProof.url = this.targetUrl

Si el valor en targetHasAcuSensor ( this.scheme.targetHasAcuSensor ) no está vacío, llame a this.lastJob.addAspectHeaders()

Llame a populateRequest , pasando lastjob ( this.scheme.populateRequest(this.lastJob) )

Si la cadena Referer no existe en el encabezado de la solicitud , llame a la función addHeader para agregar el encabezado de la solicitud Referer

Luego envíe un paquete a lastJob ( this.lastJob.execute() ).

devuelve !this.lastJobProof.wasError

classFileInclusion.prototype.extractProofOfExploit = ​​función (testValue)

Función

Intento de extraer la prueba del exploit

contenido

Inicializar prueba = falso

Inicializar título_prueba = falso

Inicializar prueba_contenido = falso

init- regex = falso

Si testValue comienza con **http://**, entonces

testValue = "http://bxss.me/t/fit.txt?";
regex = /(63c19a6da79816b21429e5bb262daed863c19a6da79816b21429e5bb262daed8)/;
proof_title = "URL - http://bxss.me/t/fit.txt";

de lo contrario

testValue = "../../../../../../../../proc/version";
regex = /(Linux\sversion\s\d.*?\s\(.*?\)\s\(gcc\sversion\s\d.*?\(.*?\)\s*\)\s\#.*?[A-Z]{3}\s\d{4})/;
proof_title = "File - /proc/version";

si la expresión regular no está vacía

Si la extracción de testValue demuestra que el resultado es falso , devuelve falso .

Asigne la coincidencia de variables a this.lastJobProof.response.toString().match(regex) , aquí está el resultado coincidente devuelto después de hacer coincidir regex (reglas de coincidencia regulares) con la información en el paquete de solicitud en testValue .

Si la coincidencia no está vacía y la longitud de la coincidencia (matriz) es mayor que 1, asigne proof_contents a match[1] .

​ Si proof_contents no está vacío, devuelve [proof_title, proof_contents].

prueba de devolución.

classFileInclusion.prototype.alert = función (testValue, matchedText, sourceFile, sourceLine, AdditionalInfo, acuSensor)

Función

Genere elementos de informe para los escáneres.

contenido

Inicialice this.foundVulnOnVariation = true

Inicializar- flags=[]

Si acuSensor == TRUE , escribe los valores verificados y acusensor a flags .

Si this.reflectionPoint no está vacío, escriba el valor almacenado en flags .

Inicializar título_prueba = falso

Inicializar prueba_contenido = falso

Inicialice la prueba constante = this.extractProofOfExploit(testValue)

Si la prueba existe y la longitud de la prueba (matriz) es 2, entonces proof_title = proof[0] , proof_contents = proof[1] .

Si ambos , título_prueba y contenido_prueba , no están vacíos, escribe el valor verificado en flags .

Inicializar nueva Vuln

var newVuln = {
    typeId: "File_inclusion.xml",
    path: this.scheme.path,
    tags: flags,
    highlights: [matchedText],
    details: {
        input_type: this.scheme.getInputTypeStr(this.inputIndex),
        input_name: this.scheme.getInputName(this.inputIndex),
        proof_title: proof_title ? proof_title : false,
        proof_contents: proof_contents ? proof_contents : false,
        test_value: testValue,
        matched_text: matchedText ? matchedText : false,
        reflection_point: this.reflectionPoint ? this.reflectionPoint.url.url : false
    },
    http: this.lastJob.getNativeObject(),
    ssl: scriptArg.target.url.protocol == 'https',
    parameter: this.scheme.getInputName(this.inputIndex),
    attackVector: testValue
};

Si sourceFile no está vacío o AdditionalInfo no está vacío, agregue valor a newVuln

newVuln.sensor = {
    file: sourceFile,
    line: sourceLine,
    additional: additionalInfo
};

Agregue newVuln a scanState ( scanState.addVuln(newVuln) )

classFileInclusion.prototype.testInjection = función (valor, dontEncode)

Función

Intente realizar una inyección de sql y genere un elemento de informe si el intento falla.

contenido

Inicializar sensorPayload = value.includes(this.injectionValidator.startMark)

Devuelve falso si **!this.request(value, dontEncode) es verdadero** .

Inicializar trabajo = this.lastJob

Cree data = this.disableSensorBased , si está vacío, llame a getSensorData(this.lastJob) .

Si data y sensorPayload no están vacíos, inicialice la variable injRes = this.isFileInclusion(value, data)

​ Si injRes e injRes.adItem no están vacíos, asigne un valor a la variable adicional, adicional = "Archivo:" + injRes.data + "\r\n" + injRes.adItem.additional[0] , genere un elemento de informe this.alert (valor, "", injRes.adItem.fileName, injRes.adItem.fileNo, adicional, 1) y devuelve false .

De lo contrario, inicialice this.disableSensorBased = true .

​ Si this.reflectionPoint está vacío, asigne un valor a la variable matchedText , matchedText = this.injectionPatterns.searchOnText(job.response.toString()) , donde la información devuelta por el paquete de respuesta del trabajo se compara con la información en injectionPatterns y el resultado coincidente se asigna a matchedText .

Si el texto coincidente no está vacío, genere un elemento de informe this.alert (valor, texto coincidente) y devuelva falso .

devuelve verdadero .

classFileInclusion.prototype.testInjectionSelfInclude = función (valor)

Función

Intente realizar una inyección de sql y genere un elemento de informe si el intento falla.

contenido

Devuelve falso si el envío de la solicitud http falló ( !this.request(value, 0) ) .

Inicializar trabajo = this.lastJob .

Asigne un valor a matchmatch = job.response.toString().match(/(<%@[^%]+?%>)/) , , donde el método de coincidencia regular se compara <%@[^%]+?%>con el paquete de respuesta del trabajo , y si hay una cadena en job.response que cumple con las reglas de coincidencia, se asigna a match .

Si match y match[1] no están vacíos, genere un elemento de informe this.alert(value, match[1]) y devuelva false .

devuelve verdadero .

classFileInclusion.prototype.startTesting = función ()

Función

La función principal, que prueba todos los cambios de entrada.

contenido

Inicializar inputType = this.scheme.getInputTypeStr(this.inputIndex)

Inicializar inputName = this.scheme.getInputName(this.inputIndex)

Tome los valores en orden de this.variations

Si this.foundVulnOnVariation == false , salga del ciclo.

​ Asigne la variable this.currentVariation = i .

​ Si targetHasAcuSensor o ReflectPoint no está vacío

​ Si el punto de reflexión está vacío, entonces this.injectionValidator.startMark = rnd.randStrDigits(6) , this.injectionValidator.endMark = rnd.randStrDigits(6)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection(`1${this.injectionValidator.startMark}/../../xxx\\..\\..\\${this.injectionValidator.endMark}`)

否则,this.injectionValidator.startMark = rnd.randStrDigits(6)this.injectionValidator.endMark = rnd.randStrDigits(6)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection(`1${this.injectionValidator.startMark}/../../xxx\\..\\..\\${this.injectionValidator.endMark}`)

Si this.injectionPatterns no está vacío, asigne origValue = this.getOrigValue() e inicialice extension = "jpg" .

Si origValue no está vacío y origValue contiene palabras 符点".", tome la cadena después del último punto (.) y asígnela a la extensión .

Inicializar esquemaExtensión = ""

Inicializar esquemaPath = esquema.ruta

Si SchemePath no está vacío y SchemePath contiene palabras , tome la cadena después符点"." del último punto (.) y asígnela a SchemeExtension ; tome la cadena después de la última barra invertida (/) y asígnela a SchemeFileName .

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection("http://some-inexistent-website.acu/some_inexistent_file_with_long_name%3F." + extension, 1)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection("1some_inexistent_file_with_long_name%00." + extension, 1)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection("Http://" + AcuMonitor_AMServer + "/t/fit.txt", 1)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection("http://" + AcuMonitor_AMServer + "/t/fit.txt%3F." + extension, 1)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjection(AcuMonitor_AMServer, 0)

Si SchemeExtension == 'jsp' y origValue contiene la barra invertida de cadena (/) .

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude(schemePath)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude(schemePath.replace(/^\/[^\/]+/, ""))

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude(schemePath.replace(/^\/[^\/]+/, "").replace(/^\/[^\/]+/, ""))

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude(schemePath.replace(/^\/[^\/]+/, "").replace(/^\/[^\/]+/, "").replace(/^\/[^\/]+/, ""))

Si SchemeExtension == 'jsp' .

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude(schemeFileName)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude("./" + schemeFileName)

Si el resultado del intento de inyección es falso , continúe con el bucle.

!this.testInjectionSelfInclude("/" + schemeFileName)

SQL_Injection_In_Basic_Auth.script

Función

Primero determine si el sitio web visitado cumple con los requisitos de la inyección SQL, maneje la URL y llame a la función testInjection hasta cuatro veces para determinar si hay una inyección SQL.

probar nombre de usuario

probar contraseña

Nombre de usuario entre comillas simples, contraseña entre comillas dobles

Nombre de usuario entre comillas dobles, contraseña entre comillas simples

Incluir

#include constants.inc;
#include classErrorBasedSQLInjection.inc;

función personalizada

alerta de función (ruta, valor, trabajo, texto coincidente, archivo fuente, línea fuente, información adicional, acuSensor)

AWVS es una función utilizada para informar vulnerabilidades. Cuando se juzga una vulnerabilidad, se llama a esta función para informar la vulnerabilidad y se repite la información de vulnerabilidad correspondiente. Esto solo necesita conocer el efecto general, y un análisis cuidadoso implicará muchas funciones de llamada, por lo que no entraré en detalles.

solicitud de función (dir, withAop, ruta, valor)

Inicializar variables

lastJob = new THTTPJob();
lastJob.url = dir.url;
lastJob.uri = path;
lastJob.autoAuthenticate = false;

Agregue el nombre del encabezado Authorization al encabezado de solicitud lastJob y el valor es value . ( lastJob. request. addHeader(“Autorización”, valor, verdadero) )

Si withAop == True , llame a la función lastJob.addAspectHeaders() para agregar el encabezado de solicitud

enviar paquete lastJob.execute()

devuelve **!últimoTrabajo.wasError**

función testInjection(dir, withAop, ruta, valor, probador)

Asigne un valor a la variable sensorPayload

sensorPayload = value.includes("MUFDVVNUQVJUJ1wiKi9cclxuIFx0QUNVRU5EOmFhYWE=") || value.includes("YWFhYToxQUNVU1RBUlQnXCIqL1xyXG4gXHRBQ1VFTkQ=")
MUFDVVNUQVJUJ1wiKi9cclxuIFx0QUNVRU5EOmFhYWE=
BASE64解密结果
1ACUSTART'\"*/\r\n \tACUEND:aaaa

YWFhYToxQUNVU1RBUlQnXCIqL1xyXG4gXHRBQ1VFTkQ=
BASE64解密结果
aaaa:1ACUSTART'\"*/\r\n \tACUEND

Devuelve false si el resultado de la solicitud es false (request(dir, withAop, path, value)) .

trabajo de inicio = ultimotrabajo

datos = getSensorData(trabajo)

Si los datos no están vacíos y el resultado de la evaluación sensorPayload no está vacío, asigne la variable **injRes = tester.isSQLInjection(data, ACUINJSTART, ACUINJEND)** para determinar si hay una inyección SQL.

​ Si injRes e injRes.adItem no están vacíos, asigne la variable adicional = "Consulta SQL: " + injRes.data + "\r\n" + injRes.adItem.additional[0] y llame a la función de alerta ( alert(ruta , valor, trabajo, "", injRes.adItem.fileName, injRes.adItem.fileNo, adicional, 1) ) y devuelve false .

De lo contrario, inicialice la variable matchedText = errorMessages.searchOnText(job.response.body)

Si MatchedText no está vacío, llame a la función de alerta ( alert(path, value, job, matchedText) ) y devuelva false .

devuelve verdadero .

función principal

init dir = obtenerDirectorioActual()

Si el código de estado después de la solicitud es 401 y el valor de la variable del nombre de la variable WWW-Authenticate en el encabezado de la solicitud contiene Basic , entonces inicialice la variable

var lastJob = null;
var errorMessages = new classSQLErrorMessages();
var dirName = dir.fullPath;

​ Si el final de la URL no es una barra invertida (/) , agregue una barra invertida (/) al final de la URL ( if (dirName.charAt(dirName.length - 1) != '/') dirName = dirName + '/' )

Asignar variable **tester = new classErrorBasedSQLInjection(scanURL, errorMessages, null, 0)** La función es asignar valores a los atributos de la clase ( this.variations ).

​ Si dir.hasAcuSensor no está vacío

​ Si testInjection(dir, true, dirName, "Basic MUFDVVNUQVJUJ1wiKi9cclxuIFx0QUNVRU5EOmFhYWE=", tester) devuelve verdadero [Try Username], llame a la función testInjection ( testInjection(dir, true, dirName, "Basic YWFhYToxQUNVU1RBUlQn XCIqL1xyXG4gXHRBQ 1VFTkQ=", probador) ) 【Prueba contraseña】.

de lo contrario

Si testInjection(dir, false, dirName, "Basic Jzoi") devuelve verdadero [usuario de comillas simples, contraseña de comillas dobles], llame a la función testInjection ( testInjection(dir, false, dirName, 'Basic Ijon')) [comillas dobles usuario, contraseña de comillas simples].

SQL_Injection_In_URI.script

Función

Primero, determine si el sitio web visitado cumple con los requisitos de inyección SQL, maneje la URL y llame a la función testInjection hasta seis veces para determinar si hay inyección SQL.

Incluir

#include constants.inc;
#include classErrorBasedSQLInjection.inc;
#include dir_listing_helpers.inc;

función personalizada

alerta de función (ruta, valor, trabajo, texto coincidente, archivo fuente, línea fuente, información adicional, acuSensor)

AWVS es una función utilizada para informar vulnerabilidades. Cuando se juzga una vulnerabilidad, se llama a esta función para informar la vulnerabilidad y se repite la información de vulnerabilidad correspondiente.

solicitud de función (dir, withAop, ruta)

Inicializar variables

lastJob = new THTTPJob();
lastJob.url = dir.url;
lastJob.uri = path;

Si withAop == True , llame a la función lastJob.addAspectHeaders() para agregar el encabezado de solicitud

Agregar encabezado de solicitud

lastJob.request.addHeader('User-Agent', '1\'"2000', true);
lastJob.request.addHeader('referer', '1\'"3000', true);
lastJob.request.addHeader('client-ip', '1\'"4000', true);
lastJob.request.addHeader('x-forwarded-for', '1\'"5000', true);
lastJob.request.addHeader('accept-language', '1\'"6000', true);
lastJob.request.addHeader('via', '1\'"7000', true);

enviar paquete lastJob.execute()

devuelve **!últimoTrabajo.wasError**

función testInjection(dir, withAop, ruta, valor, probador)

Asignar variable sensorPayload = value.includes(ACUINJSTART)

Devuelve false si el resultado de la solicitud es false ( request(dir, withAop, path, value) ) .

trabajo de inicio = ultimotrabajo

datos = getSensorData(trabajo)

Si los datos no están vacíos y el resultado de la evaluación sensorPayload no está vacío, asigne la variable **injRes = tester.isSQLInjection(data, ACUINJSTART, ACUINJEND)** para determinar si hay una inyección SQL.

​ Si tanto injRes como injResinjRes no están vacíos, asigne la variable adicional = "Consulta SQL: " + injRes.data + "\r\n" + injRes.adItem.additional[0] y llame a la función de alerta ( alert(ruta, value , job, "", injRes.adItem.fileName, injRes.adItem.fileNo, adicional, 1) ) y devuelve false .

De lo contrario, inicialice la variable matchedText = errorMessages.searchOnText(job.response.body)

Si MatchedText no está vacío, llame a la función de alerta ( alert(path, value, job, matchedText) ) y devuelva false .

devuelve verdadero .

función principal

init dir = obtenerDirectorioActual()

Si el código de estado es 200 después de la solicitud , inicialice la variable matches = new classDirListingMatches()

​ Si **matches.searchOnText(dir.response.body)** está vacío, inicialice la variable

var lastJob = null;
var errorMessages = new classSQLErrorMessages();
var dirName = dir.fullPath;

​ Si el final de la URL no es una barra invertida (/) , agregue una barra invertida (/) al final de la URL ( if (dirName.charAt(dirName.length - 1) != '/') dirName = dirName + '/' )

Asignar variable **tester = new classErrorBasedSQLInjection(scanURL, errorMessages, null, 0)** La función es asignar valores a los atributos de la clase ( this.variations ).

​ Si dir.hasAcuSensor no está vacío

​ 如果testInjection(dir, true, dirName, dirName + `1 ACUINJSTART ′ " {ACUINJSTART}'"A C U I N J EMPEZAR _ _ _ _ "{ACUINJEND}`, tester, dirName)devuelvefalso, luego devuelveverdadero. [Construcción simple]

​ If testInjection(dir, true, dirName, dirName + `index/1 KaTeX parse error: Can't use function '\'' in math mode at position 14: {ACUINJSTART}\̲'̲" {ACUINJEND}`, tester , dirName) devuelve false , luego devuelve true . [construcción del índice]

​ If testInjection(dir, true, dirName, dirName + `?id=1 Error de análisis de KaTeX: no se puede usar la función '\'' en modo matemático en la posición 14: {ACUINJSTART}\̲'̲" {ACUINJEND}`, tester, dirName) devuelve false , luego devuelve true . [Construcción con parámetros]

Si MatchedText está vacío

Si el valor de retorno de testInjection(dir, false, dirName, dirName + "1'\“1000") es false , devuelve true . [Construcción simple]

​ Si el valor de retorno de testInjection(dir, false, dirName, dirName + "index/1'\“1000") es false , devuelve true . [construcción del índice]

​ Si el valor de retorno de testInjection(dir, false, dirName, dirName + "?id=1'\“1000") es false , devuelve true . [Construir con parámetros]

Supongo que te gusta

Origin blog.csdn.net/weixin_46706771/article/details/124208693
Recomendado
Clasificación