본문 바로가기
04. 시큐어코딩

시큐어코딩(21) - Eval Injection

by 김덕환 2017. 11. 22.
반응형

1. 정의


동적으로 생성되어 수행되는 명령어 삽입 (Improper Neutralization of Directives in Dynamically Evaluated Code, Eval Injection)


신뢰할 수 없는 외부 입력이 적절한 검사과정을 거치지 않고 동적으로 수행되는 스크립트 또는 프로그램 명령어 문자열의 생성에 사용될 경우 의도했던 형태의 입력만 사용되도록 적절히 필터링해야 한다. 그렇지 않으면, 외부의 입력이 명령어로 사용되어 공격자는 원하는 임의의 작업을 수행할 수 있다. 



2. 해결방법


- 외부의 입력이 eval() 함수의 인자로 사용될 경우 외부에서 입력되는 JavaScript가 수행되지 않도록 위험문자를 제거해야 한다. 

- ESAPI for Javascript 등의 보안성 있는 API를 사용하여 외부에서 입력되는 값을 검증한 후 사용한다.



3. 예제


========================== 안전하지 않은 코드의 예 ==========================


<%@page import="org.owasp.esapi.*"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<h1>Eval 취약점 샘플</h1>

<%

String evalParam = request.getparameter("eval");

%>

<script>

eval(<%=evalParam%>);

</script>

</body>

</html>


============================================================================


위의 예제는 외부 입력(evalParam)을 eval() 함수의 인자로 사용하고 있다. 만약 외부 입력에 JavaScript로 된 코드가 있다면 이 코드가 eval()에 의해서 수행이 된다.



============================== 안전한 코드의 예 =============================


<%@page import="org.owasp.esapi.*"%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

</head>

<body>

<h1>Eval 취약점 샘플</h1>

<%

// 외부의 입력값을 받는다.

String evalParam = request.getparameter("eval");

// 입력값에 대한 유효성을 체크한다.

if ( evalParam != null ) {

evalParam = evalParam.replaceAll("<","&lt;");

evalParam = evalParam.replaceAll(">","&gt;");

evalParam = evalParam.replaceAll("&","&amp;");

evalParam = evalParam.replaceAll("(","&#40;");

evalParam = evalParam.replaceAll(")","&#41;");

evalParam = evalParam.replaceAll("\"","&quot;");

evalParam = evalParam.replaceAll("\'","&apos;");

}

%>

<script>

eval(<%=evalParam%>);

</script>

</body>

</html>


============================================================================


위의 코드와 같이 스크립트를 작성하는데 필요한 문자들(예: <, >, &, \ 등등)을 변경함으로써 외부 입력 코드의 수행을 방지할 수 있다.

반응형