본문 바로가기
war game/웹 워게임(los)

load of sql injection dragon

by 강깅꽁 2016. 9. 15.

<?php 
  
include "../config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  
$query "select id from prob_dragon 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("dragon");
  
highlight_file(__FILE__); 
?>


소스코드 분석

특별한 필터 구문은 없고 받는 파라미터가 pw뿐이지만 그 pw가 주석 처리 되기 떄문에 이 주석을 어떻게 무력화 시키거나 해야할 방법을 찾아야 할 것 처럼 보인다.


풀이

중요한 정보는 # 필터는 한줄짜리 주석이라는 것이다. 즉 pw 파라미터로 개행을 해주게 되면 개행 이후의 쿼리 문은 데이터 베이스가 인식하게 된다는 것이다.

#주석이 한줄 주석이 힌트이다. 즉 다음줄로 넘기면 되는 것 아닌가?

개행 아스키코드는 0a 이다.

즉 페이로드를 '%a and pw='' || id='admin' 으로 하게 되면된다.


앞에 guest부분을 거짓으로 만들고 || 뒤에 부분을 참으로 만들면 클리어!