2017. 3. 4.

[웹 취약점] 자바스크립트 우회


1. 개요

웹 브라우저에서 소스보기를 하면 자바스크립트는 Client Side Script 이기 때문에 관련 함수를 모두 볼 수 있지만, JSP, ASP, PHP 와 같은 스크립트는 Server Side Script 이기 때문에 내부 로직을 확인하지 못하고 프로그램의 결과만을 코드형태로 볼 수 있다.

<서버 측 스크립트 예>
<table border="0" cellpadding="3" width="600">
<tr><td class="e">System </td><td class="v"> Windows NT </td></td>

때문에 자바스크립트 값을 수정함으로써 우회하는 방법이 얼마든지 가능하다.

# 프로그램 오류로 말미암은 인증 우회
개발자가 if 조건문을 중단하는 return 문장을 사용하지 않아 발생하는 인증 우회가 발생할 수 있다.

사용자가 특정 메뉴에 접근하게 되면 즉시 팝업을 띄워 사용자에게 경고를 주게 된다. 이 때 프록시 툴로 response 값을 확인하고 아래와 같이 변조한다.

[변조 전]
<script language="JAVASCRIPT">
alert("please login")
document.location.href="../main.jsp";
</script> 

[변조 후]
<script language="JAVASCRIPT">
Return true;
</script>

위에서도 언급했지만 이러한 우회가 가능한 이유는 서버 사이트 스크립트 언어로 권한 체크를 할때, 아래와 같이 return; 문을 삽입하지 않았기 때문이다. return 문이 삽입되었으면 자바스크립트로 우회를 하려고 해도 이미 return 문으로 로직이 중단될 것이다.

 if(!login)
{
out.println("<script>");
out.println("alert(\"please login\");");
out.println("location.href=\"/main.jsp\";");
out.println("</script>");
return;
}

# 쿠키(세션)검사 우회

[변조 전] // 아래와 같이 level과 id를 자바스크립트에서 점검하는 것을 확인 할 수 있다.
 function chCookie( ) { var levelsStr = getCookie('clevels');
var idsStr = getCookie('cidss');
if ((levelStr == null && levelsStr == "") || levelsStr < 3)
{ alert('이 메뉴는 관리자만 사용할 수 있습니다.');
Window.open('/admin/index.html','_parent',"); }} 

[변조 후]
 function chkCookie( )
{
return true;
}  

사용자 측 스크립트는 프록시 툴 등으로 로직을 변조 및 우회할 수 있으므로 서버측 스크립트로 사용자 세션을 검사할 수 있도록 프로그램을 수정해야 한다.