webhacking.kr 17번, 18번 풀이

julia·2021년 3월 15일
0

이번에는 17+18번을 풀어봤는데 일단 17번은 사실 스크립트에서 답을 다 알려주고 있어서 당황스러웠고, 18번은 작년에 내가 가장 열심히 공부했던 sql injection이 나와서 반가웠다.

💡 17번 문제 풀이

17번 스크립트이다. unlock의 값을 계산해서 넣으면 끝...

<script>
  unlock=100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+1/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10-100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10/100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10*100*10*10+100/10-10+10+50-9*8+7-6+5-4*3-2*1*10+9999999;
  function sub(){ if(login.pw.value==unlock){ location.href="?"+unlock/10; } else{ alert("Wrong"); } }
</script>


💡 18번 문제 풀이

18번은 sql 인젝션에 관련된 문제였는데 쉬우면서 내 스타일이었다. 그냥 sql이 재밌는건가? :)
문제 들어가보면 php 소스코드가 이처럼 나오는데, 주석으로 admin의 no가 2라는걸 친절하게 알려줬다.

<?php
if($_GET['no']){
  $db = dbconnect();
  if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2

  if($result['id']=="guest") echo "hi guest";
  if($result['id']=="admin"){
    solve(18);
    echo "hi admin!";
  }
}
?>

다시 문제로 돌아가 일단 sql injection이 어떻게 작동하는지 보기 위해 아무 숫자나 집어넣었는데(가장 간단하게 1을 집어넣음) hi guest 라고 밑에 뜨는 걸로 보아 게스트의 no가 1이라는걸 우연히 알게 되었다><


url을 확인해 보니 https://webhacking.kr/challenge/web-32/index.php?no=1 라고 변경되는 것을 볼 수 있고, input값이 no= 다음에 오게 되는 걸 확인했다.
그렇다면, guest의 no를 무효화시키고 admin의 no를 끼워넣기 위해 쿼리를 조작해보도록 하자.
우선 guest의 no가 아닌 아무 숫자를 넣고(난 0으로 정함) or 구문을 이용하면 될 듯 하다.
'0' or no='2'
이 쿼리를 input에 입력하면 url이 https://webhacking.kr/challenge/web-32/index.php?no='1'(공백)or(공백)no='2' 로 변경되길 기대하겠지만... php 코드를 자세히 보면 공백을 필터링하고 있다는 걸 쉽게 알 수 있다.
따라서 우리는 공백 문자를 인코드한 값인 %09로 바꾸어 입력해주어야 한다.
결론적으로 답은 '0'%09or%09no='2' 이다.

근데 여기서 문제가 발생했다...두둥

url이 https://webhacking.kr/challenge/web-32/index.php?no=%270%27%09or%09no%3D%272%27 로 바뀌면서 포인트를 받을 것이라고 예상했는데 이상하게도 url이 https://webhacking.kr/challenge/web-32/index.php?no=%271%27%2509or%2509no%3D%272%27 이렇게 되었다. 그래서 input값에서 변경하는건 포기하고 url을 직접 변경(25를 지워주었다)해주니까 해결되었다. 아직도 왜 %09가 %2509로 바뀌어 들어간건지 잘 모르겠다ㅜㅜ 알게 되면 기록해야지,, (같이 공부하는 친구가 이 문제도 26번처럼 브라우저가 자동으로 인코딩해서 %2509로 바뀐 것 같다고 알려줬다! 근데 문제에서 공백은 필터링하니까 %09를 디코딩해서 넣을 수도 없고,, 해결방법이 뭔지는 아직 못찾았다)

😎 추가적으로 공부하면서 알게 된 지식

다른 분들은 어떻게 풀었나 검색해보다가, 한 블로그에서 no='2' 대신에 id=’admin’을 시도했던 분을 보았다. 나도 보면서 '어? 될 것 같은데?' 했는데... 이 방법이 먹히질 않았다고 한다. 그리고 그 이유는 이미 where id=’guest’라고 고정적으로 선택된 상태에서 id를 중복 선택하여 쿼리를 조작하는 일이 불가능하기 때문이었다.
이걸 보면서 또 느낀점, 공부는 혼자서만 하면 실력향상에 한계가 있을 것 같다ㅎㅎ 우물 안 개구리가 되지 않고 쑥쑥 성장하기 위해 다른 멋있는 사람들과 소통하고 공부하며 노력할 것이다!!

profile
Move Forward

0개의 댓글