사이트 : http://www.nshc.net
문서 : CSRF_Basic_by_Certlab[1].pdf (http://itka.kr/)
CSRF란?
CSRF 는 특정 사용자를 대상으로 하지 않고 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정,삭제, 등록등)를 하게하는 공격입니다.
CSRF가 성립하려면 수정, 삭제, 등록 하는 액션에서 사용자를 구분하는 파라메터 값이 존재하지 않아야합니다. 특정한 사용자를 구분하는 파라메터가 있다면 하나의 사용자 에게만 적용 되거나 인증에러로공격이 되지 않을 수 있기 때문입니다.
따라서 인증을 쿠키 만으로 관리할 때 CSRF 공격이 쉽게 성공 할 수 있습니다.
CSRF 준비하기
1. Local Proxy Tool
Proxy Tool 을 이용하여 Web 에서의 Request / Response 를 변조 할수 있습니다
2. XSS가 실행 가능한 사이트
쓰기가능한 게시판을 오픈하여 XSS가 가능한지 간단히 테스트 합니다.
<script> alert(‘xss test’) </script>
아래와 같이 정상 Alert 메시지가 표시되면 XSS가 사용가능한 사이트 입니다.
가능성을 확인하였다면 실제 공격용 소스를 만들도록 합니다.
CSRF(Cross-site request forgery) 취약점을 이용한 공격하기
1. 상품 주문 페이지로 이동합니다.
2. 상품 정보를 모두 입력후 결제하기 버튼을 입력하기전 Paros의 Trap탭에서 Trap request와 Trap Response의 체크박스에 체크합니다.
3. 결제하기를 누르면 웹서버에 전송 전에 자동으로 Paros가 그 값을 낙아채며 웹 브라우저는 일시정지같은 상태됩니다. 해당 값 내용중 요청하려뎐 URL을 포함한 경로 와 웹서버에게 보내려던 결과값(빨간 상자의내용)을 따로 저장합니다.
4. XSS 가능 개시판에 글을 작성하여 <img width=0 height=0 을 추가하여 3번에서 저장한 URL과 결과값을 조합해 글 내용에 포함후 글을 등록합니다.
주 <img width=0 height=0는 HTML 코드로 이미지 가로세로 사이즈를 0으로 하여 실제 화면에는 표시되지 않게 됩니다.
이제 해당글을 누군가 읽으면… 그 읽은 사람에게 자신의 주문 정보가 들어가게 됩니다.
게시판에 글을 등록하는 CSRF를 만들어 등록하여 1000명의 사용자가 읽었다면 문제가 심각할 듯 합니다.
CSRF 방어대책
- 모든 Form/URL 에서 요청을 할때에 임의 토근을 추가하여 요청을 할때에 이 토큰을 검증
- 중요한 페이지는 재인증을 유도
CSRF취약점 이용한 공격 방어 하기
원문 출처 : http://proglamor.tistory.com/category/Security/CSRF
CSRF 처리 관련 ASP 함수 이다.
CSRF 처리 방법은 의외로 간단하게 처리할 수 있다.
입력폼에서 특정 문자조합의 토큰을 생성하여, 세션에 저장하며, 이를 처리 페이지로 넘겨준다.
넘겨받은 토큰과 세션을 비교하여 동일할때만 로직을 수행하게 하면 된다.
## 함수
function CSRP_TokenCreate()
set_KeyTable = "A0N1B2A3C4N5D6U7E8M9F0LGOHTITJOKLMNOPQRSTUVWXYZ"
set_Token = ""
randomize
for cnt = 1 to 20
get_KeyPos = int((49 - 1 + 1) * Rnd + 1)
set_Token = set_Token & mid(set_KeyTable, get_KeyPos, 1)
next
session("CSRP_Token") = set_Token
CSRP_TokenCreate = set_Token
end function
function CSRP_TokenConfirm( get_Token )
if session("CSRP_Token") = get_Token then
CSRP_TokenConfirm = True
else
CSRP_TokenConfirm = False
end if
end function
## From.ASP
<%
get_Token = CSRP_TokenCreate()
%>
<form name="input_form" action="Proc.ASP">
<input type="hidden" name="Token" value="<%=get_Token%>">
</form>
## Proc.ASP
<%
req_Token = request("Token")
if not CSRP_TokenConfirm(req_Token) then
response.write "잘못된 접근 입니다."
response.end
end if
%>
댓글