2009-12-10 10 views
13

al giorno d'oggi è possibile leggere molto sul codice di iniezione, exploit, buffer, stack e overflow ecc. Che portano all'iniezione e all'esecuzione del codice. Mi chiedo che cosa di questa roba sia rilevante per Java.È possibile l'iniezione di codice in Java?

Lo so, non ci sono puntatori nel linguaggio Java. Ma la JVM non organizza i dati in cumuli e/o pile? So che non esiste alcuna funzione eval (come in PHP), quindi non puoi usare facilmente un input come codice Java. Non sono sicuro di cosa sta succedendo a livello di codice byte.

Penso che XSS sia possibile, ad esempio in un'applicazione Java EE, quando nessun input viene filtrato. Ma non è più un'iniezione JavaScript, perché il codice inserito viene eseguito nel browser e non nella JVM?

Quindi quali iniezioni di codice sono possibili con java e quali no? Ed è vero anche per altri linguaggi di piattaforma Java?

Grazie in anticipo.

risposta

15

Un programma java non è praticamente vulnerabile all'iniezione di codice. Tuttavia, tutto il codice nativo che supporta l'app è vulnerabile a tutti i diversi tipi di iniezione di codice, inclusi la JVM e tutte le parti di codice native nell'app o nelle sue librerie.

Inoltre, ci sono un paio di cose da considerare:

Tutto ciò in cui Java è utilizzato come un gateway per altri sistemi è possibile:

SQL Injection

XSS (che è alla fine nient'altro che JavaScript Injection)

Se il programma java è esso stesso un interprete/compilatore di qualche tipo, potrebbe essere possibile inserire codice nel tuo programma interpretato/compilato (questo include l'uso del programma come jav un compilatore ...)

E ovviamente se è possibile ottenere il programma java per scrivere un file su disco che contiene codice (sia esso nativo, java o altro) si potrebbe essere in grado di farlo eseguito con altri mezzi (che può essere una diversa vulnerabilità nella tua app, nel sistema operativo o in un'altra app): non si tratta di un'iniezione diretta del codice, ma piuttosto simile in effetti.

4

Se l'applicazione server crea bytecode in fase di esecuzione (per esempio con BCEL o Javassist), e se questa creazione può essere influenzato da input dell'utente, poi un'iniezione di codice è possibile.

Tuttavia, se l'applicazione non utilizza la magia (che dovrebbe essere il 99% di tutte le applicazioni), non sarà possibile.

0

Non è possibile iniettare Java. Ma se non stai attento, la gente potrebbe iniettare Javascript (cioè XSS come dici tu) o SQL. Ci sono cumuli e pile, ma non c'è modo di raggiungerli.

3

È possibile scrivere un servizio Web che accetta uno snippet di codice Java, lo racchiude in una dichiarazione di classe/metodo, lo ha salvato su disco, ha eseguito il compilatore su di esso, quindi caricato dinamicamente ed eseguito il risultato. Quindi l'iniezione di codice è certamente possibile.

Ma con le tipiche implementazioni Java, forse non è molto efficiente a causa del processo di compilazione relativamente pesante (potrebbe comunque essere pratico per alcune app).

L'iniezione di codice è molto importante con SQL perché la "prima ipotesi" di molti principianti consiste nell'utilizzare la concatenazione di stringhe per inserire variabili in un'istruzione. Ma raramente emerge come un'idea tra i programmatori Java. Quindi questa è la ragione per cui non è molto preoccupante.

Se i compilatori Java vengono esposti come servizi di libreria leggeri, si otterrà qualcosa di molto più vicino all'equivalente di eval e quindi potrebbe iniziare a diventare un problema rilevante.

+0

L'osservazione di efficienza non sembra terribilmente rilevante in questo contesto, l'iniezione di codice non ha necessariamente bisogno di essere efficiente. La maggior parte degli exploit non richiede prestazioni elevate ... Il punto è che non molte app fanno la cosa "accetta codice, compila, eseguilo", ma quelle che lo fanno sarebbero vulnerabili. – sleske

+0

"Se i compilatori Java vengono esposti come servizi di libreria leggeri": beh, lo sono già (controlla javax.tools.JavaCompiler, http://java.sun.com/javase/6/docs/api/javax/tools /JavaCompiler.html). Ma ancora una volta, perché l'iniezione di codice funzioni, l'app sotto attacco deve * usare * JavaCompiler, che per fortuna no. – sleske

+1

-1 perché la discussione sulle vulnerabilità è piuttosto confusa ... – sleske

0

Non è possibile iniettare java, ma tutte le applicazioni Web sono vulnerabili a XSS se l'input non è filtrato correttamente. Anche qualsiasi applicazione che interagisce con un database SQL può essere vulnerabile all'iniezione SQL. Per evitare ciò vorrai esaminare le query parametrizzate.

1

A meno che non si stiano facendo cose strane sul server (come la generazione dinamica di codice, ecc.), È impossibile generare dati per l'iniezione di codice.

Anche se posso pensare a una (brutta) situazione in cui l'applicazione crea dinamicamente un JSP in base all'input dell'utente. Quel JSP sarà tradotto in codice Java, che viene compilato in byte-code dal contenitore web, e quindi eseguito. Questo potrebbe introdurre un punto di iniezione. Ma generare genericamente JSP in modo dinamico non ha alcun senso.

2

Se fosse possibile, Java sarebbe già morto da molto tempo.

D'altra parte, iniezioni SQL sono molto facile evitare utilizzando PreparedStatement per memorizzare input dell'utente controllato e XSS è anche molto facile da evitare utilizzando <c:out/> per (ri) visualizzando input dell'utente controllata di pagina web.

2

Ci sono un paio di modi in cui il codice Java può essere iniettato in un'applicazione come l'utilizzo dell'API di scripting o degli include JSP dinamici.

Il codice seguente consente a un utente di inserire Javascript arbitrario nel motore di script di Java.

import javax.script.*; 

public class Example1 { 
    public static void main(String[] args) { 
     try { 
      ScriptEngineManager manager = new ScriptEngineManager(); 
      ScriptEngine engine = manager.getEngineByName("JavaScript"); 
      System.out.println(args[0]); 
      engine.eval("print('"+ args[0] + "')"); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

In questo caso, l'attaccante decide di iniettare codice che crea un file nel file system.

hallo'); var fImport = new JavaImporter(java.io.File); with(fImport) { var f = new File('new'); f.createNewFile(); } // 

sito assegno owasp per ulteriori esempi

Problemi correlati