공시 한 판

정보보호론 개념서 · 응용 프로그램 취약점

입력값 검증 누락 공격 유형

설명 영상 입력값 검증 누락 공격 유형 · 1:58

핵심 정리

입력값 검증 누락 공격은 프로그램이 외부에서 들어온 값을 검사하지 않고 그대로 처리할 때 성립한다. 신뢰할 수 없는 데이터가 명령어나 쿼리문의 일부로 인터프리터에 전달될 때 발생하는 취약점이 인젝션이다. 인젝션 계열 공격은 공격자가 보낸 값이 명령이나 질의의 일부로 해석되는 구조를 가진다. 그래서 입력값 검증은 개별 공격마다 따로 막는 조치가 아니라 모든 입력 경로에 공통으로 적용하는 기초 조치로 이해해야 한다. 인젝션, 파일 업로드, 경로 추적, 메모리 노출은 공격 경로가 달라도 검증이 빠졌다는 같은 출발점을 가진다.

대응 방향은 크게 두 가지이다. 인젝션은 입력값을 필터링하거나 매개변수화된 질의를 사용해 대응한다. 두 방식 모두 공격자가 보낸 값이 명령이나 질의의 일부로 해석되지 않게 막는 데 목적이 있다. 입력값에 대한 적극적인 유효성 검증은 인젝션 공격에 대한 기본 대비책이다. 필터링이 검증의 한 형태라면, 매개변수화는 질의 구조를 고정해 입력이 데이터로만 처리되게 하는 방식이다.

검증하지 않은 입력은 서버 내부의 실행으로 이어지기 쉽다. 파일 업로드 취약점을 이용하면 해킹 프로그램을 올려 웹 서버의 권한을 얻을 수 있다. 웹 셸은 업로드한 프로그램을 통해 서버에 명령을 내리는 도구이다. 이를 막는 가장 직접적인 조치는 업로드 폴더에서 파일이 실행되지 않게 하는 것이다. 업로드 폴더의 파일 실행을 금지하면 업로드된 웹 셸이 실행되지 않는다.

실행 금지와 함께 쓰는 조치는 위치 격리이다. 업로드 전용 폴더를 웹 루트와 분리하는 위치 격리는 업로드 파일의 실행과 접근을 제한한다. 이 조치는 업로드 경로를 웹에서 직접 호출할 수 없게 한다는 점에서 실행 금지와 역할이 다르다. 확장자에 대한 조치도 같은 방향이다. 업로드 가능한 확장자를 허용 목록으로 제한하는 편이 특정 확장자만 막는 것보다 안전하다.

웹 셸 업로드는 파일명 필터링만으로 막기 어렵기 때문에 확장자 검사와 실행 제한을 함께 적용해야 한다. 한 가지 조치가 뚫려도 다른 조치가 막을 수 있도록 여러 조치를 겹쳐 두는 것이 이 단원의 기본 태도이다. 각 조치는 서로를 대신할 수 없으므로 목적을 구분해 외워야 한다.

자세히

실행 함수별 주입 여부

PHP에서 명령이나 코드를 실행하는 함수는 입력이 전달되는 방식에 따라 취약점을 낳는다. system 함수는 입력값이 정제되지 않으면 운영체제 명령 주입 취약점을 낳는다. exec 함수에 사용자 입력이 직접 전달되면 쉘 명령 주입 취약점이 생긴다. eval 함수는 인자로 받은 문자열을 PHP 코드로 실행하므로 코드 인젝션 취약점을 낳는다.

세 함수는 입력을 해석하는 대상이 다르다. system과 exec는 입력을 운영체제의 쉘 명령으로 넘기고, eval은 PHP 해석기에 코드를 넘긴다. 따라서 eval에 들어간 입력은 웹 언어의 동작을 바꾸고, system과 exec에 들어간 입력은 서버 운영체제의 명령을 바꾼다. 세 함수를 따로 외우기보다 입력이 실행 인자로 흘러가는 경로를 찾는 것이 핵심이다. 정제가 빠지면 함수 종류가 달라도 취약점으로 이어진다. 시험에서는 함수 이름만 보고 취약 여부를 단정하지 말고 입력이 정제되었는지도 함께 확인해야 한다.

함수 이름이 명령과 관련돼 보여도 판단 기준은 PHP 내장 함수인지 여부이다. cmd는 PHP 내장 함수가 아니므로 인젝션 취약점 함수에 해당하지 않는다.

함수입력이 넘어가는 대상주입 취약점
system운영체제 명령운영체제 명령 주입
exec쉘 명령쉘 명령 주입
evalPHP 코드코드 인젝션
cmd내장 함수가 아님인젝션 함수 아님

이어지는 내용

로그인하면 하루 5페이지까지 무료로 전체를 읽을 수 있습니다.

앱에서 이 절 읽기