오늘날의 웹 애플리케이션은많은 기술들이 의존하면서 합성되어 점점 복잡하게 구성됩니다. 그러다 보니 당연히 취약점이 증가하게 되고 크래킹을 통해 중요한 정보가 노출이 되거나 임의로 위/변조되어 심각한 보안 사고가 발생하게 됩니다.
그래서 개발 시 이러한 크래킹에 대한 방어 기술은 필수인데 이것을 제대로 학습할 수 있는 콘텐츠가 없습니다.
즉, 취약점의 종류, 공격 과정, 효과적인방어 대책에 대해서 실제 모의 해킹 실습을 통해 해법을 알려 주는 서적은 매우 부족합니다.
다행스럽게도 이 책의 많은 보안 전문가들이 초급 독자의 시선에서 웹 애플리케이션의 취약점을 이해시키고, 가상의 모의 해킹 환경을 통해 시큐어 코딩의 방향까지 친절하게 알려 줍니다.
참고로, 이 책에서 제시한 취약점 예시 중에 정말 저런 식으로 개발하는 개발자가 있을까 하고 의구심이 생길 수 있는데 사실 정말 많습니다. 그래서 이번 기회에 독자들 스스로 자신의 코딩 스타일을 점검해 보는 계기가 되었으면 좋겠습니다.
1. 누가 이 책을 읽어야 할까?
이 책은 다음과 같은 사람들에게유용합니다.
(1) 시큐어 코딩에 관심이 많은 개발자
(2) 소프트웨어 품질관리 종사자
(3) OWASP Top 10 취약점에 대한 해법을 찾는개발자
(4) PHP초보 개발자
(5) 공공기관 프로젝트를 진행하는 기획자, 개발자, 프로젝트 매니저
2. 지갑을 열게 하는 이 책만의 장점
(1) 모의 해킹을 통한 실습 위주의 가이드 북
(2) 공격의 난이도에 따라 취약점을 분석하고 방어 방안을제시합니다.
(3) OWASP Top 10취약점을 상세히 다루고 있습니다.
(4) 초보자도 이해하기 쉽게 많은 이미지를 활용하여 설명하고있습니다.
3. 핵심내용 요약
아래 설명하는 내용은 독자가 bWAPP(웹 취약점을 공격할 수 있는 오픈소스 웹 애플리케이션)을 이용하여 결과를 즉시 확인할 수 있으므로 크게 어려운 부분은 없습니다.
bWAPP을 이용하기 위해서는 bee-box라는 가상환경을 구축해야 합니다. 책에서 지시하는 대로 VirtualBox와 bee-box를 설치하면 됩니다.
참고로, 예제나 대응 방안이 PHP를 기반으로 설명하고 있으나 기초적인 함수 등이 사용됨으로 이해하는데 큰 무리가 없다고 판단됩니다. (참고로 DB는 MySQL을 기준으로 설명)
아래 중요 섹션 별로 간략하게 요약을 했으니 혹시 독자 여러분이 필요한 내용이있는지 살펴 보시길 바랍니다.
<인젝션>
개발자라면 대부분 인지하고 있는 인젝션 공격은 너무나 잘 알려진 웹 취약점 공격입니다. 공격 타입에 따라 SQL 인젝션, HTML 인젝션, OScommand 인젝션, LDAP 인젝션 등에 대해서 설명합니다.
첫 번째로 공격자가 웹 브라우저의 URL 주소나 웹 폼에 입력한 HTML 태그를 그대로 해석하여 출력하는HTML 인젝션 취약점에 대해 설명합니다.
두 번째로 iframe, OS 커멘드, PHP코드, SSI 인젝션 공격에 대해 설명합니다.
iframe인젝션 공격은 HTML 페이지안에 iframe 태그를 삽입하면서 악성 URL로 연결하고 이를 숨기기 위해 iframe 사이즈를 0으로 설정하는 방법입니다.
OS 커맨드 인젝션 공격은 사용자가 입력한 변수에 서버 운영체계의 명령어를 주입하여 실행하는 방법입니다.
PHP코드 인젝션 공격은 말 그대로 PHP 언어에서 서버 OS의 명령을 실행하는 함수에 대한 취약점입니다. 실제로 제가 수행한 프로젝트에서도 system(), shell_exec(),exec() 같은 함수는 보안상 사용을 못하도록 막는 경우가 많았습니다.
세 번째로 너무나 유명한 공격패턴인 SQL 인젝션입니다. 우선 사용자 입력 변수에 특수문자를 사용하여 임의로 웹 애플리케이션에 오류를 발생하여 서버 정보와 DB 정보를 알아내는 방법을 설명합니다. 또한 SQL의 특징을 이용하여 원하는 정보를 알아내는 기법에 대해서도 안내합니다.
<인증 및 세션 관리 취약점>
웹 사이트의 인증 과정에서 발생할 수 있는 취약점에 대해서 설명합니다. 사실 여기서 설명하는 몇몇 예제들은 인증 정보를 그대로 노출하는 취약점을 가지고 있어 실제 개발에서는 발견되지 않는 취약점입니다.
비밀번호 무차별 대입 공격은흔한 공격법인데 요즘은 이에 대한 방어로 캡차(CAPTCHA)를 이용하여 사람이 아닌 프로그램에 의한 로그인 시도를 차단합니다.
다음은 관리자 페이지 접근에 대한 세션 처리를 제대로 하지 않아 많은 취약점이 노출되어 관리자 페이지에 접근이 허용하는 경우입니다. 실제로 관리자 페이지에 인증을 거치지 않고 접근하는 공격 방법에 대해 알려줍니다.
<크로스 사이트 스크립팅>
저장된 크로스 사이트 스크립팅(XSS) 취약점은 아마 개발자가 가장 많이 접하게 되는 취약점일 것입니다. 악성코드 배포에 주로 이용되는 공격 방법인데 웹사이트를 공격하여 DB에 악성코드를 저장하고 게시판 등의 경로에 일반 사용자가 게시물을 클릭하면 악성 코드가 실행되도록 유도합니다.
이러한 공격의 대상이 되는변수를 htmlspecialchars()나 mysqli_real_escape_string()같은 함수를 사용하여 조치하는 방법을 소개하고 있습니다.
<취약한 직접 객체 참조>
이 장에서는 중요정보를 다룰때 개발자의 개발의 편의를 위해 노출한 정보로 인해 보안상의 문제가 생기는 예를 설명하고 있습니다.
예를 들어 비밀번호를 변경할때는 현재 사용자를 인식하는 아이디 뿐만 아니라 토큰(Token)을 사용하여 현재 사용자의 아이디의변조에 대비해야 한다고 해결책을 제시합니다.
또 다른 예로, 쇼핑몰의 주문 상품의 가격이 폼의 hidden 값에 저장된 경우이를 조작하여 그대로 주문에 반영하는 경우를 설명합니다. 이러한 중요한 정보는 사용자에게 노출되어서는 안되고 백엔드 프로그램에서 반드시 처리를 해야 합니다.
<보안 설정 오류>
보안 설정 중에 처음으로 다루는내용은 robots.txt 파일입니다. 알다시피 이 파일은검색엔진의 페이지에 대한 접근 권한을 설정 하는 파일로 개인정보나 중요정보의 노출과 관련이 많습니다. 사이트의 성격에 따른 robots.txt 파일을 적절히 설정하는 방법에 대해 다룹니다.
또한 원격으로 웹 서버를 제어할수 있는 HTTP 프로토콜의 확장 기능인 WebDAV의 보안설정 오류에 대해서도 설명합니다.
<민감 데이터 노출>
민감한 데이터의 저장 방법으로 쓰이는 여러 가지 기술의 취약점을 살펴보고 개선방안을 제시해 줍니다.
우선 중요 데이터를 Base64인코딩하는 경우인데 이럴 경우 중요 데이터는 다시 원문으로 디코딩이 가능합니다. 그래서 중요 데이터는 절대 디코딩이 가능한 Base64로 인코딩하면 안되고 보안에 강력한 다른 해시함수를 사용해야 한다고 조언합니다.
두 번째 SSL 보안 프로토콜의 사용하자는 내용입니다. 세 번째 내용이 요즘많이 사용하는 HTML5의 웹 저장소(Web Storage)의취약점에 대한 설명입니다.
<기능 수준의 접근 통제 누락>
접근 통제는 보안의 기본 중에기본이라고 생각합니다. 서버의 디렉터리 구조를 한번에 노출이 된다면 중요한 파일이 그대로 노출이 되어다운로드가 가능하게 됩니다. 이를 방지하기 위해 서버의 옵션을 수정하여 경로 탐색 취약점을 조치해야합니다.
첫 번째 설명하는 취약점은 디렉터리 접근 취약점입니다. 크래커가 웹 상에서 원하는 디렉터리로 접근하는 방법을 설명합니다.
두 번째로 악의적인 코드가 입력된 파일을 사용자가 서버에서 열람하는 파일삽입 공격을 설명합니다.