[캡쳐 1] https://owasp.org/Top10/A03_2021-Injection/

인젝션(Injection)이란 정상적이지 않은 혹은 조작된 입력값을 삽입하여 인터프리터나 SQL 해석 등에서 처리되도록 하여 정보를 탈취하거나 임의의 명령을 실행하려는 시도를 말한다. 웹 어플리케이션과 관련된 취약점 유형 중 가장 많이 공격에 이용되는 유형이다.

OWASP TOP 10 2017에서는 A01으로 소개되었으며, 2021에서는 Cross-Site Scripting(XSS)이 포함되어 A03으로 소개되었다. XSS가 포함됨으로써, OWASP TOP 10 2021에서는 입력값 조작을 통한 공격이 Injection으로 통일되었다.

대응책으로는, 시큐어 코딩을 통해 사용자 입력값을 적절히 필터링하거나 검증하는 절차를 거쳐야한다. 혹은, 사용자가 허용된 입력값만을 사용할 수 있도록 화이트리스트 기반 서버측 검증을 수행한다. 알려진 취약점 등의 시그니처를 보안 솔루션에 등록하여 공격 시도를 탐지하고, 차단하여야 한다. 또한, DB나 Web 로그를 통해 관련된 공격 시도의 유무를 확인할 수 있다.

취약점 유형

SQL Injection, NoSQL Injection
OS command
Object Relational Mapping (ORM) Injection
LDAP Injection
Expression Language (EL) Injection
Object Graph Navigation Library (OGNL) injection


공격 시나리오

[캡쳐 2] SQL Injection에 취약한 소스코드

[캡쳐 2]는 SQL Injection에 취약한 소스코드이며, 사용자가 입력한 id 값을 적절한 검증 없이 user_id 값으로 설정한 후 SQL 쿼리문 완성 및 execute() 함수를 통해 실행시키는 것을 볼 수 있다.

[캡쳐 3] SQL Injection

[캡쳐 3] 처럼 값을 준 후 Submit을 클릭할 경우, [캡쳐 2]에 의해 query 변수는 하기와 같이 완성된다. 피연사자 중 하나라도 참인 경우 결과값으로 참을 반환하는 or 연산의 특징으로 인해, user_id=''이 거짓이라도 '1'='1'이 참이므로 해당 쿼리문은 정상적으로 수행된다.

SELECT first_name, last_name FROM users WHERE user_id = '' or '1'='1';

 

[캡쳐 4] 쿼리 수행 결과

[캡쳐 4]를 통해 공격자는 ' or '1'='1 이라는 조작된 값을 입력하였지만, 정상적으로 쿼리가 수행된 것을 알 수 있다. 또한, 공격자는 users 테이블의 first_name, last_name 칼럼 정보를 확인할 수 있다.

대응방안

사용자 입력 값 검증 (시큐어 코딩, 화이트리스트 기반 서버측 검증)
특수문자 이스케이프 (사용자 입력값이 SQL 쿼리문이나 명령의 일부로 인식되지 않도록)
알려진 Injection 취약점 또는 공격에 사용되는 명령어 등의 시그니처 보안 솔루션 등록 후 탐지 및 차단

+ Recent posts