2016년 11월 12일 토요일

애플리케이션 지도 작성 [애플리케이션 분석]

2.애플리케이션 분석

애플리케이션의 기능, 행동 양식, 적용된 기술 또한 애플리케이션의 중요한 요소이다. 이와 같은 요소에 대해 잘 알고 있다면 가능한 공격 지점을 확인하고 취약점을 찾는데 좀 더 수월할 것이다.


2.1 사용자 입력이 가능한 곳 확인

 서버 측에서 처리하기 위한 사용자의 입력을 받아들이는 방법들은 HTTP 요청값들을 검토하면 대부분 알수 있다. HTTP 요청값 들에 사용자 입력 값이 들어가기 때문이다.
그 중에 주의를 기울일 만할 곳들은 다음과 같다.
  • 쿼리문 마커까지의 URL 문자열 = www.naver.com/search?... (여기서 '?' 가 쿼리문 마커임)
  • URL  쿼리문 내에 포함돼 전달되는 매개변수
  • POST 요청의 본문 내에 포함돼 전달되는 매개변수
  • 쿠키
  • 드문 경우 

URL 파일 경로

쿼리 문자열보다 앞에 있는 URL은 서버 파일 시스템의 Directory나 파일명인 경우가 많기 때문에 종종 엔트리 포인트로 간주된다. 하지만 REST 스타일 URL을 사용하는 경우 쿼리 문자열 보다 앞에 있는 URL은 데이터의 매개변수의 기능또는 Query 문자열 만큼 중요해진다.

REST 스타일 URL 에 대해 예를 들어 설명하겠다.

http://bank/login/name/passwd

위와같은 경우 login 뒤에 오는 name 과 password는 로그인하는데 id와 password를 뜻하는 매개 변수로 처리된다.
REST 스타일 URL을 사용하는 대부분 애플리케이션은 URL구조와 애플리케이션 구조로 구별하기 쉽게 돼 있다. 하지만 애플리케이션을 Mapping 할 때는 사용자가 애플리케이션 권한을 어떻게 사용하느냐에 따라 달라지게 때문에 융통성을 가지고 Mapping 해야 한다.

요청 매개변수

URL 쿼리 문자열, 메시지 바디, HTTP 쿠키에서 전송되는 매개변수는 사용자 입력이 가능한 가장 분명한 엔트리 포인트이다. 하지만 어떤 애플리케이션은 표준 name=value 형식을 사용하지 않고 그들 스스로 체계를 만들어 적용하는 경우가 있는데 이 경우에 비표준 쿼리문 마커나 필드 구분자를 사용하거나 , 쿼리문 내에 XML 같은 다른 데이터 체계를 내장시킬 수 도 있다.

비표준 쿼리문 형식(format)의 예
  • /dir/file;foo=bar&bar2=foo2
  • /dir/file?foo=bar&bar2=foo2
  • /dir/file/foo%3dbar%26bar2%3dfoo2
  • /dir/foo.bar/file
  • /dir/foo=bar/file
위와 같은 비표준 쿼리문 포맷이 사용된다면 해당 애플리케이션 대상으로 일반점인 취약점을 탐색할 때 이를 반드시 고려해야한다. 
예를 들어 위 Format을 분석해서 공격용 대입 값 등을 이런 XML 데이터 필드 내에 잘 넣어서 탐색해보면 SQL injection 이나 경로 이동과 같은 중요한 버그를 찾을 수도 있을 것이다.

HTTP 헤더

많은 애플리케이션에서 사용자 로그인 기능을 사용하며, 로그인 기능으로 RefererUser-Agent 등의 HTTP  헤더 콘텐츠에 로그인할 수 있다.

일부 애플리케이션은 Referer 헤더에 추가적인 프로세스(기능)를 하기도 한다. 예를 들어 사용자가 특정 검색 엔진을 통해 들어왔다는 것을 알수 있으며 사용자 쿼리에 맞춘 응답을 제공할 수 있다. 일부 Application은 HTML 키워드 등을 사용해 검색 랭킹을 동적으로 업데이트 하기도 한다. 이때 HTML 키워드는 최근 방문자가 검색 엔진으로 검색한 문자열을 사용한다, 이런 경우 적절하게 만들어진 Referer URL을 포함한 요청을 계속 함으로써 애플리케이션의 응답에 지속적으로 콘텐츠를 삽입할 수 있다.

각기 다른 장치(노트북,휴대폰 등)로 Application을 사용자에게 각기 다른 콘텐츠를 보여주는게 요즘 Trend인데 이런 기능을 하게 하는 것이 User-Agent 헤더이다. User-Agent  헤더를 사용하면 입력 기반 공격도 가능하며 그외의 방법으로 공격도 가능하다.
예로 휴대기기에서 User-Agent 헤더를 스푸핑하면 주요 인터페이스와는 다르게 작동하는 간편화된 인터페이스에 접근할 수 있다.

아웃오브 밴드 채널

사용자 입력을 위한 입구의 마지막 클래스에는 여러분이 제어할 수도 있는 데이터를 받아들이는 out-of-band 채널을 포함하고 있다. 이런 입구들은 HTTP 트래픽만을 조사해서는 완전히 탐지할 수 없는 것들인데 이를 찾으려면 애플리케이션에 대한 광범위한 이해가 있어야 하고 아웃오브 채널을 받아들이는 예시는 다음과 같다.

  • SMTP를 통해 받아들인 이메일 메시지를 가공하고, 보여주는 웹 메일 에플리케이션
  • HTTP를 통해 다른 서버로부터 콘텐츠를 가져다가 보여주는 기능을 가진 퍼블리싱 애플리케이션
  • 휴대폰 앱 등 브라우저를 사용하지 않는 사용자를 위해 API인터페이스를 제공하는 모든 애플리케이션
2.2 서버 측 기술 확인


배너 가져오기

많은 웹 서버들은 웹 서버 SW자체와 설치된 다른 Component들을 알수 있게 해주는 매우 세분화된 버전 정보를 보여준다.
예를 들어 HTTP server 헤더는 설치된 서버에 대해 엄청난 양의 세부 정보를 드러낸다.

Server: Apache/ 1.3.31 (Unix) mod_gzip/1.3.26.1a
PHP/4.3.9 FrontPage/5.0.2.2634a mod_ssl/ 2.8.20 OpenSSL/0.9.7a

Server 헤더에 추가로 소프트웨어 유형(PHP)과 버전 정보(4.3.9)가 나타나 있는 곳들로는 다음과 같은 것들이 있다.

  • HTML 페이지를 생성하는 데 사용된 템플릿
  • Custom HTTP Header
  • URL Query 매개변수 

파일 확장자

URL 내에 사용된 파일 확장자들은 관련된 기능들을 구현하는데 사용된 flatform이나 프로그래밍 언어에 대한 정보를 가끔 드러낸다.
  • asp - MS active server page
  • apsx - MS ASP.net
  • jsp - java server page
  • cfm - cold Fusion
  • php -PHP 언어
  • d2w - websphere
  • pl - perl language
  • py - python language
  • dll - compile된 시스템 언어
  • nsf 나 ntf  - Lotus Domino
확장자를 쓰지 않는경우에도 특정 확장자를 지원하는 기술이 해당 서버에 구현돼있는지 확인하는 것이 가능한데 예로 ASP.net 이 설치된 경우 존재하지 않는 .aspx 파일 요청에 대해 다음과 같은 사진을 보여준다.

















그러나 존재하지 않는 다른 파일 확장자의 파일에 대한 요청이라면 다음과 같은 일반적인 에러 페이지를 보여준다.




















디렉토리명 및 세션 토큰

디렉토리명을 통해서도 관련된 특정기술을 알수 있다.
  • servlet - 자바 서블릿
  • pls - 오라클 애플리케이션 서버 PL/SQL  gateway
  • cfdocs 나 cfide 콜드 퓨전
  • SilverStream - SilverStream web server
  • WebObjects 나 {function}.woa - 애플 webObjects
  • rails - Ruby on Rails
세션 토큰을 생성할 때 웹 애플리케이션에서 사용하는 기술에 대한 정보를 이름으로 이용한다.
  • JSESSIONID - 자바 플랫폼
  • ASPSESSIONID - MS IIS 서버
  • ASP.NET_SessionId - MS ASP.net
  • CFID/CETOKEN - Cold Fusion
  • PHPSESSID - PHP
2.3 클라이언트 측 기능확인


요청 값 분석 

검색 기능을 위해 URL 형식이 다음과 같을수 있다.

https://example.com/Employee.jsp?Department=A&OrderBy=Name

URL 안의 jsp라는 파일 확장자가 있는 것을 보고 java server page가 쓰이고 있음을 의미하고 뒤에 쿼리중에 OrderBy라는 매개변수는 sql 쿼리에 쓰는 문자열로 보여 데이터베이스를 쓰는 것으로 보인다.

또다른 예로 애플리케이션 관리자에게 질문을 보내는 다음과 같은 요청을 살펴보자.

POST/ feedback.php  HTTP/1.1
Host: example.com
Content-Length: 389

from=user@example-mail.com&to=help@example.com&subject=Problem+login&message=Please+help..

다른 feedback.php 에서 보이듯이  .php 파일 확장자는 해당 기능이 PHP 언어를 써서 구현됐음을 가리킨다. 그리고 help@example.com 은 외부의 이메일 시스템과 연동된것처럼 보이는데, 사용자가 제어 가능한 입력 값이 관련된 이메일의 특정 필드 값으로 전달 되는 것처럼 보인다.

애플리케이션 행동 추측

가끔 하나의 애플리케이션이 여러 기능에 걸쳐 일관된 방식으로 동작하기도 한다.
이는 여러 다른 기능들이 어떤 한 개발자에 의해 작성되었다든지 어떤 동일한 디자인 스펙에 따랐다든지,, 어떤 공통된 코드 컴포넌트를 사용했기 때문일 수도 있다.
그래서 어떤 한 부분에서 알아낸 서버 측 기능을 써서 다른 영역을 가늠할수 있다.

0 개의 댓글:

댓글 쓰기