[LOS] 3. Goblin

고둑·2021년 7월 11일
0

LoS

목록 보기
3/21
post-thumbnail

힌트

  • MySQL은 hex 값으로 암호화 되도 문자열처럼 읽음
  • no = 1guest

풀이

코드 해석

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); 
  if(preg_match('/\'|\"|\`/i', $_GET[no])) exit("No Quotes ~_~"); 
  $query = "select id from prob_goblin where id='guest' and no={$_GET[no]}"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("goblin");
  highlight_file(__FILE__); 
?>

이 문제의 풀이는 2가지가 있다.
가장 대중적인 풀이에서 이용하는 특징은 ', "가 검색되면 바로 오류를 뱉는다는 것이다. 따라서 이번에는 일반적인 방법으로는 문자열을 입력할 수 없다.
힌트에서 말했던 hex를 이용해야 한다.

또 다른 풀이로는 이 문제가 특이해서 가능한 건데 no부분에 따옴표가 없는 것을 보아 숫자를 입력하는 것을 알 수 있다.
그리고 계속 문제를 풀다 보면 db에는 guest를 제외하고 최상단에 admin이 있다는 것을 알 수 있다. 이 점을 이용하면 hex없이도 문제가 풀린다.

문제 풀이

1. hex 인코딩 이용

hex로 admin인코딩하면 61646d696e가 나온다.
나온 값은 hex 값, 즉 16진수이기 때문에 앞에 0x를 붙여주어 0x61646d696e 라는 값이 나온다.
따라서 기존 쿼리를 거짓으로 만들고 참인id=0x61646d696eor로 연결해주면 해결이 된다.

https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=0||id=0x61646d696e

2. hex 인코딩 사용 안할때

no값에 여러 가지 숫자를 입력해보면 힌트에서 말한 것처럼 no=1이 guest인 것을 알 수 있다.
따라서 no값이 1이 아니면 뭔가 다른 계정이 나올 거로 생각해서 no=0||no!=1을 해보니까 admin이 나와서 해결되었다.

https://los.rubiya.kr/chall/goblin_e5afb87a6716708e3af46a849517afdc.php?no=0||no!=1

profile
문워킹은 하지말자

0개의 댓글