Wargame.kr

Web_650

web chatting


650점짜리 문제입니다. 이번에도 SQLi 문제라고 하네요.

개발자의 관점에서 문제를 풀어보라고 합니다. 문제 확인 들어가봅시다.



BlueCHAT 프로그램이 나오네요. ID를 입력하고 join 해 봅시다.




채팅 프로그램이 나타납니다. 왼쪽 텍스트박스에 입력한 ID가 표시되고, 오른쪽 텍스트박스에 문자열을 입력하고 say를 누르면 위와 같이 채팅창에 글이 올라오는 형태입니다.

소스를 확인해보도록 하죠.



xmlhttp를 이용한 AJAX를 구현 해 놓은 채팅으로 보입니다.

say를 누르면 chatlog.php에 data파라미터로 문자열이 인코딩 되어 들어가면서 서버에 저장이 됩니다.

그리고 1초간의 인터벌을 두고 채팅 로그를 가져오네요.

가져올 때 t 값과 ni 값을 가지고 값을 불러오는데, t는 크게 관련이 없는 변수인 것 같고, ni가 중요한 변수가 됩니다.

ni는 아래에서 다시 언급하겠지만, 채팅을 할 때 해당 글이 서버에 저장된 index의 값입니다. 



blueh4g_js.js입니다. 이 소스 또한 크게 신경 쓸 부분은 아닌 것 같습니다. get_Cookie 함수에서 get_Cookie('chat_id') 등을 입력하면 채팅에 설정된 id가 나타난다는 것만 알고 있으면 될 것 같습니다.(실제 문제 풀이에는 쓰이지 않는 함수였습니다.)



위에서 확인했던 chatlog.php?t=1을 접속했을 때의 화면입니다. 13828은 마지막으로 저장했던 index+1, 즉 앞으로 저장 될 ni의 값입니다.



그렇기 때문에 chatview.php에서 ni의 값을 13827(13828-1)로 입력해주면 마지막으로 채팅했던 값이 반환되며



그 이전의 값을 입력하면 최근 채팅부터 그 index에 해당하는 값까지 모두 출력이 됩니다.



여기서 select문을 사용하는 것 같은 느낌이 들어, and와 or문을 적절히 이용하여 request를 날려보았더니, 역시나 쿼리가 먹힙니다.



그렇다면 위와 같이 if문을 이용하여 SQLi를 시도 할 수 있을 것 같습니다.



파이썬으로 테이블 명을 찾는 스크립트를 작성했습니다.

42번째 index에 우리가 찾고자 하는 테이블 명을 알아 낼 수 있었습니다.



딱 봐도 여기에 플래그가 있다고 광고하는듯한 테이블입니다.



다음으로 컬럼 값을 찾아보았습니다. 이번에는 486번째 인덱스에 우리가 찾는 컬럼이 있었습니다.



README! 이전의 SimpleBoard 문제가 생각이 나네요.



이제 flag 값을 찾아내는 스크립트를 작성해봅시다.

chat_log_secret 테이블에서 readme 칼럼 값을 빼옵니다.



그러면 Key 값을 얻어낼 수 있습니다.

'Wargame > Wargame.kr' 카테고리의 다른 글

[Wargame.kr] Forensics_650_img recovery  (0) 2016.05.24
[Wargame.kr] Misc_650_pyc decompile  (0) 2016.05.23
[Wargame.kr] Web_600_SimpleBoard  (0) 2016.05.21
[Wargame.kr] Web_600_tmitter  (0) 2016.05.20
[Wargame.kr] Web_550_type confusion  (0) 2016.05.19

+ Recent posts