입력 검증의 두가지 방법 화이트리스트, 블랙리스트 비교

웹어플리케이션은 웹의 특성상 무방비상태로 노출되어 있고, 항상 해커의 공격대상이 된다. 해커의 공격을 막는 여러 방법 중 제일 기본이 되는 건 사용자의 입력을 검증하는 것이다. 서버단에서는 반드시 검사를 해야하고, 브라우져단에서도 자바스크립트등을 써서 일차검증을 하는게 사용 편이성 증대 및 서버부하를 줄일 수 있다.

사용자 입력검증을 하는 방법에는 어떤게 있고, 어떤 방법을 써야 바람직한가에 대한 내용이 “웹애플리케이션 해킹대작전“이란 책에 자세히 소개되어 있어서 인용한다.

입력검증을 위한 방법은 두 가지가 있다. 즉 화이트리스트(white-list)와 블랙리스트(black-list)를 이용하는 방법이다. 화이트리스트는 허용 가능한 입력 값에 대한 리스트이고, 블랙리스트는 허용되지 않는 입력 값에 대한 리스트이다. 그런데 어떤 것을 이용하는 것이 더 나은가? 허용가능 리스트를 만들 것인가, 아니면 허용해선 안 되는 라스트를 만들 것인가?

보안에 대해서 잘 아는 많은 프로그래머들은 블랙리스트가 정답이라고 생각한다. 하지만 결국에는 그것이 틀렸다는 것을 알게 된다. 그런데 왜 그렇게 생각하는 것을 막을 수 없는 것일까? 사실, 어떤 특정한 공격에 포함되어 있는 특정문자(예를 들면, ‘<>–;)나 문자열 일부분(예를 들면 스크립트 태그, SQL문장)을 입력 값에서 필터링 하는 것이 더 쉬운 경우가 많다.

하지만 블랙 리스트를 이용하는 방법은 근본적으로 위험성을 내포하고 있다. 그 중에서도 가장 심각한 것은, 블랙리스트에 모든 것이 포함되어 있다고 확신하는 것이다. 블랙리스트에서 빠진 항목은 검증루틴을 통과하게 된다. 필터링되어야 함에도 불구하고 필터링되지 못하는 것이다. 즉 검증루틴은 악의적인 목적의 입력데이터를 검출해 내지 못할 수 있다.

모든 문자가 숫자 형태뿐만 아니라 브라우져가 받아 들일 수 있는 다른 종류의 인코딩된 형태로 표현될 수 있다고 가정해보자. 공백 문자는 공백으로 표현되거나 ‘+’ 또는 ‘%20’으로 표현될 수 있다. 따라서 개발자는 잘못된 문자뿐만 아니라 잘못된 문자가 인코딩된 문자까지도 모두 필터링해야 한다. 이것은 문자는 물론이고 문자열인 경우에도 마찬가지다.

아직까지 알려지지 않은 공격의 경우에는 어떨까? 공격자가 점점 영리해짐에 따라 블랙리스트는 계속 업데이트되어 왔고 앞으로도 계속 추가돼야 한다. 따라서 블랙리스트보다는 화이트리스트를 이용하는 편이 훨씬 낫고 수월하다. 화이트리스트는 애플리케이션에 입력되는 데이터를 다양하게 분류(문자, 숫자, 알파벳 문자, 구두점 등)해서 관리하고 각 분류별 패턴을 기반으로 검증을 수행한다. 예를 들어 미국이 우편번호는 5개 꼬는 9개의 문자로 만들어져야 하고, 이메일 주소는 @문자로 구분되고 알파벳 문자로 표기한다.

화이트리스트를 이용하면 사용자입력이 올바른지 그릇된 것인지 구분해 낼 수 있다. 그런데 여기서 한가지 의문이 생긴다. 잘못된 입력데이터는 수정해야 하는가? 답은 간단하다. “아니오.” 입력데이터를 수정하면 할수록 입력검증의 소용돌이에 점점 더 깊이 빠져들 뿐이다. 예를 들면, 문자열 “<scr<script>ipt>”에서 문제가 되는 부분(<script>태그)을 찾아서 제거했는데도 불구하고 문자열은 다시 문제가 되는 부분(<script>)을 포함하게 된다. 블랙리스트를 이용해서 검증하는 경우에는 대부분 이런 교묘한 트릭이 가능하다.

애플리케이션에 올바른 데이터가 입력되는지 검사해서 그렇지 않다면 에러를 발생시키고 동작을 멈추는 것이 가장 좋은 방법이다.

Free Web Security Scanning Tools

you do Web application security assessments, this page is for you. We’ve gathered all of the tools and techniques discussed in Hacking Exposed: Web Applications (that we use every day as consultants) and cataloged them here. This is an abbreviated recitation of Appendix B in the book, with live hyperlinks for easy access. Keep your eyes on this space as we post custom scripts and tools from the authors!

Free Web Security Scanning Tools
Nikto
N-Stalker NStealth Free Edition
Burp Suite
Paros Proxy
OWASP Webscarab


SQL Injection
SQL Power Injector by Francois Larouche
Bobcat (based on “Data Thief” by Application Security, Inc.).
Absinthe – free blind SQL injection tool
SQLInjector by David Litchfield
NGS Software database tools


Cross-Site Scripting (XSS)
RSnake’s XSS Cheat Sheet
XSS-Proxy


IE Extensions for HTTP Analysis
TamperIE
IEWatch
IE Headers
IE Developer Toolbar
IE 5 Powertoys for WebDevs


Firefox Extensions for HTTP Analysis
LiveHTTP Headers
Tamper Data
Modify Headers


HTTP/S Proxy Tools
Paros Proxy
WebScarab
Fiddler HTTP Debugging Proxy
Burp Intruder
WatchFire PowerTools


Command-line HTTP/S Tools
cURL
Netcat
Sslproxy
Openssl
Stunnel


Sample Applications
Bayden Systems’ “sandbox” online shopping application
Foundstone Hacme Bank and Hacme Books


Web Site Crawling/Mirroring Tools
Lynx
Wget
Teleport Pro
Black Widow
Offline Explorer Pro


Profiling
HTTPrint for fingerprinting web servers
Jad, the Java Dissasembler
Google search using “+www.victim.+com”
Google search using 뱎arent directory? robots.txt


Web Platform Attacks and Countermeasures
Microsoft IIS Security Bulletins and Advisories
Apache Security Bulletins
Metasploit Framework
Microsoft URLScan
Apache ModSecurity


Commercial Web App Vulnerability Scanners
Acunetix Enterprise Web Vulnerability Scanner
Cenzic Hailstorm
Ecyware GreenBlue Inspector
Syhunt Sandcat Suite
SPI Dynamics WebInspect
Watchfire AppScan
NTObjectives NTOSpider
Compuware DevPartner SecurityChecker
WhiteHat Security


Web Authentication Attack Tools
Brutus AET2
Hydra
WebCracker
NTLM Authentication Proxy Server (APS)


XML Web Services (SOAP)
WebService Studio
WSDigger
SoapClient.com
XML eXternal Entity (XXE) Attack
XPath Injection
Blind XPath Injection” by Amit Klein


출처 : Tong – jackie92님의 ◐ Security Tools통

Nikto로 웹 해킹에 대응하자

최근 시스템의 셸이나 다른 별도의 툴을 사용하지 않고, 웹 서버나 게시판 등 서버측에서 실행되는 응용 프로그램의 취약성을 이용한 소위 ‘웹 해킹’이 자주 발견되고 있다. 이러한 웹 해킹은 셸 로깅이 아니므로 로그가 잘 남지 않고 방화벽에서도 허용되어 있고 특히 국내의 경우 게시판이나 자료실 등을 운영하면서 서버측 언어를 많이 사용하므로 이 추세는 계속적으로 증가할 것으로 보인다. 이러한 웹 해킹에 대응하기 위해 웹 서버나 웹 기반의 응용 프로그램의 취약성을 점검할 수 있는 대표적인 프로그램으로 nikto라는 프로그램을 활용해 보기로 하자.


nikto의 기능 및 특징


nikto는 웹 서버 설치시 기본적으로 설치되는 파일과 웹 서버의 종류와 버전 등을 스캔하며, 특히 방대한 DB를 이용해 취약한 CGI 파일을 스캔하는 기능이 매우 뛰어하다. 여기에서는 이러한 nikto의 기능 및 특징에 대해 알아보도록 하자.


nikto 홈페이지






<화면 6> nikto 다운로드 및 압축해제




1. nikto는 취약하다고 알려진 3100여개의 방대한 CGI 파일에 대한 정보를 갖고 있으며 625개가 넘는 서버에 대한 버전 정보를 갖고 있다. nikto는 서버에서 보안적으로 잘못 설정된 부분(misconfigurations)이나 웹 서버 설치시 기본으로 설치되는 파일이나 스크립트의 존재 유무, 안전하지 못한 파일이나 스크립트의 유무, 오래되어 취약성을 가지고 있는 프로그램의 유무 등을 검색한다.

2. 취약성 DB는 수시로 업데이트가 되며 원격지에서도 쉽게 업데이트가 가능하다.

3. 취약성 점검 결과는 html이나 txt, csv 등으로 저장할 수 있다.

4. nikto 사이트(http://www.cirt.net/code/nikto.shtml)에서 소스를 다운받을 수 있다.


nikto의 홈페이지에서 소스 파일을 다운받는다. 소스 파일을 다운받은 후 압축을 해제하면 된다.


nikto 활용하기


nikto는 기본적으로 펄로 되어 있기 때문에 사용시 별도로 컴파일 과정은 필요하지 않고 바로 사용할 수 있다. 사용 형식은 다음과 같다.


./nikto.pl [-h target] [options]


아무런 옵션 없이 nikto.pl을 실행하면 전체 옵션을 보여주는데, 많이 사용되는 몇몇 옵션에 대해 알아보자(모든 옵션은 홈페이지를 참고하기 바란다).


-Cgidirs
이 옵션을 사용하면 스캔을 진행할 cgi 디렉토리를 지정할 수 있다. 통상적으로 all로 지정하면 되고 이때 모든 cgi 디렉토리를 스캔한다. 다음은 스캔 예제다.


# ./nikto.pl –Cgidirs all -h test.nikto.com


이때 웹 서버의 access_log를 보면 <화면 7>과 같이 보이게 된다.


<화면 7> nikto 스캔시 웹 서비스 로그




-generic
스캔시 ‘Server:’ 문자열에 보이는 정보와는 관계없이 스캔을 진행하도록 한다.


-findonly
웹 서버가 사용하는 웹 포트를 스캔하기 위한 옵션이다. 이를테면 80번이 아닌 다른 포트에서 웹 서비스를 하는 포트를 찾을 경우에 사용된다.


<화면 8> findonly 옵션 사용




-Format
스캔 결과를 파일로 저장하고자 할 때 어떤 형식으로 남길지 지정한다. 기본 옵션은 txt로 저장되나 이외 htm이나 csv 등을 지정할 수 있다. 또한 이때 -output과 함께 사용해 스캔 결과로 저장될 파일명도 함께 지정해야 한다. 다음은 스캔 예제로서 htm 형식으로 저장하며 저장 결과는 result.html로 남도록 했다.


# ./nikto.pl -Format htm -output result.html -h test.nikto.com


<화면 9>는 이때의 스캔 결과 html 파일을 브라우저로 읽은 화면이다.


<화면 9> 스캔 결과 화면




-id
만약 해당 웹 서버가 HTTP Authentication으로 보호되고 있을 때 ID/PW로 인증할 필요가 있는데, 이때 사용될 수 있다. 형식은 userid:password이다.


-update
룰 등을 업데이트할 때 필요하다. 웹을 통해 자동으로 다운받아 업데이트하게 된다. 다음은 실행 예이다.


# ./nikto.pl -update


만약 점검하고자 하는 서버 또는 도메인이 여럿인 경우 점검하고자 하는 리스트를 파일로 만들어서 일괄 스캔할 수도 있다. 이를테면 다음과 같이 스캔하고자 하는 목록을 한 줄에 하나씩 list.txt에 설정한 후 실행하면 순서대로 실행하게 된다.


# ./nikto.pl -h list.txt

      10.1.1.2       10.1.1.3       10.1.1.50:443


출처 : Tong – jackie92님의 ◐ Security Tools통