SQLi tramite una variabile "Long" è possibile in Java / Hibernate?

1

Sto dando un'occhiata a un codice sorgente webapp e, sebbene lo sviluppatore sia stato abbastanza attento da utilizzare le istruzioni preparate per compilare i parametri "String" della query, ha inserito tutti i parametri "Long" della query usando una semplice concatenazione.

Example:

Obs: lo stato ha tipo Stringa , var1 ha tipo Lungo

Query query = entityManager.createQuery(
            "SELECT UPPER(request.attributeValue) FROM PreOrderedRequests request 
             WHERE request.status = :status AND request.report.id = " + var1);

So che non avrebbe dovuto farlo, ma la mia domanda è: qualcuno ha visto qui un vero exploit per questo? Come si potrebbe approfittare di questo comportamento?

Per i sospetti: non sto hacking nulla. Solo un mio amico che mi ha chiesto di dare un'occhiata a questo specifico pezzo di codice.

    
posta DarkLighting 09.08.2016 - 00:17
fonte

2 risposte

1

Nel tuo esempio Java:

Query query = entityManager.createQuery(
        "SELECT UPPER(request.attributeValue) FROM PreOrderedRequests request 
         WHERE request.status = :status AND request.report.id = " + var1);

Se var1 è un byte , short , int , long allora non c'è alcun exploit di sicurezza. Questi saranno interpretati dal server SQL come previsto dallo sviluppatore.

Se "istruzioni preparate memorizzate nella cache" è abilitato, tale codice comprometterebbe l'efficacia della cache, ma ciò non si configurerebbe come un problema di sicurezza.

Se var1 era double , float o char , un utente malintenzionato potrebbe probabilmente causare un errore di sintassi SQL (con Infinity , -Infinity o qualche attore char imprevisto), ma sarebbe raro che quell'errore diventasse un attacco SQLi utilizzabile. Questo sarebbe principalmente un mezzo per raccogliere informazioni. (Ad esempio, le pagine di errore potrebbero rivelare una vulnerabilità in alcuni casi limite)

Se var1 era un String , è ovviamente un problema serio.

Se var1 era un altro Object , il rischio dipenderebbe dal metodo Object toString . (ovvero Integer è sicuro, ma CharSequence non è sicuro e Collection probabilmente non è sicuro)

    
risposta data 09.08.2016 - 02:14
fonte
0

Java è un linguaggio tipizzato staticamente, il che significa che i tipi sono definiti in fase di compilazione.

Quindi, se c'è Long in Java, non c'è modo di cambiarlo in String in alcun modo e fare l'iniezione. Se questo sarebbe un linguaggio dinamico diverso, allora è teoricamente possibile, tuttavia alcuni framework web come Play e Grails richiedono o raccomandano la definizione statica di ogni argomento passato tramite GET e POST.

Così come i parametri GET e POST sono definiti staticamente, durante l'analisi dell'argomento il framework web Java verificherà se l'argomento passato è effettivamente qualcosa che può essere convertito in Long. Se non può essere, verrà lanciata l'eccezione e l'intera richiesta verrà respinta senza avviare alcuna query SQL.

Anche se l'argomento GET / POST è definito come String, poiché var1 è scritto come Long, sarà sempre convertito in Long e mai sostituito con String.

Quindi non c'è modo di sfruttare questa concatenazione.

    
risposta data 09.08.2016 - 02:06
fonte

Leggi altre domande sui tag