안녕하세요? 허니입니다. 불안전한 직접 객체 참조 취약점에 대해서 알아보고 대응 방법에 대해 알아보도록 하겠습니다. 사이버 해킹에 대해 공부하시는 학생이나 연구원 분이 계시면 도움이 될 것이라 생각합니다.


일반적으로 웹 애플리케이션은 HTTP 요청(또는 파일) 값을 통해 다음 동작을 결정하게 되는데 공격자는 URL, 쿼리 문자열, HTTP 헤더, 쿠키, HTML 폼 인자, HTML hidden 필드 등 모든 HTTP 요청을 조작할 수 있으며, 이를 통해 사이트의 보안 메커니즘을 우회하고자 시도할 수 있습니다. 흔히 발생하는 입력 값 변조 공격은 URL 강제 접속, 명령어 삽입, 크로스 사이트 스크립팅, 버퍼오버플로우, 포맷스트링 공격, SQL 구문 삽입, 쿠키 조작, hidden필드 조작 등으로 사용됩니다.

 

 일반적인 대응방법
파라미터 변조를 방지할 수 있는 가장 좋은 방법은 모든 파라미터에 대해 사용 전에 입력 값 검증을 수행하는 것이다. 모든 입력 값에 대해 중앙에서 집중적으로 처리하는 하나의 컴포넌트나 라이브러리를 사용하는 것이 가장 효과적입니다. 입력되는 모든 파라미터는 허용된 입력 값의 유형과 정확히 일치하는지에 대해 점검하여야 합니다. 특정한 악의적 파라미터나 공격 패턴(signature)만을 필터링 처리하는 방식은 효율적이지도 않고, 향후의 유지보수 작업을 어렵게 만듭니다. 다음과 같이 스팩 상에 허용된 값만을 받아들이는 "허용(Positive) 방식"을 사용하여 파라미터를 검증하여야 합니다.

 

 데이터 유형 (문자열, 정수형, 실수형 등)

 허용된 문자셋 (character set)

 최대 / 최소 길이

 Null 값의 허용 여부

 반드시 필요한 파라미터와 그렇지 않은 파라미터

 중복 허용 여부

 숫자의 범위

 타당한 것으로 지정된 값 (열거형 - enumeration 사용)

 타당한 것으로 지정된 패턴 (정규식 사용)

 

웹 애플리케이션 방화벽과 같은 새로운 종류의 보안 장비는 어느 정도 입력 값 검증 기능을 제공할 수 있습니다. 그러나 이런 장비를 효율적으로 사용하기 위해서는 사이트에서 사용되는 모든 파라미터들에 대해 어떤 값이 타당한 것인지 엄격하게 정의해 놓아야 합니다. 이는 곧 URL, 폼 데이터, 쿠키, 쿼리 문자열, HTML hidden 필드 등 모든 유형의 입력 값에 대해 적절히 보안하는 것을 뜻합니다.

 

 개발 언어별 대응방법
- 보안코딩(ASP)

<%
Size = Request.QueryString("font_size")' 사용자로부터 폰트의 크기 입력
Size = CInt(Size)' 입력되는 값을 정수로 형 변환
Response.Write "<HTML><TITLE>사용자 입력 값 검증</TITLE></HEAD>"
Response.Write "<BODY>"
Response.Write "<FONT size=" & Size ">글자 크기 조절</FONT>"

 

' ... 중략 ...

 

 

- 보안코딩(PHP)

<?PHP
@require_once "./inc/dbconn.inc";// DB 연결 헤더
$default_lang = "korea";// 기본값 설정

 

if(!file_exists($language."/head.html")) // 파일이 존재하는지 체크
if(eregi(":\/\/", $language)) $language = $default_lang;// URL이 포함되는지 체크
else // 파일이 없는 경우 기본값 설정
$language = $default_lang;

 

@require_once $language . "/head.html";// 각 국가 언어별 HTML 출력

$conn = @mysql_connect($SERVER, $USER, $PASSWD);


$query = "select count(*) from main_tbl";

 

// ... 중략 ...

 


- 보안코딩(JSP)

<%@ page contentType="text/html;charset=euc-kr" %>
<%@ page import="java.util.* " %>
<HTML><HEAD><TITLE> 사이트 접속 불가 </TITLE>
<META HTTP-EQUIV="Refresh" CONTENT="10;URL=http://victim.com/bye.html">
</HEAD>
<BODY>
<%
String user_agent = request.getHeader("USER-AGENT");

 

// HTTP HEADER 중 USER_AGENT를 변경 하여 크로스사이트 스크립트 공격하는 것을 차단
user_agent = user_agent.replaceAll("<","&lt;");// HTML tag가 있을 경우 제거
user_agent = user_agent.replaceAll(">","&gt;");

 

out.print("지금 사용하고 계신 ");
out.print(user_agent);
out.print(" 브라우져로는 사이트 접속이 불가능 합니다.");

 

%>
</BODY>
</HTML>

 

 

+ Recent posts