본문 바로가기

Hacking & Security/Web

웹 취약점 점검기준 - Broken Access Control

웹 취약점 점검기준 - 3


A4 - Broken Access Control


A4, Broken Access control과 관련된 취약점들은 다음과 같다.

유형 설명
파일 다운로드 파라미터 변조를 통해 시스템파일 및 소스코드에 접근하는 것을 의미한다.
파일 업로드 실행 가능한 파일 업로드를 통해 시스템권한을 획득하는 것을 의미한다.
URL 파라미터 조작 게시판에서 사용되는 파라미터 조작을 통해 타인의 글을 위/변조하는 것을 의미한다.
자바스크립트 우회 자바스크립트로 구성한 접근제한 메커니즘을 우회하는 것을 의미한다.
1. 파일 다운로드

파라미터를 조작(상위 디렉터리 요청)하여 시스템 관련 파일등에 접근하여 해당 파일을 다운로드하는 공격기법을 의미한다.

이를 위해서 운영체제별 상위 디렉터리를 요청하는 패턴을 알아야한다.

구분 *nix 윈도우
최상위 디렉터리 / 드라이버:₩
디렉터리 구분 / / 또는 ₩
상위 디렉터리 이동 ../ ../ 또는 ..₩

*nix 계열에서 운영되는 어플리케이션의 경우, ../../와 같은 문자열을 통해 시스템 파일인 /etc/passwd에 접근을 시도할 수 있다.

http://xxx.xxx.xxx/xxx.jsp?page=../../../etc/passwd

윈도우 계열에서 운영되는 어플리케이션의 경우, ..₩..₩와 같은 디렉터리 이동 문자열을 통해 윈도우에 존재하는 ₩windows₩boot.ini 파일 접근시도 또한 가능하다.

http://xxx.xxx.xxx/xxx.jsp?page=..₩..₩..₩..₩windows₩boot.ini

Boot.ini란

boot.ini 파일은 윈도우 시스템이 설치된 부트 파티션의 정보를 가지고 있는 파일이다.

리눅스에 lilo , grub의 역할을 한다.

즉, 해당 부팅 파일의 경로 또는 파일이 잘못될 경우 부팅이 불가능하다.

물론 사이트의 구조에 따라 윈도우임에도 불구하고 *nix 형태로 접근할 수 있다.

http://xxx.xxx.xxx/xxx.jsp?page=../../../../windows/boot.ini

1) Null byte Injection

C/C++ 에서 Nullbyte 문자열(%00, 0x00)문자열의 끝을 의미하기 때문에 특정 확장자를 숨기기 위한 목적으로 사용될 수 있으며, 해당 부분의 취약점은 C 루틴을 처리하거나 내부의 C API를 호출하는 함수를 사용하는 경우 발생할 수 있다.

대표적 예시로, C로 개발된 Perl의 경우, FILE()함수에 입력된 값은 마지막 처리단계에서 C Process로 전달되기 때문에 %00과 같은 널 문자 삽입 공격을 주의해야 한다.

외부로부터의 입력값에 .jpg를 붙여 처리하도록 구성되어있는 펄 루틴이 존재한다고 가정했을때,

다운로드를 원하는 파일의 확장자가 .jpg로 끝나야 정상적이다.

즉, 정상적인 URL형태는 아래와 같다.

http://xxx.xxx.xxx/bbs.pl?file=aaa.jpg

그러나 널바이트와 .jpg를 같이 삽입할 경우 상기 로직을 우회할 수 있다.

http://xxx.xxx.xxx/bbs.pl?file=../../../../../../../../../../etc/passwd%00.jpg

PHP 또한 C로 개발되었기 때문에 해당 취약점이 발생할 수 있기에 주의하여야 한다.

<?php
    $file = $_GET['file'];
    include("$file.gif");
?>

위 코드에서 php.gif를 호출하는 경우, 아래와 같이 호출하여야 한다.

http://xxx.xxx.xxx/bbs.php?file=./php.gif

그러나 널 바이트를 삽입하는 경우 문자열이 끝난줄 알고 .gif를 무시하기 때문에 아래와 같이 동일한 위치에 있는 log.txt파일을 읽을 수 있다.

http://xxx.xxx.xxx/bbs.php?file=log.txt%00.gif

대체로 웹 취약점 스캐닝 도구에서는 파일 다운로드 취약점 여부를 판단하기 위해, 디렉터리 이동패턴과 함께 특정 시스템 파일을 호출하고 해당 파일을 읽을때 Response body에 특정 키워드 boot loader가 보이면 취약점으로 판단한다.

2. 파일 업로드

게시판과 같은 업로드 기능이 존재하는 폼에서 파일에 대한 검증이 수행되지 않을 경우발생하는 취약점이다.

웹 서버에서 실행 가능한 확장자를 살펴본다.

언어 실행가능 확장자
ASP, ASPX asp, aspx, htm, html, asa ...etc
PHP phtml, php, php3, php4, php5, inc, htm, html ...etc
JSP, JAVA jsp, jspx, jsw, jsv, jspf, htm, html ...etc
Perl pl, pm, cgi, lib, htm, html ...etc
ColdFusion cfm, cfml, cfc, dbm, htm, html ...etc
1) Content-Type 값 변조

일반적으로 확장자 검사를 통해 파일업로드 공격을 통제하고 있으나, 파일 타입(Content-Type) 변조를 통해 간단한 검증 로 직 우회 시도가 가능하다.

실행파일들을 업로드하는 데이터를 프록시 도구를 통해 가로채면, Content-Type값은 실행 파일을 의미하는 application/octet-stream으로 되어있다.

해당 값을 이미지 파일의 파일 타입image/jpeg으로 변조하여 전송할 경우, 단순한 루틴을 우회할 수 있다.

URL 파라미터 조작

1) 타인 비밀글 보기

사용자는 자신이 작성한 글을 비밀글로 등록하여 작성자 및 관리자만이 볼 수 있도록 설정한 경우가 있으나, 이를 우회하는 방법 또한 존재한다.

이러한 글 들은 열람을 위해 접근 시, 비밀번호를 요구하여 타인의 글 열람을 차단한다.

가장 간단히 시도 가능한 부분은 자신이 직접 글을 쓰고 수정 페이지로 이동한 후, 페이지 이름 및 글 번호를 의미하는 index값의 변화를 추적하는 것 이다.

/bbs/qna_view.asp?seq=13

자신의 페이지 번호가 seq=13라고 가정하였을 때, 현재의 글번호를 다른 글번호 ex: seq=11로 변경하여 타인의 비밀글 접근 가능 여부를 확인해볼 수 있다.

2) 공지사항 글 변조

관리자만이 접근 가능한 공지사항 등은 일반적으로 보기기능 밖에 제공되지 않기 때문에, 주소 및 파라미터 값을 변조하여 접근을 시도해 볼 수 있다.

http://www.xxx.xxxx/bbs.do?cmd=view&no=21

페이지에서 사용되는 cmd 파라미터의 값 viewwrite로 변경하여 접근을 시도해본다.

/bbs.do?cmd=write&no=21

기능 페이지 및 파라미터 이름
보기 view
쓰기 write
수정 modify, modi, edit
삭제 del, delete
4. 자바스크립트 우회

1) 관리자 글쓰기 게시판 우회

​ 관리자만이 접근 가능한 공지사항 페이지에서 "소스보기"를 통해 수정 및 삭제 관련 정보를 획득한다.

function jsDelete() {
    if(confirm('~')) {
        document.dForm.action = "bbsDelete.do";
        document.dForm.submit();
    }
}

function jsUpdateForm() {
    document.dForm.action = "bbsUpdateForm.do";
    document.dForm.submit();
}

function displayComment(datas) {
    dwr.util.setValue("bbsCommentTemplate", datas);
}

위와 같은 코드가 존재한다고 가정하였을 때, 삭제는 bbsDelete.do, 수정은 bbsUpdateForm.do 페이지를 호출하는 것으로 판단해 볼 수 있으므로 관리자 페이지를 호출하는 페이지 정보를 변조하여 접근해본다.

2) 관리자 페이지 우회

​ 일반적으로 일반 권한의 사용자가 관리자 메뉴인 [게시판 생성/관리]를 클릭했을 때 접근 통제 관련된 창이 팝업된다.

여기서 중요한 포인트는 통제 수단을 자바스크립트로 제공하느냐를 판단해 보는 것이다.

​ 클라이언트 사이드 자바스크립트와 서버 사이드 자바스크립트를 구분하는 일반적 방법은 팝업속도로 어느 정도 판단이 가능하다. 접속 시 팝업창이 즉시 발생되는 경우는 웹 브라우저에서 이벤트를 보내는 경우이므로 클라이언트 사이드 스크립트라고 이해하고 접근해도 무방하다.

관리자임을 검증하는 메서드를 찾고 해당 검증 루틴을 모두 삭제하고, True값을 반환하도록 한다면 관리자 계정 및 암호 없이도 관리자 페이지에 접근할 수 있는 취약점이 존재한다.

3) 파일 업로드 우회

​ 일반적으로 사진 올리기 기능을 제공한다면 그림 파일 형식 (gif, jpg, png ...etc)만을 첨부하도록 하는 검증 루틴이 존재할 것 이다.

이러한 경우 또한 프록시를 통해 클라이언트에서 서버로 전달하는 해당 페이지를 가로채어, 확장자를 정의하는 부분에 whitelist에 포함되는 확장자를 입력하여 검증 로직을 우회할 수 있다.