csrf-2

FWWKCS·2024년 1월 6일
0

Dreamhack

목록 보기
10/10
post-thumbnail

진행

문제를 풀 첫 웹 화면은 다음과 같다

우선 python코드를 보자

첫 화면에서 쿠키를 통해 세션을 받아오는데, 쿠키가 존재하지 않으면 로그인하라는 문구를 내보낸다.

POST요청에서 서버에 username과 password를 제공해주면, users에 username을 키값으로 한 value값; pw와 입력했던 password를 비교해 로그인 성공 여부를 판단한다.

즉, users의 키 값이 username, value값이 password가 되면 로그인에 성공한다.

이로서 로그인에 성공하면 sessionid를 키값으로 하는 쿠키를 생성한다.

우선 접근 가능한 guest 계정으로 로그인을 해보자

sessionid 이름을 가진 쿠키가 생성되었다!


이 쿠키를 이용해 admin으로 조작을 하면 될 것 같은데, 대부분의 코드는 csrf-1문제와 동일하지만, 특별히 다른 코드가 존재한다.
(csrf-1과 중복되는 내용은 이미 이해하고 있다는 가정하에 간단하게 설명만 하고 스킵할 것이다)

웹 렌더링 되지않는 /change_password 경로의 코드이다.

여기서도 쿼리 값으로 pw에 대응하는 파라미터를 받고, sessionid의 쿠키 값을 받아온다.

session_storage에서 session_id에 대응하는 value값을 username으로 받아오는데,

그 username을 다시 users의 키값으로 하여 value값을 pw로 갱신한다.

이전에 users의 value값은 password에 대응하는 것을 알았으며, 결국 비밀번호를 변경하는 코드인 것이다.

그리고 또 주목해야할 부분으로 /flag의 코드이다

여기서 세션 난수값을 생성해 admin에 대한 세션을 생성해 session_storage에 저장한다

그렇게 만들어진 세션을 같이 check_csrf()에 넘겨주면서, 웹 드라이버가 param으로 마저 작성된 스크립트를 동작시키는 URL에 접근하면(read_url() 동작 부분이다), admin에 대한 세션을 탈취할 수 있게 된다!

admin에 대한 세션을 얻으면, /change_password코드 안의 session_storage에서 admin을 value로 하는 세션을 가져올 수 있게 되고, admin의 비밀번호가 flag였던 것을 임의로 조작해 admin에 로그인 할 수 있게 되는 것이다!

이로써 admin 연결에 성공하고 플래그를 조회할 수 있게 된다!

/vuln에서 csrf취약점이 적용되는 것을 확인할 수 있으며, /flag에서 param의 내용으로 스크립트를 작성하면 되는데 이때 frame, script, on 이라는 단어가 들어가지 않도록 스크립트를 작성하면 된다.

이번에도 img태그를 사용해 스크립트를 작성해볼 것이다.


지금까지의 정보를 토대로 다음 단서를 이용해 스크립트를 작성하면 된다.

  1. /flag에서 admin에 대한 세션을 생성해 웹 드라이버가 url에 접속하기 전에 저장해놓는다
  2. /change_password로 접속을 유도해 admin에 대한 세션을 받아와 admin인 username을 탈취할 수 있다.
  3. 해당 username을 통해 admin의 비밀번호를 /change_password URL의 쿼리 값으로 바꿀 수 있다.
  4. /change_password URL의 쿼리 key값은 pw이며, value값이 변경할 비밀번호 값이 된다.

img태그를 작성하면 다음과 같다

<img src=/change_password?pw=admin>

비밀번호를 admin으로 바꾸는 스크립트가 포함된 이미지 태그이다.

이 태그를 /flag에서 param으로 전달해준 후, username으로 admin을, password로 admin을 전달해주면, admin으로 로그인이 성공하게 된다!

profile
Memory Archive

0개의 댓글

관련 채용 정보