White_Bean 2023. 9. 19. 02:05

CSRF (Cross Site Request Forgery)

  • 임의 이용자의 권한으로 임의 주소에 HTTP 요청을 보낼 수 있는 취약점
  • 공격자는 임의 이용자의 권한으로 서비스 기능을 사용해 이득을 취할 수 있음

 

@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 "success"
	else:
		return "fail"

이 코드는 CSRF 취약점이 존재하는 코드

코드에서 예금주와 금액을 입력받고 바로 송금을 수행하는 코드로 비밀번호, OTP 등을 사용하지 않기 때문에
추가 인증 없이 해당 기능을 이용할 수 있는 취약점이 있다.

 

 

CSRF 동작

  • CSRF 공격에 성공하기 위해서는 공격자가 작성한 악성 스크립트를 이용자가 실행해야 함
  • CSRF 공격 스크립트는 HTML 또는 Javascript를 통해 작성할 수 있음
  • img태그나 form태그를 사용하는 방법이 있으며 이 두 개의 태그를 사용해 HTTP 요청을 보내면 HTTP 헤더인 Cookie에 이용자의 인증 정보가 포함됨

 

XSS와 CSRF의 차이

XSS와 CSRF의 차이를 아는 것은 매우 중요함

  • 공통점 : 두 개의 취약점은 모두 클라이언트를 대상으로 하는 공격이며, 이용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도함
  • 차이점 : 두 개의 취약점은 공격에 있어 서로 다른 목적을 가짐
    • XSS는 인증 정보인 세션 및 쿠키 탈취를 목적으로 하는 공격이며 공격할 사이트의 오리진에서 스크립트를 실행
    • CSRF는 이용자가 임의 페이지에 HTTP요청을 보내는 것을 목적으로 하는 공격이며 공격자는 악성 스크립트가 포함된 페이지에 접근한 이용자의 권한으로 웹 서비스의 임의 기능을 실행할 수 있음

 

https://dreamhack.io/lecture/courses/172