CSRF(Cross-Site Request Forgery)
- 사용자를 속여서 의도치 않은 요청에 동의하게 하는 공격
- 사용자의 의도와는 무관하게 공격자가 의도한 행위를 요청하게 하는 공격
공격자는 임의의 사용자의 권한으로 서비스 기능을 사용
Ex.1 사용자의 계정으로 금액을 송금하여 금전적인 이득 취하기
Ex.2 .비밀번호를 변경하여 계정 탈취
Ex.3 관리자 계정을 공격하여 마음대로 공지사항 작성
CSRF 공격을 하기 위해서는 공격자의 악의적인 스크립트를 사용자가 실행해야 함.
악의적인 스크립트는 서버에게 HTTP 요청을 보내는 코드이다.
즉, 사용자가 서버에서 악의적인 HTTP 요청을 보내도록 유도하는 것.
HTML 태그인 <img> 태그를 사용하거나 <form> 태그를 사용하는 방법이 있다. 이를 통해 HTTP 요청을 보내면, HTTP 헤더인 Cookie에 사용자의 인증 정보가 포함된다.
Javascript 코드를 이용하는 방법도 있다.
[새 창 띄우기] window.open('http://~');
[현재 창] location.href='http://~';
[현재 창] location.replace('http://~');
XSS와 CSRF 차이점
- 모두 클라이언트를 대상으로 하는 공격이다.
- 사용자가 악성 스크립트가 포함된 페이지에 접속하도록 유도한다
그러나..
XSS: 인증 정보인 세션 및 쿠키 탈취를 목적으로 함. 공격 사이트의 Origin에서 스크립트 실행
CSRF: 공격자가 임의 페이지에 HTTP 요청을 보내는 것을 목적으로 함. 공격자가 악성 스크립트가 포함된 페이지에 접근한 사용자의 권한으로 웹 서비스 임의 기능을 수행할 수 있음.
dreamhack CSRF -1
- /vuln에서 xss_filter 존재. frame과 script와 on 사용 불가
- /admin/notice_flag를 보니.. 전역변수인 memo_text 존재. memo_text에 FLAG를 추가로 저장하는 코드가 있다. 단 remote_addr이 127.0.0.1이고, userid가 admin일 경우에만 FLAG가 저장된다.
- admin/notice_flag 페이지에서 userid에 admin을 넣어주어도 remote_addr이 로컬호스트가 아님.
- 즉, /flag 페이지를 통해야 remote_addr이 로컬호스트가 되겠다.
- 이미지 태그 이용. <img src="/admin/notice_flag?userid=admin" />
dreamhack CSRF -2
- admin의 password가 FLAG이다.
- username=admin이면 메인 페이지에서 FLAG 출력.
- /vuln에서 xss_filter 존재. frame과 script와 on 사용 불가
- /change_password 페이지 존재. GET 방식으로 pw를 불러와서 현재 sessionid의 pw를 변경
- /flag 페이지에서 session_id = os.urandom(8).hex()를 보니 session_id는 8byte 난수의 hex값이 지정되고, 이게 admin이라는 key와 session_id 라는 value로 session_storage 딕셔너리에 저장이 된다.
- 즉, /flag 페이지에서는 sessionid가 admin의 것이 됨. 이 페이지에서 csrf 공격 진행
- <img src="/change_password?pw=1234" /> 시 admin의 pw가 1234로 변경됨.
'보안 > 웹·모바일' 카테고리의 다른 글
Non-Relational DBMS이란 (0) | 2022.07.08 |
---|---|
Blind SQL Injection (0) | 2022.07.08 |
XSS(Cross-Site Scripting) 기초 공부 (0) | 2022.07.07 |
동일 출처 정책(Same Origin Policy) (0) | 2022.07.07 |
HTTP 프로토콜의 특성 (0) | 2022.07.07 |