A03 2021 – Injection

HW·2024년 10월 2일

Injection
외부에서 입력된 데이터를 적절히 검증하지 않고 사용하는 경우 발생하는 취약점
사용자가 제공한 데이터가 애플리케이션에 의해 직접적으로 쿼리나 명령으로 해석될 때 발생하며, 악의적인 데이터가 삽입되어 데이터베이스나 시스템에 영향을 줄 수 있다.

언제 발생?

  • 사용자 입력 미검증: 사용자가 입력한 데이터가 검증, 필터링 또는 정화되지 않은 상태로 사용될 때
  • 동적 쿼리 사용: 파라미터화된 호출 없이 직접 동적 쿼리나 명령이 사용될 때
  • ORM의 취약한 검색 조건: ORM에서 악의적인 데이터를 검색 조건으로 사용할 때
  • 데이터-명령 혼합: 명령어와 데이터를 결합하여 쿼리나 명령어를 생성하는 경우

주요 Injection 유형

  • SQL Injection: SQL 쿼리를 조작해 데이터베이스에 접근하거나 조작
  • NoSQL Injection: NoSQL 쿼리를 통한 비정상적 접근 시도
  • OS Command Injection: 운영체제 명령어 실행을 조작
  • LDAP Injection: LDAP 쿼리를 조작하여 디렉토리 서비스에 침투
  • ORM Injection: ORM을 통한 쿼리 조작
  • Expression Language Injection (EL), OGNL Injection: 표현 언어를 통한 인젝션 공격

예방 방법

  • 안전한 API 사용: 인터프리터를 사용하지 않거나, 파라미터화된 인터페이스를 제공하는 안전한 API 사용
  • 서버 측 입력 검증: 사용자 입력을 신뢰하지 않고 서버 측에서 엄격히 검증
  • 특수문자 이스케이핑: 인터프리터에 따라 적절한 이스케이핑 방식을 사용해 특수문자를 처리
  • LIMIT 사용: 대량의 데이터 유출을 방지하기 위해 SQL 쿼리에 LIMIT과 같은 제어문을 사용

공격 시나리오
#1 SQL Injection: 애플리케이션이 신뢰할 수 없는 데이터를 사용하여 아래와 같은 취약한 SQL 쿼리를 생성한다.

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' 파라미터 값을 다음과 같이 수정해 요청을 보낼 수 있다.

http://example.com/app/accountView?id=' UNION SELECT SLEEP(10);--

이 쿼리는 모든 accounts 테이블의 모든 레코드를 반환하도록 변형되며, 더 위험한 공격으로 데이터 수정 또는 삭제할 수 있으며, 저장된 프로시저를 실행할 수도 있다.

0개의 댓글