본문 바로가기

챌린지/los.rubiya.kr

Lord of SQLInjection - cobolt

지난번 그렘린에 이어 이번에는 코볼트 문제다. 지금 보니 문제 이름들이 다 판타지스러운 명사들로 구성되어 있는데 SQL Injection 던전같은 느낌이 난다. 문제를 살펴보자.

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

지난번처럼 별다른 필터링은 없는데 이번에는 비밀번호 부분에 md5() 함수를 사용하고 있다. 문제에서 원하는 것은 쿼리 결과의 id 컬럼에 admin이라는 값이 들어가 있는 것으로, 이를 우회하려면 쿼리의 id 파라미터 이후로 무시하도록 주석 문자를 적절히 넣으면 될 것이다.

먼저 단순히 id 파라미터에 admin이란 값을 넘겨주면 위와 같은 쿼리가 만들어진다. 그러면 admin'# 처럼 넘겨주면 뒤의 pw 파라미터를 지울 수 있지 않을까?

예상대로 뒤의 쿼리가 무시되어 id가 admin인 값을 조회할 수 있었다.

 

 

아직까지는 기본적인 필터링도 없어서 진짜 원시적인, 튜토리얼에 나오는 코드를 그대로 집어넣어도 먹힌다. 얼른 다음 문제로 넘어가야겠다.

'챌린지 > los.rubiya.kr' 카테고리의 다른 글

Lord of SQLInjection - darkelf  (0) 2020.12.27
Lord of SQLInjection - wolfman  (0) 2020.12.22
Lord of SQLInjection - orc  (0) 2020.12.19
Lord of SQLInjection - goblin  (0) 2020.12.17
Lord of SQLInjection - gremlin  (0) 2020.12.15