본문 바로가기

챌린지/los.rubiya.kr

Lord of SQLInjection - darkelf

6번째 문제인 darkelf다.

<?php 
  include "./config.php"; 
  login_chk(); 
  $db = dbconnect();  
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_darkelf where id='guest' and pw='{$_GET[pw]}'"; 
  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("darkelf"); 
  highlight_file(__FILE__); 
?>

이번 문제에서는 or, and 연산자를 필터링하고 있다. 쿼리의 where 절에서 복합 조건을 지정하기 위해 주로 사용되는 명령어인데 이를 통째로 필터링하고 있기 때문에 사용할 수 없다. 하지만 mysql에서는 or, and 연산자를 ||, && 연산자로도 사용할 수 있기 때문에 이같은 필터링은 거의 의미가 없다. 그래서 pw 파라미터에 "' || true%23"처럼 전달해주면 될까?

admin이 아닌 guest 계정으로 인식됐다. 코드를 자세히 살펴보니 result['id']가 'admin'이어야 문제를 해결할 수 있다. 그렇다면 pw 파라미터에 "' || id='admin"처럼 id가 'admin'인 조건으로 전달해보자.

어렵지 않게 풀 수 있었다.

 

 

이번 문제는 단순히 and, or 연산자를 필터링하는 것은 &&, || 연산자로 우회할 수 있다는 것을 알려주는 문제인 것 같다. 놓치기 쉬운 점은 '&' 문자는 '#'과 마찬가지로 URL에서 처리되기 때문에 URL encoding을 통해 직접 '%26'처럼 입력해주어야 한다.

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

Lord of SQLInjection - troll  (0) 2020.12.28
Lord of SQLInjection - orge  (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