'전체 글'에 해당되는 글 1000건

wargame.kr img recovery

2018. 1. 4. 17:00

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.


wargame.kr 16번 pyc decompile 풀이

점수는 650 point.!

pyc형식에 파일을 디컴파일 하라는 것 같다. 시작해보자.

파일을 먼저 다운로드 받자.


먼저 pyc라는 형식은 처음봤는데 찾아보니 파이썬 소스코드르 숨기고 import 시 속도 향상을 시켜줄 수 있는 파이썬 파일 인 것 같다.

그럼 이제 디컴파일 해주는 프로그램을 통해 소스를 확인하자.


흠.. 생각보다 간단한데? 현재 시간을 가지고 구한 값을 플래그 값으로 서버로 넘기면 될 것 같다.

GIVE_ME_FLAG()가 호출되면 ok값을 리턴하도록 수정하고 쿼리를 줘봤다.


...? 왜...? 

시도해보니 실패했다고 알려준다. ..? 문제가 없는데.. 뭔가하다 자세히 보니 로컬시간이랑 서버에서의

시간이 11분 정도 차이가 났다. 코드를 수정해 봤다.


다시 한번 시도해 봤다.


성공! 이전 문제에서 애썻던거에 비하면 너무쉽게 해결한 문제였다. 뭔가 허무...?

어쨌든 다음으로 넘어가 보자.


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

wargame.kr crack crack crack it!  (0) 2018.01.04
wargame.kr img recovery  (0) 2018.01.04
wargame.kr web chatting  (0) 2018.01.04
wargame.kr SimpleBoard  (0) 2018.01.04
wargame.kr tmitter  (0) 2018.01.04
블로그 이미지

JeonYoungSin

메모 기록용 공간

,

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

메모 기록용 공간

,