김승현

[Lord Of SQLInjection] skeleton 10번 문제 write up 본문

Web/Lord Of Sql

[Lord Of SQLInjection] skeleton 10번 문제 write up

kshind 2023. 3. 18. 19:46

문제는 이렇게 생겼습니다.

and 1=0은 신경 쓸 필요 없는 게 id나 pw의 값에 쿼리문을 이용해서 입력하고 난 후 마지막에 %23을 입력해 주기만 하면 1=0과 같은 뒷 내용이 주석처리가 되기 때문에 신경 쓸 필요 없습니다.

코드를 한 줄 한 줄 살펴봅시다.

include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

첫 번째 줄은 ./config.php를 포함한다는 내용입니다.
두 번째 줄은 로그인을 했는지 체크하는 내용입니다.
세 번째 줄은 db를 연결합니다.

네 번째 줄은 필터링 관련 내용입니다. (preg_match란 정규 표현식에 해당 내용이 발견되면 검색을 중단하는 함수입니다.)

필터링 내용
    1. prob
    2. _
    3. .
    4. (
    5. )
위의 내용을 대소문자 구분 없이 필터링 하고 위의 내용이 포함되면 No Hack ~_~내용이 출력됩니다.
 $query = "select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("skeleton"); 
  highlight_file(__FILE__);

$query에 select id from prob_skeleton where id='guest' and pw='{$_GET[pw]}' and 1=0 쿼리문을 저장합니다.

query : {$query}의 내용을 강조해서 출력합니다.

$result에 db를 연결하고 query 내용을 저장합니다.

만약 $result의 id가 admin이면 skeleton이 solve됩니다.

 

위의 경우 id가 이미 guest로 정해져있고 이를 pw와 and를 하고 있습니다. 이렇게 된 경우 and가 or보다 연산이 

먼저 되기 때문에 pw에 아무 내용 입력 후 or id='admin'을 저장하고 마지막에 #을 달아 마지막 내용을 주석으로

바꾼다면 문제가 해결됩니다.

<작성한 내용>

?pw=' or id = 'admin' %23

%23은 뒷 내용을 주석으로 바꾸는 #을 의미합니다.