Java에서 코드 삽입이 가능합니까?




스프링 컨트롤러에서 alert (7)

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

또한 고려해야 할 몇 가지 사항이 있습니다.

java가 다른 시스템에 대한 게이트웨이로 사용되는 곳은 모두 가능합니다.

SQL 삽입

XSS (결국 자바 스크립트 인젝션 이상입니다)

자바 프로그램 자체가 어떤 종류의 인터프리터 / 컴파일러 인 경우 인터프리터 언어 / 컴파일 된 프로그램에 코드를 삽입하는 것이 가능할 수 있습니다 (프로그램을 Java 컴파일러로 사용하는 경우 포함)

물론 자바 프로그램을 사용하여 코드가 포함 된 파일 (네이티브, 자바 또는 다른 것일 수 있음)을 디스크에 기록 할 수 있다면 다른 방법으로 실행할 수 있습니다 (앱의 다른 취약점 일 수 있음). , os 또는 다른 응용 프로그램) - 이것은 직접적인 코드 삽입이 아니지만 효과면에서는 비슷합니다.

요즘에는 코드 삽입, 익스플로잇, 버퍼 -, 스택 - 및 힙 오버 플로우 등에 대해 많이 읽고 코드를 주입하고 실행할 수 있습니다. 이 물건이 자바와 어떤 관련이 있는지 궁금합니다.

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

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

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

미리 감사드립니다.


서버에서 이상한 일을하지 않는 한 (코드를 동적으로 생성하는 등), 코드 삽입에 대한 배제가 불가능합니다.

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


스크립팅 API 또는 동적 JSP 포함을 사용하여 Java 코드를 응용 프로그램에 주입 할 수있는 몇 가지 방법이 있습니다.

아래 코드는 사용자가 임의의 Javascript를 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();
        }
    }
}

이 경우 공격자는 파일 시스템에 파일을 만드는 코드를 삽입하기로 결정합니다.

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

자세한 예제는 owasp 웹 사이트를 확인하십시오.


가능했다면 자바는 이미 오래 전에 죽었을 것입니다.

반면 SQL 인젝션은 PreparedStatement 를 사용하여 사용자가 제어하는 ​​입력을 저장하는 것을 피하기 쉽고, XSS는 웹 페이지에서 사용자가 제어하는 ​​입력을 표시하기 위해 <c:out/> 을 사용하여 피하기가 매우 쉽습니다.


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


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

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


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





code-injection