2009-12-10 5 views
13

요즘에는 코드 주입, 악용, 버퍼 -, 스택 - 및 힙 - 오버플로 등을 읽고 코드를 주입하고 실행할 수 있습니다. 이 물건이 자바와 어떤 관련이 있는지 궁금합니다.Java에서 코드 삽입이 가능합니까?

Java 언어에는 포인터가 없습니다. 그러나 JVM은 힙 및/또는 스택으로 데이터를 구성하지 않습니다. PHP 같은 eval 함수가 없다는 것을 알고 있으므로 Java 코드로 입력을 쉽게 사용할 수 없습니다. 바이트 코드 수준에서 무슨 일이 일어나고 있는지 잘 모르겠습니다.

입력이 필터링되지 않는 경우 예를 들어 Java EE 애플리케이션에서 XSS가 가능하다고 생각합니다. 그러나 주입 된 코드가 JVM이 아닌 브라우저에서 실행되기 때문에 이것이 자바 스크립트 삽입이 아닌가?

자바에서는 어떤 코드 삽입이 가능하며 어떤 코드 삽입이 가능하지 않습니까? 그리고 다른 Java 플랫폼 언어에서도 마찬가지입니까?

미리 감사드립니다.

답변

15

자바 프로그램 자체는 코드 삽입에 거의 취약하지 않습니다. 그러나 앱을 지원하는 모든 원시 코드는 모든 다른 종류의 코드 삽입에 취약합니다. 여기에는 JVM 및 앱 또는 라이브러리의 모든 원시 코드 부분이 포함됩니다.자바는 다른 시스템에 대한 게이트웨이로 사용됩니다

뭐든지 가능하다 :

또한 고려해야 할 몇 가지 더 가지가 있습니다

말에 SQL 주입

XSS (자바 스크립트 프로그램 이외의 것)

자바 프로그램이 일종의 인터프리터/컴파일러 인 경우 해석 된 언어/컴파일 된 프로그램에 코드를 삽입 할 수 있습니다 (프로그램에 jav 컴파일러 ...)

물론 코드를 포함하는 디스크에 파일을 작성하는 자바 프로그램을 얻을 수 있다면 (다른 네이티브, 자바 또는 다른 것일 수도 있습니다) 다른 방법으로 실행될 수 있습니다. (귀하의 응용 프로그램, OS 또는 다른 응용 프로그램에서 다른 취약성이 될 수 있음) - 이것은 직접 코드 삽입이 아니지만 그 효과는 매우 비슷합니다.

4

런타임시 서버 응용 프로그램이 바이트 코드를 생성하는 경우 (예 : BCEL 또는 Javassist)이 작성이 사용자 입력의 영향을받을 수있는 경우 코드 삽입이 가능합니다.

그러나 응용 프로그램이 모든 응용 프로그램의 99 %에 해당하는 마법을 사용하지 않으면 불가능합니다.

0

Java를 삽입 할 수 없습니다. 그러나 조심하지 않으면 사람들은 Javascript (즉 XSS 언급) 또는 SQL을 주입 할 수 있습니다. 힙과 스택이 있지만 얻을 수있는 방법은 없습니다.

3

Java 코드 스 니펫을 허용하고 클래스/메소드 선언에 랩핑 한 다음 웹 서비스를 작성하여 디스크에 저장하고 컴파일러를 실행 한 다음 결과를 동적으로로드 및 실행 할 수 있습니다. 그래서 코드 삽입이 가능합니다.

일반적인 Java 구현의 경우 컴파일 과정이 비교적 복잡하기 때문에 효율성이 떨어집니다 (일부 응용 프로그램의 경우 여전히 유용 할 수 있음).

코드 삽입은 많은 초보자의 "첫 번째 추측"이 변수 연결을 사용하여 문에 변수를 삽입하기 때문에 SQL과 매우 관련이 있습니다. 그러나 자바 프로그래머들 사이에서는 거의 아이디어로 간주되지 않습니다. 그래서 그게별로 관심사가 아닙니다.

자바 컴파일러가 경량 라이브러리 서비스로 노출되면 eval에 훨씬 더 가깝게되어 관련 우려가 될 수 있습니다.

+0

에 대한

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

체크 owasp 웹 사이트는 코드 주입 반드시 효율적으로 할 필요가 없습니다. 대부분의 악용에는 고성능이 필요하지 않습니다 .... 요점은 많은 앱이 "코드 승인, 컴파일, 실행"기능을 제공하지 않지만 취약한 앱은 취약한 기능을 제공한다는 것입니다. – sleske

+0

"Java 컴파일러가 경량 라이브러리 서비스로 노출되면"잘 있습니다. 이미 사용하고 있습니다 (http://java.sun.com/javase/6/docs/api/javax/tools를 확인하십시오). /JavaCompiler.html). 그러나 코드 삽입이 작동하려면 공격 받고있는 앱이 JavaCompiler를 사용해야합니다. 가장 많이 다행히도 JavaCompiler는 사용하지 않습니다. – sleske

+1

- 1 취약점에 대한 논의가 다소 혼란 스럽기 때문에 ... – sleske

0

자바를 삽입 할 수는 없지만 입력이 적절하게 필터링되지 않으면 모든 웹 응용 프로그램이 XSS에 취약합니다. 또한 SQL 데이터베이스와 상호 작용하는 모든 응용 프로그램은 SQL 주입에 취약 할 수 있습니다. 이것을 피하려면 매개 변수가있는 쿼리를 살펴 보는 것이 좋습니다.

1

코드를 동적으로 생성하는 등 서버에서 이상한 일을하지 않는 한, 코드 삽입에 대해 vunerable을 수행하는 것은 불가능합니다.

응용 프로그램이 사용자 입력을 기반으로 동적으로 JSP를 만드는 (못생긴) 상황을 생각할 수도 있지만. JSP는 웹 컨테이너에 의해 바이트 코드로 컴파일되고 실행 된 Java 코드로 변환 될 것입니다. 이것은 주입 지점을 도입 할 수 있습니다. 그러나 JSP를 동적으로 생성하는 것은 일반적으로 의미가 없습니다.

2

가능한 경우 Java는 이미 오래 동안 죽었을 것입니다.

반면에 SQL 주입은 PreparedStatement을 사용하여 사용자 제어 입력을 저장하고 XSS를 사용하면 매우 쉽게 피할 수 있습니다. <c:out/>을 사용하여 웹 페이지에서 사용자 제어 입력을 표시합니다.

2

스크립팅 API 또는 동적 JSP 포함을 사용하여 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(); 
     } 
    } 
} 

이 경우 공격자는 파일 시스템에 파일을 생성하는 코드를 삽입하기로 결정합니다. 효율성에 대한 발언이 상황에서 정말 중요한 것 같지 않습니다 더 많은 예제

관련 문제