본문 바로가기

4-1. 2025-1 심화 스터디/cve 취약점 분석

[CVA-2025-0329] CVA_2주차_활동

1.

1.    CVE-2020-1938

 

Apache Tomcat-Ajp 프로토콜 취약점

AJP 프로토콜은 웹 서버에서 받은 요청을 어플리케이션 서버로 전달해주는 프로토콜

Apache Tomcat에서 AJP 프로토콜을 이용해 /webapps/ROOT 디렉터 리 하위 파일을 읽을 수 있는 원격 코드 실행 취약점

웹 어플리케이션 프로그램의 파일 업로드 및 저장을 이용하여 악성 jsp 코드를 업로드하면 원격 코드 실행이 가능

 

2.    영향 받는 소프트웨어 버전

-Tomcat: HTTP Connector HTTP 프로토콜의 기본 포트인 8080으로 클라이언트에게 노출되고 AJP는 서버 사이에서 내부적으로 사용되어 기본 포트로 8009를 사용함. 취약한 버전의 Tomcat 설치 시에는 8009 포트가 기본적으로 활성화되어 있음.

AJP Request Apache에서 Tomcat으로 전송될 때 사용자 입력 값 검증 없이 실행되면서 임의로 파일을 읽거나 실행이 가능해짐. Tomcat AJP request를 받았을 경우에 org.apache.coyote.ajp.AjpProcessor.java를 호출하고 prepareRequest() AJP 메시지 내용을 추출하여 Request 객체의 Attribute 속성으로 설정함.

Request 메시지 헤더에서는 파일 확장자에 따라 * JSP 파일은 JspServlet.java에서 처리하 고 그 외의 파일은 DefaultServelet.java에서 처리하게 됨. JspServlet.java 클래스는 request 메시지를 컴파일러에게 전송하여 서버에 전달함. 변형된 attribute라면 변조된 URI 경로 상의 파일이 실행됨. 임의의 파일이 실행되기 위해서는 DefaultSevlet.java를 실행해야 하는 파일도 JspServlet.java를 수행하게 해야 함.

코드를 보면 AJP Header 패킷에서 attribute_name attribute_value 값을 n v에 저장해 attribute 요청인지 아닌지를 확인한 후 request 메시지로 캡슐화하여 넘김. 입력 받은 n, v 값에 대한 별도의 검증이 없어 공격이 가능하게 됨.

 

 

3.    PoC 분석

PoC Ajpshooter AJP port 8009를 통해 3개의 Attribute 설정 중 javax.servlet.include.request_uri, javax.servlet.include.sevlet_path 2개의 속성값을 변조하여 전송함. POC 코드를 확인해보면 취약점이 존재하는 ‘SC_A_REQ_ATTRIBUTE’구문 실행을 위해서 ‘SC_A_REQ_ATTRIBUTE’값에 0A를 입력해서 전송함. 그리고 shoot()함수에서 사용자에게 입력받은 javax.servlet.include.request_uri javax.servlet.include.servlet_path을 이용하여 DefaultServlet.java이나 JspServlet.java여부를 결정함. /index라는 리소스를 include하는 요청처럼 조작하는 것.

 

4.    실습

파일을 업로드하면 다음과 같이 출력되고 filestorage에 저장된 것을 확인할 수 있음.

 

/WEB-INF/web.xml에 접근하면 404 오류가 출력됨. Ajpshooter web.xml 읽기를 시 도하면 web.xml이 읽을 수 있었음. 위의 코드로 텍스트 파일을 만들고 파일 업로드를 함. 위의 코드는 웹쉘을 다운받고 webapp/root/cmp.jsp를 생성하도록 함. Ajpshooter로 텍스트 파일을 읽을 수 있는지 확인하고 Ajpshooter로 텍스트 파일이 jsp 파일처럼 실행하게 함.

 

지정한 파일 위치에 cmd.jsp를 볼 수 있음. 생성된 cmd.jsp whoami를 입력하면 윈도우 cmd창에 입력한 결과와 같은 결과가 나옴.

대응방안에는 최신 버전 업데이트와 주석 처리하여 AJP Connector 비활성화가 있음.

 

 

 

2.

1. CVE-2025-28916: PHP Remote File Inclusion

특징

  • 취약점 이름: Improper Control of Filename for Include/Require Statement in PHP Program ('PHP Remote File Inclusion')
  • 영향: NotFound Docpro
  • 버전: from n/a through 2.0.1
  • 심각도: Critical (CVSS 9~10)

설명

PHP Remote File Inclusion (RFI) 취약점은 공격자가 원격 서버에서 파일을 포함시킬 수 있는 상황을 말함. 이는 PHP include require 함수를 통해 발생하며, 공격자는 악성 코드를 포함시켜 서버를 제어할 수 있음.

이 취약점은 PHP Local File Inclusion뿐만 아니라, 원격 파일을 포함시킬 수 있는 상황도 포함됨. 이는 서버의 보안 설정이 적절히 구성되지 않았거나, allow_url_include가 활성화된 경우에 특히 위험함. 공격자는 이를 통해 악성 스크립트를 실행하여 시스템을 손상시킬 수 있음.

파훼 방법

  1. 입력 유효성 검사: 사용자 입력을 철저히 검사하여 악성 파일을 포함시키지 않도록 함.
  2. 절대 경로 사용: 상대 경로 대신 절대 경로를 사용하여 파일을 포함시킴.
  3. allow_url_include 설정: PHP 설정에서 allow_url_include Off로 설정하여 원격 파일 포함을 차단함.

예시 코드 (PHP):

php

// 절대 경로 사용

include_once __DIR__ . '/path/to/file.php';

 

// allow_url_include 설정 (php.ini)

allow_url_include = Off

 

2. CVE-2025-28893: Code Injection

특징

  • 취약점 이름: Improper Control of Generation of Code ('Code Injection')
  • 영향: NotFound Visual Text Editor
  • 버전: from n/a through 1.2.1
  • 심각도: Critical (CVSS 9~10)

설명

Code Injection 취약점은 공격자가 임의의 코드를 실행할 수 있는 상황을 말함. 이는 주로 사용자 입력을 제대로 검사하지 않을 때 발생하며, 공격자는 서버에 악성 코드를 삽입하여 제어할 수 있음.

Code Injection은 특히 웹 애플리케이션에서 위험하며, 공격자가 서버의 내부 환경을 탐색하거나 데이터베이스를 조작하는 데 사용할 수 있음. 이 취약점은 개발자가 사용자 입력값을 직접적으로 코드로 변환하거나 실행할 때 발생할 가능성이 높음.

파훼 방법

  1. 입력 필터링: 사용자 입력을 철저히 필터링하여 악성 코드를 차단함.
  2. 코드 검사: 사용자 입력을 코드로 변환하기 전에 철저히 검사함.
  3. OWASP ESAPI 사용: OWASP ESAPI와 같은 보안 라이브러리를 사용하여 입력을 안전하게 처리함.

예시 코드 (PHP):

php

// 사용자 입력 필터링

function filterInput($input) {

    $input = trim($input);

    $input = stripslashes($input);

    $input = htmlspecialchars($input);

    return $input;

}

 

// 사용자 입력을 코드로 변환하기 전에 검사

if (preg_match('/[^a-zA-Z0-9]/', $input)) {

    echo "Invalid input";

    exit;

}

'4-1. 2025-1 심화 스터디 > cve 취약점 분석' 카테고리의 다른 글

CVA_3주차_ 활동  (0) 2025.04.06
[CVA-2025-0322] CVA_1주차_활동  (0) 2025.03.24