반응형

깜찍한 슬라임 한마리가 움직이고 점수가 올라가며 rank링크로 들어가면 rank가 들어가는 화면이보인다.

실력으로 1등을 찍어보자.그냥해서는 게임방식조차 이해하기 힘들다.

소스를 보자



<html>

<head>

<title>Challenge 55</title>

</head>

<body onmousemove=move()>

<img src=monster.jpg style="position:relative;left:1;top:1;" id=monster alt='oldzombie'>

<script>

function move(){

  monster.src = Math.floor(Math.random()*2)?"monster.jpg":"monster2.jpg";

  if(parseInt(monster.style.left)<event.x) monster.style.left=parseInt(monster.style.left)+1;

  if(parseInt(monster.style.left)>event.x) monster.style.left=parseInt(monster.style.left)-1;

  if(parseInt(monster.style.left)<event.y) monster.style.top=parseInt(monster.style.top)+1;

  if(parseInt(monster.style.left)<event.y) monster.style.top=parseInt(monster.style.top)-1;

  if(parseInt(monster.style.left)<event.x && parseInt(monster.style.top)<event.y) {monster.style.left=parseInt(monster.style.left)+1;monster.style.top=parseInt(monster.style.top)+1; }

  if(parseInt(monster.style.left)>event.x && parseInt(monster.style.top)>event.y) {monster.style.left=parseInt(monster.style.left)-1;monster.style.top=parseInt(monster.style.top)-1; }

  if(parseInt(monster.style.left)==event.x && parseInt(monster.style.top)==event.y) {alert('GAME OVER'); sfrm.submit(); }

  if(event.x<=0) sfrm.score.value=0;

  if(event.y<=0) sfrm.score.value=0;

  sfrm.mx.value=event.x;

  sfrm.my.value=event.y;

  sfrm.score.value++;

}

</script>

<form method=post name=sfrm>

Score : <input type=text name=score value=0 readonly style=border:0>

<input type=text name=mx readonly style=border:0;font:10>

<input type=text name=my readonly style=border:0;font:10><br>

</form>

<a href=rank.php>rank</a>



처음엔 랜덤하게 빨간눈과 검은눈 슬라임을 하나 고른다.
몬스터의 위치와 event.x,event.y를 비교해 몬스터의 위치가 조정된다.

이렇게 움직이다 moster.style.left가 event.x와 같고 moster.style.top이 event.y 와 같을때 종료되고 sfrm을 보내준다.event.x나 event.y가 0보다 작거나 같으면 스코어를 0으로 바꾸고 그렇지 않다면 점수를 올려준다.

rank링크도 한번가보자 많은사람들이 2147483647이라점수로 올려놨다.

밑에는 쿼리문이 노출되어있다. 


mysqli_query($db,"insert into chall55 values('{$_SESSION['id']}','".trim($_POST['score'])."','{$flag}')");



플래그 값을 알아야 될거같다.

스코어에 링크가 있으며 클릭해보면 score를 값으로 보내 받아 오는거 같다.


https://webhacking.kr/challenge/web-31/rank.php?score=2147483647


해당점수의 id값을 받아온다. 제일 첫번째값만 받아와 제일위에 

id : HeXJuNo // 2147483647


이런식으로 출력된다.

위 링크를 통해 sql injection을 시도해보자

no hack이라고 한다... select문과 union 은 막아놓은거같다.

막혀있는거 ascii ,select,union,substr

flag 값을 바로 가져올수는 없을거 같다. limit,if,

앞에 문제에서 썻던 구문을 활용해서 테이블 명을 가져올수있는지 보자

procedure analyse() 를 활용해보자

db명과 테이블명 컬럼명을 받아와 출력해주는모습을 볼수있다.

우리가 원하는 flag가 들어가는 컬럼명부터 알아보자

먼저 limit 2,1(밑의 쿼리를 참조해보면 flag 값은 3번째 이므로)을 붙여 

score=1 limit 2,1 procedure analyse()로 쿼리를 만들어 보내주면(score가 1점도 반응이있어서 이렇게  보냈다)


id : webhacking.chall55.p4ssw0rd_1123581321 //


라고 출력된다. 우리가 알고싶은 컬럼명은 p4ssw0rd_1123581321 이다.

이제 if(length(p4ssw0rd_1123581321)=1,1,0) 이라고 쿼리를 보내면 flag의 길이를 알수 있을것이다.


이는 이제 알았으니 ascii,substr등 문자열을 자르는 함수들이 막혀있다.

left와 right로 우회해보자

if(right(left(p4ssw0rd_1123581321,1),1)=0x11),1,0) 이런식의 쿼리문을 만들어주면 될거같다.

left에서는 해당문자열을 개수만큼 받아오고 right 에서는 가장오른쪽에 있는 문자를 출력하게 만들어 하나씩 문자를 추출할수 있다.

코드는 아래쪽


webhacking 55.py



이렇게 blind sql injection을 통해 flag를 추출할수 있다.

Flag 값을 인증창에 넣어주면 성공!






반응형

'보안 > webhacking' 카테고리의 다른 글

webhacking.kr old-58  (0) 2019.12.09
webhacking.kr old-56  (1) 2019.12.08
webhacking.kr old-54  (0) 2019.12.08
webhacking.kr old-53  (0) 2019.12.08
webhacking.kr old-50  (0) 2019.12.07
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기