처음 소스코드와 이 화면을 보았을 시, 먼저 XSS공격을 떠올릴 수 있다.
그래서 다음과 같은 코드를 시도해보았다.
<script>alert(1)</script>
해당 코드를 적은 후, Create 버튼을 눌러 넣었고, 정상대로 alert가 작동이 되는 걸 확인할 수 있다.
그러나, 해당 코드를 자세히 보았을때, 클라이언트에서 token 및 env 변수를 탈취할 수 없다는 점에서
XSS공격은 아니라는 말이 된다.
이번 문제는 코드를 잘 보고, crypto의 함수에 대한 대략적 파악이 중요하다.
id는 생성당시에 바로 만들어지기에, 0이 가장 확실하며, 이에 대한 token이 있어야 해당 포스트에 접근할 수 있는 구조이다.
그렇다면, token을 만드는 코드를 다시 중점적으로 보자.
constructor() {
this.notes = [];
this.secret = `secret-${crypto.randomUUID}`;
}
generateToken(id) {
return crypto
.createHmac('sha256', this.secret)
.update(id.toString())
.digest('hex');
}
constructor내부에서 secret변수에 secret-${crypto.randomUUID}를 저장하고 있다.
그리고 generateToken함수에서 id를 받고 이 id를 sha256으로 암호화하고 있음을 알 수 있다.