관리 메뉴

yubyeong

OWASP TOP 10 -A03 (Injection :인젝션) 본문

Web Hacking/OWASP TOP 10

OWASP TOP 10 -A03 (Injection :인젝션)

yubyeong 2025. 5. 6. 17:51
A01 Broken Access Control (접근 권한 취약점)
A02 Cryptographic Failures (암호화 오류)
A03 Injection (인젝션)
A04 Insecure Design (안전하지 않은 설계)
A05 Security Misconfiguration (보안설정오류)
A06 Vulnerable and Outdated Components (취약하고 오래된 소스)
A07 Identification and Authentication Failures (식별 및 인증 오류)
A08 Software and Data Integrity Failures (소프트웨어 및 데이터 무결성 오류)
A09 Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)
A10 Server-Side Request Forgery (서버 측 요청 위조)

A03 : Injection (인젝션)

  • slides down to the third position. 94% of the applications were tested for some form of injection, and the 33 CWEs mapped into this category have the second most occurrences in applications. Cross-site Scripting is now part of this category in this edition.
  • 2017년 순위에서 3위로 밀려났다. 애플리케이션의 94%가 어떤 형태로든 인젝션 공격을 받았는지 테스트되었으며, 이 범주에 포함된 33개의 CWE는 애플리케이션에서 두 번째로 많이 발생하였다. 이번 버전에서는 크로스 사이트 스크립팅이 이 범주에 포함되었다. (2017년 1위 Injection + 2017년 7위 XSS ⇒ 2021년 3위)
    • CWE-89: SQL 주입.
    • CWE-74: 파일 이름 또는 경로의 외부 제어.

설명

  • 입력 유효성 검사 및 데이터 처리의 부적절한 처리에 취약점을 이용. 공격자는 SQL 쿼리, 코드 스니펫 또는 명령을 웹 애플리케이션 양식 또는 URL에 주입. 이를 통해 공격자는 민감한 데이터에 액세스하고 애플리케이션의 동작을 조작 가능.
  • SQL, NoSQL, OS 명령, ORM(Object Relational Mapping), LDAP, EL(Expression Language) 또는 OGNL(Object Graph Navigation Library) 인젝션 취약점은 신뢰할 수 없는 데이터가 명령어나 쿼리문의 일부분으로써,인터프리터로 보내질 때 취약점이 발생. ⇒ 주입식 공격
    • 인젝션 공격에 취약한 애플리케이션
      • 사용자가 제공한 데이터는 애플리케이션에서 검증, 필터링 또는 정리되지 않는다.
      • 컨텍스트 인식 이스케이프가 업는 동적 쿼리나 매개변수화되지 않은 호출은 인터프리터에서 직접 사용된다.
      • 적대적인 데이터는 ORM(객체 관계 매핑) 검색 매개변수 내에서 추가적이고 민감한 레코드를 추출하는데 사용.
      • 악의적인 데이터가 직접 사용되거나 연결, SQL 또는 명령에 동적 쿼리, 명령 또는 저장 프로시저의 구조와 악의적인 데이터가 포함.

예방법

  • 가장 좋은 방법은 소스 코드 검토이다. 모든 매개변수, 헤더, URL, 쿠키, JSON, SOAP, 및 XML 데이터 입력에 대한 자동화된 테스트를 강력히 권장.
  • CI/CD 파이프라인에 정적(SAST), 동적(DAST), 대화형(IAST) 애플리케이션 보안 테스트 도구를 포함하여 프로덕션 배포 전에 인젝션 취약점을 식별 가능.
  • 인터프리터를 완전히 사용하지 않고, 매개변수화된 인터페이스를 제공, ORM(객체 관계 매핑 도구)로 마이그레이션하는 안전한 API 를 사용.
  • 잔여 동적 쿼리의 경우, 해당 인터프리터의 특정 이스케이프 구문을 사용하여 특수 문자를 이스케이프 처리.
    • 테이블 이름, 열(속성) 이름 등의 SQL 구조는 이스케이프 처리할 수 없음에 사용자가 지정한 구조 이름은 위험하다.
  • SQL 주입 시 대량의 레코드가 공개되는 것을 방지하기 위해 쿼리 내에서 LIMIT 및 기타 SQL 컨트롤을 사용.

공격 시나리오 예시

  • SQL Injection (SQL 삽입): 데이터베이스 공격을 위해 SQL 쿼리를 주입하는 것으로, 공격자는 데이터베이스를 조작하거나 민감한 정보를 탈취할 수 있다.
  • Cross-Site Scripting (XSS, 크로스 사이트 스크립팅): 주로 JavaScript 기반 브라우저 공격으로, 감염된 웹 페이지를 통해 세션 탈취, 쿠키 도용 또는 사용자에 대한 기타 공격을 수행.
  • Command Injection (명령 삽입): 공격자는 애플리케이션에서 실행되는 시스템 명령에 악성 명령을 주입하여 서버를 제어하거나 무단 작업을 수행.
  • LDAP Injection (LDAP 삽입): 공격자는 인증 및 권한 부여에 사용되는 LDAP 쿼리를 조작하여 액세스 권한을 얻는다.
  • XML Injection (XML 삽입): 공격자는 XML 데이터에 악의적인 내용을 삽입하여 애플리케이션의 구문 분석 프로세스를 방해하고 액세스 권한을 얻을 수 있다.
  • Server-Side Template Injection (SSTI, 서버 측 템플릿 삽입): 공격자는 서버 측 템플릿에 악성 코드를 주입하여 서버에서 코드를 실행할 수 있다.
  • 시나리오 1:
String query = "SELECT \\* FROM accounts WHERE custID='" + request.getParameter("id") + "'";
  • 시나리오 2: 프레임워크에 대한 애플리케이션의 맹목적인 신뢰로 인해 여전히 취약한 쿼리가 발생할 수 있다(예: Hibernate Query Language(HQL))
 Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
  • 위의 두 경우 모두 공격자는 브라우저에서 ‘id’ 매개변수 값을 수정하여 ‘UNION SLEEP(10);—’ 를 전송. 예를 들어
http://example.com/app/accountView?id=' UNION SELECT SLEEP(10);--

      이렇게 하면 두 쿼리의 의미가 모두 변경되어 계정 테이블의 모든 레코드 반환.

Injection 항목의 CWE 목록

CWE-20 부적절한 입력 검증

CWE-74 하위 구성 요소에서 사용되는 출력의 특수 요소의 부적절한 중화('주입')

CWE-75 특수 원소를 다른 평면으로 살균하지 못함(특수 원소 주입)

CWE-77 명령에 사용되는 특수 요소의 부적절한 무력화('명령 주입')

CWE-78 OS 명령에 사용되는 특수 요소의 부적절한 무력화('OS 명령 주입')

CWE-79 웹 페이지 생성 중 입력의 부적절한 무효화('교차 사이트 스크립팅')

CWE-80 웹 페이지에서 스크립트 관련 HTML 태그의 부적절한 무효화(기본 XSS)

CWE-83 웹 페이지의 속성에 있는 스크립트의 부적절한 무력화

CWE-87 대체 XSS 구문의 부적절한 무력화

CWE-88 명령문에서 인수 구분 기호의 부적절한 무효화('인수 삽입')

CWE-89 SQL 명령에 사용된 특수 요소의 부적절한 무력화('SQL 주입')

CWE-90 LDAP 쿼리에 사용된 특수 요소의 부적절한 무력화('LDAP 주입')

CWE-91 XML 주입(일명 블라인드 XPath 주입)

CWE-93 CRLF 시퀀스의 부적절한 중화('CRLF 주입')

CWE-94 코드 생성의 부적절한 제어('코드 삽입')

CWE-95 동적으로 평가되는 코드에서 지시문의 부적절한 무력화('Eval Injection')

CWE-96 정적으로 저장된 코드의 지시문의 부적절한 무력화('정적 코드 삽입')

CWE-97 웹 페이지 내 서버 측 포함(SSI)의 부적절한 무력화

CWE-98 PHP 프로그램의 Include/Require 문에 대한 파일 이름의 부적절한 제어('PHP 원격 파일 포함')

CWE-99 리소스 식별자의 부적절한 제어('리소스 주입')

CWE-100 더 이상 사용되지 않음: 입력 검증 문제에 대한 포괄적인 용어였습니다.

CWE-113 HTTP 헤더의 CRLF 시퀀스의 부적절한 무력화('HTTP 응답 분할')

CWE-116 출력의 부적절한 인코딩 또는 이스케이프

CWE-138 특수 원소의 부적절한 중화

CWE-184 허용되지 않는 입력의 불완전한 목록

CWE-470 외부 제어 입력을 사용하여 클래스 또는 코드 선택('안전하지 않은 반사')

CWE-471 가정된 불변 데이터 수정(MAID)

CWE-564 SQL 주입: Hibernate

CWE-610 다른 영역의 리소스에 대한 외부 제어 참조

CWE-643 XPath 표현식 내 데이터의 부적절한 중립화('XPath 주입')

CWE-644 스크립팅 구문에 대한 HTTP 헤더의 부적절한 중립화

CWE-652 XQuery 표현식 내 데이터의 부적절한 중립화('XQuery 주입')

CWE-917 표현 언어 문장에 사용된 특수 요소의 부적절한 무력화('표현 언어 주입')

참고자료

https://owasp.org/www-project-top-ten/

https://velog.io/@minjeong-dev/2021-OWASP-10대-취약점

https://oobwrite.com/entry/OWASP-TOP10-2023-소개-및-정리