스

구멍난 자바스크립트 보안

· 2007-10-09 (화) 16:13:45 · 4605

 

② 로컬파일로 접근

①번의 방법은 GET방식때문에 막혔습니다 그러면 자바스크립트를 우회하면서 POST방식으로 보내는 방법은 없을까요? 물론 있습니다

웹브라우져는 "소스보기" 라는 좋은 메뉴가 있습니다 있는건 적극 활용합시다 ㅎㅎ

소스보기한 후 바탕화면에 저장하여 약간 손을 보았습니다

즉 입력값을 체크하는 자바스크립트를 무력화 시키면서, action을 수정해 주었습니다

 

C:\Documents and Settings\Administrator\바탕 화면\client.html

<script>

/* 입력한값이 13자리인지 체크 후 전송 */

function validateValue() {

    return true;
}

</script>

 

<form name=f method=post action="http://www.jakartaproject.com/html/process.jsp" onsubmit="return validateValue()">
주민번호 <input type=text name=register_no> <input type=submit name=btn value=submit>
</form>

 

 

웹화면은 다음과 같겠죠

T200602211140519907749_jpg

"submit"버튼을 클릭합니다 ^^

 

역시나 자바스크립트를 거치지 않고 process.jsp에 13자리수가 아닌 "22"값을 무난히 보냈습니다

T200602211140519918590_jpg

 

그럼 서버쪽에서는 "어이쿠 이런 헤더정보도 체크해야 겠군" 하고 다음 코드를 추가해 버릴겁니다

즉 레퍼러값이 null인 경우는 허용할수 없다는 것이죠

 

http://www.jakartaproject.com/html/process.jsp

<%@ page contentType="text/html; charset=euc-kr" %>

 

<%

if (!"POST".equals(request.getMethod())
   return;


if (request.getHeader("referer") == null)
   return;

String register_no = request.getParameter("register_no");
%>

 

헤더정보 <%=request.getHeader("referer")%><br><br>
주민번호 <%=register_no%>

그럼 위와같은 소스가 될것입니다

그럼 과연 위 소스가 안전할까요?

 

③ HEADER값 조작

그렇다면 HEADER값을 조작해 봅시다 어떻게 조작할 수 있을까요?

여러가지 프로그램들이 있지만 그중에 Achilles 라는 proxy server를 이용하여 조작해 보겠습니다

Achilles라는 proxy server는 웹브라우져와 서버간의 HTTP 세션을 중간에서 가로채어 원하는대로 수정한 후 보낼수 있도록 해주는 작으면서도 강력한 프로그램입니다

 

※ 참고

Achilles 문서를 보면 맨 첫줄에 나오는 문장입니다

"Achilles is a tool designed for testing the security of web applications"

이 프로그램은 웹어플리케이션의 보안 테스팅을 하는데 작성되었으므로 테스팅용으로만 사용합시다

 

다운로드

http://www.mavensecurity.com/achilles

 

우선 위에서 작성한 바탕화면에 저장된 C:\Documents and Settings\Administrator\바탕 화면\client.html 를 실행한 결과를 Achilles가 Intercept한 결과입니다
T200602211140520230177_jpg
여러 가지 헤더정보들이 보이며 쿠키값까지 조작할수 있습니다

하지만 위의 헤더정보에는 referer값이 없습니다 그래서 referer체크에서 null이 나와 로직에 걸립니다

그렇다면 referer정보를 추가해 줍시다

T200602221140603109108_jpg

파랑색으로 줄쳐진 부분을 에디팅하여 추가해주었습니다

Referer: http://www.jakartaproject.com/html/input.html

그런다음 "Send"버튼으로 전송합니다

T200602211140519964661_jpg

짠~

그러면 조작된 헤더정보를 알아채지 못하고 헤더의 referer값을 가져오는군요!

 

 

4. 서버쪽 로직 추가!

위에서 자바스크립트를 우회하는 몇가지 방법들을 알아보았습니다

결론은 하나입니다 즉! 서버쪽에서도 동일하게 체크해 주어야 합니다

 

<%@ page contentType="text/html; charset=euc-kr" %>

 

<%

String register_no = request.getParameter("register_no");

 

if (!"POST".equals(request.getMethod())
   return;


if (request.getHeader("referer") == null)
   return;

 

if (register_no.length() != 13)

   return;
%>

 

헤더정보 <%=request.getHeader("referer")%><br><br>
주민번호 <%=register_no%>

 

그렇다면 서버쪽에서만 체크하고 클라이언트에서는 체크할 필요가 없다고 생각할지도 모르지만,

그만큼 서버쪽으로 오는 request를 줄이면 더더욱 좋겠죠

자잘한것 하나때문에 서버쪽 부하를 줄수 없는 노릇아니겠습니까?

 

자 이러이러 하고 저러저러한 이유로 우리는 이제부터라도 클라이언트에서는 자바스크립트로,

서버쪽에서는 또 서버쪽 스크립트로 사용자가 입력한 값에대해 유효성을 검증해야 하는것을 알았습니다

로직이 복잡한 경우 가뜩이나 자바스크립트도 복잡한데 그 로직을 서버쪽에서 다시한번 만든다는게 힘들다는거 다들 압니다 하지만 안전한 웹페이지를 만들기 위해 다같이 노력해야 되지 않겠습니까?

[이 게시물은 관리자님에 의해 2011-10-31 16:57:14 JavaScript에서 이동 됨]
|
댓글을 작성하시려면 로그인이 필요합니다.

프로그램

8,188건
+
제목 글쓴이 날짜 조회
08-04-17 조회 4,318
08-03-14 조회 3,204
08-03-08 조회 3,027
08-03-06 조회 2,997
08-03-03 조회 4,287
08-02-20 조회 2,976
08-02-15 조회 3,886
08-02-11 조회 5,044
08-02-09 조회 5,764
08-02-05 조회 3,816
08-01-14 조회 6,628
08-01-11 조회 7,060
08-01-04 조회 1.1만
07-12-10 조회 4,968
07-12-10 조회 3,834
07-12-04 조회 3,373
07-11-29 조회 3,547
07-11-27 조회 3,904
07-11-23 조회 4,504
07-11-23 조회 4,235
07-11-13 조회 4,362
07-10-19 조회 4,822
07-10-17 조회 5,876
07-10-03 조회 4,963
07-10-02 조회 8,797
07-10-02 조회 4,455
07-09-09 조회 3,426
07-07-29 조회 4,310
07-07-28 조회 4,536
07-07-26 조회 4,440
07-06-19 조회 1.1만
07-06-17 조회 3,607
07-06-15 조회 4,104
07-05-31 조회 3,163
07-05-09 조회 5,317
07-05-04 조회 3,163
07-05-04 조회 3,511
07-04-28 조회 6,408
07-04-26 조회 4,654
07-04-14 조회 5,300
07-04-13 조회 3,714
07-04-12 조회 5,909
07-03-27 조회 3,849
07-03-19 조회 3,547
07-03-13 조회 4,621
07-03-07 조회 4,771
07-03-07 조회 3,283
07-02-25 조회 3,639
07-02-21 조회 4,533
07-02-18 조회 5,049
07-02-12 조회 3,395
07-02-02 조회 4,511
07-01-28 조회 6,122
07-01-27 조회 5,631
07-01-25 조회 3,995
07-01-21 조회 4,629
07-01-19 조회 6,572
07-01-19 조회 8,030
07-01-13 조회 3,489
07-01-09 조회 5,127
06-12-27 조회 3,530
06-11-24 조회 3,647
06-11-18 조회 4,166
06-10-17 조회 5,485
06-10-01 조회 4,409
06-09-26 조회 4,291
06-09-25 조회 4,609
06-09-25 조회 4,325
06-09-22 조회 4,852
06-09-22 조회 3,624
06-09-22 조회 4,454
06-09-13 조회 5,285
06-08-27 조회 4,886
06-08-26 조회 6,266
06-08-26 조회 5,570
06-08-23 조회 5,066
06-07-28 조회 7,166
06-07-24 조회 4,624
06-07-23 조회 5,408
06-07-21 조회 5,165
06-07-19 조회 3,048
06-07-19 조회 2,960
06-07-11 조회 3,618
06-07-11 조회 3,910
06-07-11 조회 4,483
06-07-11 조회 4,945
06-07-11 조회 3,569
06-07-11 조회 9,191
06-07-11 조회 4,053
06-07-11 조회 3,283
06-07-11 조회 3,331
06-07-11 조회 3,263
06-07-11 조회 3,066
06-07-07 조회 4,107
06-06-25 조회 4,456
06-06-15 조회 4,450
06-06-14 조회 4,941
06-06-11 조회 3,523
06-06-10 조회 3,904
06-06-09 조회 3,490