WriteUp

wechall.net logical bug

wechall.net은 많은 워게임들을 연동시켜서 점수를 추합해 순위를 매겨주는 사이트이다.

연동을 위해서는 wechall.net 서버에서 각 워게임의 유저의 점수를 알 수 있어야 한다.

그때문에 연동할 워게임에서는 userscore.php 라는 파일을 만들고, wechall.net 서버에서 오는 요청에 응답하는 코드를 넣는다.

예를들자면 webhacking.kr 이라는 워게임의 rubiya / rubiya805@gmail.com 계정을 wechall.net에 등록하려 할 경우에 아래와 같은 순서를 거친다.

1. 내가 wechall.net에 webhacking.kr / rubiya / rubiya805@gmail.com 라는 정보를 request 하면
2. wechall.net의 서버에서 http://webhacking.kr/userscore.php 에게 rubiya / rubiya805@gmail.com 이라는 회원이 있는지 알려달라고 요청하고
3. webhacking.kr의 서버는 해당 정보를 찾아서 존재하면 그 회원의 점수를 응답한다.

내가 지금까지 본 모든 워게임은 회원정보를 관리하기 위해서 mysql, mssql등의 dbms를 사용했는데, 이 dbms들은 대소문자를 구분하지 않는다.

예를들어, mysql을 사용하는 webhacking.kr 에서 rubiya 와 RUBIYA는 같은 회원이다.

그러나 wechall.net 에서는 대소문자에 관한 이슈를 제대로 처리하지 못했고, 저 두개를 다른 회원으로 구분했다.

wechall.net 은 한 계정당 한 사용자만 연동이 가능하도록 되어있는데 위의 이유로 해당 로직을 우회할 수 있다.

모 워게임을 이 취약점을 사용해서 올클리어로 만들 수 있었다.

과정은 아래와 같다.

1. A워게임의 올클리어 계정들의 패스워드를 게싱해서 “abc”라는 계정을 얻었다.
2. 그러나 내가 찾아낸 계정은 이미 wechall.net에서 다른 사용자가 연동한 계정이다.
3. 대문자를 사용해서 “ABC” 계정의 연동을 시도했다.
4. wechall.net 에서는 A워게임의 서버에 “ABC” 라는 계정이 있는지 알려달라고 요청했다.
5. A워게임 에서는 “ABC” = “abc” 이므로 그런 계정이 존재하며, 그 계정은 A워게임의 모든 문제를 풀었다고 응답했다.
6. wechall.net 에서는 “ABC”라는 계정이 연동된적이 없으므로 정상적으로 연동이 되었다.

이 경우에 wechall.net 에서는 워게임의 userscore.php 파일이 대소문자를 구분하도록 해달라고 명시하거나,
wechall.net 의 코드가 계정의 대소문자를 구분하지 않도록 수정해서 대소문자에 대한 정책을 통일해야한다.

연동된 사이트의 서로 다른 정책탓에 발생하는 로직상의 취약점이다.

Also ensure that you do case-sensitive checks to avoid potential exploitation.

확인해보니 join us 메뉴에 요 줄이 추가되었다.

Leave a Reply

Your email address will not be published. Required fields are marked *