write-up/LOS write-up

LOS (Lord of SQL injection) 문제 1번 gremlin write-up

정보보호학과 새내기 2021. 7. 5. 16:36
반응형

문제 1번 - gremlin

 

query : select id from prob_gremlin where id='' and pw=''

<?php
  include "./config.php";
  login_chk();
  $db = dbconnect();
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");
  highlight_file(__FILE__);
?>

 

sql injection을 하기 위해 먼저 해야하는 것이 몇가지 있다. LOS 문제 1번처럼 코드를 주는 경우에는 무엇이 입력해야하는지와 입력할때 무엇을 필터링하는지를 코드에서 확인해야한다. 코드를 안 주는 경우는 코드에서 확인하지 않고 직접 해보며 찾아야 한다.

 

먼저 필터링과 관련된 함수를 알아보면 preg_match 함수에 대하여 알아한다.

preg_match 함수란 해당 문자열에서 전달받은 정규 표현식과 일치하는 패턴을 검색하는 함수이다. 아래와 같이 첫 번째 인수에는 정규식 표현을 작성하고 두 번째 인수에는 검색 대상 문자열을 넣는다. 세 번째 인자는 필터링된 문자를 저장하는 배열 변수이다. (문제에는 세 번째 인자가 없는 것을 알 수 있다.)

preg_match('/대조할 문자/','입력한 문자열',$matches)

 

preg_match의 첫 번째 인자에 정규식 표현을 작성할때 '//'안에 각 표현들을 적는데 각 표현은 |으로 구별한다. 또 문자들은 문자 표현이라는 것을 명확해하기 위하여 \를 사용하고 문자를 표현한다. 예를 들어 (은 \(로 표현한다.

 

또 끝나는 /뒤에 옵션을 적을 수 있는데 /i는 필터링할 때 대소문자를 구별하지 않는다는 것이다.

 

즉 아래 코드에서 보이듯 id라는 변수에서 정규 표현식을 설명하면 prob와 _ , . , ( , ) ,을 필터링하고 i를 통해 대소문자를 구별하지 않는 것을 확인할 수 있다.

<?php
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); // do not try to attack another table, database!
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
?>

 

또 코드를 확인해보면 result에 참인 값만 들어가면 되면 solve되니 or을 이용하여 참인 값을 입력하면 된다.

 

<?php
  $query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>";
  $result = @mysqli_fetch_array(mysqli_query($db,$query));
  if($result['id']) solve("gremlin");
  highlight_file(__FILE__);
?>

따라서 아이디에 해당하는 값 안에 or 1=1을 넣어 항상 참이라는 조건으로 query문에 있는 where 조건을 우회할 수 있다. 우회할 때는 자신이 원하는 문장까지 사용하고 뒤에를 주석처리 해야하는데 주석처리를 의미하는 것 중 #을 사용할 것이다. 

 

지금 url에 #을 입력하는 것이므로 # 대신 같은 의미를 지니는 %24로 써야한다. (# == %23)

 

따라서 해당 주소 php 뒤에 ?id=' or 1=1 %23을 입력한다.

 

solve

https://los.rubiya.kr/chall/gremlin_280c5552de8b681110e9287421b834fd.php?id=%27%20or%201=1%20%23 

클리어 화면

 

반응형