본문 바로가기

Book

웹 개발자를 위한 웹 보안: 6장 요약 - 인젝션 공격

728x90

 

 

인젝션 공격이란, 공격자가 애플리케이션에 외부 코드를 주입해 애플리케이션을 통제하거나 민감한 정보를 읽으려고 시도하는 것을 의미한다. 웹 서버는 브라우저뿐만아니라 모든 유형의 클라이언트에서 HTTP 요청을 받아들인다. 그러나 서버 측 코드는 HTTP 요청의 클라이언트를 구별할 수 없어 스크립트나 브라우저가 HTTP 요청을 생성했는지 신뢰할 수 있는 방법이 없다. 이 때 최선의 방법은 요청을 생성한 에이전트의 User-Agent 헤더를 확인하는 것인데, 스크립트나 해킹 도구는 헤더의 내용을 스푸핑하므로 악의적인 코드를 전달해 서버가 코드를 실행하도록 유도하는 인젝션 공격이 가능해진다. 따라서 웹사이트에 코드를  작성할 때, 어떤 요청이 들어올지 예상하는 것뿐만 아니라 사이트에서 처리되고 있는 HTTP 요청에서 어떤 결과가 나올 수 있는지 고려하는 것이 중요하다.

 

SQL 인젝션 공격

기본 SQL 데이터베이스를 사용하며, 데이터 쿼리를 불안정한 방식으로 구성하고 있는 웹사이트를 대상으로 한다. SQL 인젝션 공격은 웹 서버가 데이터베이스 드라이버에 전달하는 SQL 문을 불안정하게 구성할 때 발생한다. HTTP 요청에 따라 암호 매개 변수를 사용해 SQL 문에 직접 삽입하게 되면, SQL 문의 의미를 변경하는 SQL 제어문자를 이용해 쿼리의 흐름을 바꿔 공격자가 원하는 SQL 코드를 실행하게 만들 수 있다. 인증을 무시하거나, 마음대로 데이터를 읽고, 다운로드하고, 삭제하거나 사용자에게 제공되는 페이지에 악의적인 자바스크립트를 주입할 수도 있다. 메타스플로잇과 같은 해킹 도구를 사용해 잠재적인 공격이 있는 HTTP 매개 변수를 테스트해 볼 수 있다.

 

바인딩 매개 변수를 포함하는 프리페어드 스테이트먼트 SQL 문을 이용해 공격에서 보호할 수 있다. 매개 변수를 직접 쿼리에 넣지 않고 미리 준비된 SQL 문에 안전하게 삽입되도록 처리한다. 또는 객체 관계 매핑 (ORM) 라이브러리를 사용해 SQL 문을 직접 작성하지 않고 데이터 객체에 액세스하여 보안을 강화할 수 있다.

 

추가적으로 심층 방어를 통해 공격자가 인젝션 공격을 성공했지만, 추가 단계를 수행하여 피해를 최소화하는 중복 보호 방법이 있다. 최소 권한 원칙에 따라 해당 소프트웨어 구성 요소가 수행할 수 있는 손상을 허용하는 작업으로만 제한하는 것이다. 또한 웹사이트의 오류 메시지에 민감한 정보를 포함하지 않게 하여 비블라인드 인젝션 공격에 대응하는 것도 필요하다.

 

커맨드 인젝션 공격

공격자는 기본 운영체제에 안전하지 않은 커맨드를 호출하는 웹사이트를 공격하기도 하는데, 이를 커맨드 인젝션 공격이라고 한다. 웹 애플리케이션에서 커맨드를 호출할 때, 보안 처리가 제대로 되어있지 않으면 공격자는 임의 운영체제 명령을 실행하는 HTTP 요청을 조작하고 애플리케이션을 제어하기도 하는 등 웹사이트가 의도하지 않은 다른 명령을 실행하게 만든다.

 

HTTP 요청에서 입력을 이스케이프 한다면 커맨드 주입을 방지할 수 있다. 민감한 제어 문자를 안전한 대체 문자로 대체하는 것이다. 또한 최소 권한 원칙을 따르게 하여 성공적인 커맨드 인젝션 공격의 영향을 제한할 수도 있다.

 

원격 코드 실행

데이터베이스에서 웹 코드를 호출할 때 악의적인 커맨드를 입력하는 것 외에, 공격자가 웹 서버 자체의 언어로 실행할 악성 코드를 주입하는 원격 코드 실행도 있다. 이는 웹 서버의 취약점을 발견한 다음 해당 웹 서버에서 실행중인 대상 웹사이트에 대한 공격 스크립트를 생성하는 것이다. 익스플로잇 스크립트는 HTTP 요청 본문에 악의적인 코드를 포함시켜, 서버가 요청을 처리할 때 코드를 읽고 실행하도록 인코딩한다. 2013년 초, 보안 연구자들은 웹 애플리케이션에서 데이터를 주고 받는 데 사용되는 YAML 개체로 XML 요청을 생성하면 구문 분석 프로세스를 속여 악의적인 코드를 실행할 가능성이 있다는 것을 발견했다.

 

원격 코드 실행은 일반적으로 웹 서버 소프트웨어가 YMAL 파서와 같은 직렬화 라이브러리를 사용하는 등 안전하지 않은 직렬화를 사용할 때 발생되기 때문에, 역직렬화 시 코드 실행 기능을 비활성화하여 모든 직렬화 라이브러리를 해제해야 한다. 이를 통해 공격자가 웹 서버 프로세스에 직접 코드를 주입하는 방법을 찾을 수 없게 된다.

 

파일 업로드 취약점

사용자는 다양한 목적으로 웹사이트에 파일을 업로드 하는데, 공격자가 파일에 악의적인 코드를 주입하는 경우, 파일 업로드 기능을 쉽게 남용할 수 있다. 공격자는 HTTP 요청에서 인수를 가져와 명령어를 원격으로 실행하는 웹 셸을 작성한 후, 웹 서버에 업로드한다. 이 웹 셸 파일이 서버의 디스크에 저장되고, 실행 권한이 부여되면 공격자는 웹 브라우저에서 해당 URL을 호출해 업로드 된 웹 셸 파일을 실행한다. 이 때, 명령어를 서버에서 실행하거나 서버의 데이터를 읽고 삭제하거나 변경하는 등 악의적인 행동을 할 수 있게 된다.

 

파일 업로드 기능을 보호하기 위해선 웹 서버가 업로드된 파일을 실행할 수 있는 개체가 아닌 비활성 상태로 취급하도록 하는 것이다. CDN에서 업로드한 파일은 호스팅하면 파일을 서드 파티에 안전하게 저장하여 위험을 분산시킬 수 있다. 만약 CDN이나 콘텐츠 관리 시스템을 사용하지 않는다면 실행할 수 있는 권한 없이 모든 파일이 디스크에 기록되도록 하고, 업로드된 파일을 특정 디렉터리 또는 파티션으로 분리하여 최소한의 필수 소프트웨어만 설치되도록 서버를 강화한다. 파일이 업로드될 때 서버에서 파일 이름을 자동으로 변경하여 공격자가 파일 이름을 악용하지 못하게 하는 것도 다른 방법이다. 마지막으로, 코드에 일부 파일 형식 검사를 할 수 있도록 추가하는 것이 좋다. 서버 측 코드에 업로드 파일의 내용을 확인하는 기능을 구현하여 파일 형식을 검증할 수 있도록 한다.