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

SuNiNaTaS

Web Level10(Prob_23)




써니나타스 웹 카테고리의 마지막 문제입니다.

Hard Blind SQL Injection 문제라고 합니다.

이번에는 admin이라는 단어 자체가 필터링이 되어 있습니다. 이를 우회하여 admin 계정의 패스워드를 알아내는 것이 우리의 목표가 되겠습니다.



기본으로 주어지는 계정인 guest/guest 계정을 이용하여 주물럭거리다 보니 위와 같은 형태로 문자열 필터링 우회가 가능하다는 것을 알아냈습니다.



그래서 22번 문제와 동일한 방법으로 admin 계정의 pw 길이를 먼저 알아냈습니다.



그런데 쿼리를 작성하다 보니 자꾸 No Hack. 필터링이 걸리기에 확인을 해봤더니 역시나 쿼리 길이 제한이 있었습니다.

우와 같이 30byte까지는 허용 범위이지만



30byte를 넘어가는 순간 No hack을 뱉어내고 종료시킵니다. 따라서 우리는 30byte 이내의 쿼리를 작성해야 하는 상황이 됩니다.



한참 고민하던 중 22번과 다르게 23번 문제는 or 이 필터링 되지 않았다는 것을 알고 바로 이용했습니다.

substring, substr이 필터링 되기 때문에 이를 우회하기 위해 left 함수와 right 함수를 함께 사용하여 기능을 구현했습니다.

또한 쿼리를 작성하다보니 계속 30byte를 넘겨서 고민을 계속 해본 결과 위와 같은 형태의 쿼리문이 완성되었습니다.



딱 30byte



바로 python으로 브포 코드를 작성하여 key값을 찾아냈습니다.



SuNiNaTaS web level all clear!

'Wargame > SuNiNaTaS' 카테고리의 다른 글

SuNiNaTaS System Level2(Prob_24)  (0) 2016.05.10
SuNiNaTaS System Level1(Prob_16)  (0) 2016.05.10
SuNiNaTaS Web Level9(Prob_22)  (0) 2016.05.09
SuNiNaTaS Web Level8  (0) 2016.05.09
SuNiNaTaS Web Level7  (0) 2016.05.09

+ Recent posts