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 _in
como 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]