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

load of sql injection assassin

by 강깅꽁 2016. 9. 14.
반응형

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


소스코드 분석

select id from prob_assassin where pw like '{$_GET[pw]}' 쿼리르 봤을 경우 like 정규식으로 비밀번호를 찾는 문제인 듯 하다.


풀이

like %는  글자수가 몇 글자이든지 전부 찾아주는 명령어이다. like _는 _가 하나이기 떄문에 한자리만 자동 검색해준다.

따라서 pw파라미터에

pw=%를 넘겨주면 pw like '%'가 되기 때문에 비밀번홀르 알아서 찾아주게 되는데 결과 값이 guest이다.

즉 어느 정도까지 admin의 비밀번호를 알아내야 한다.

0~9까지 a~z까지 노가다를 통해 알아낸다.

계속 돌려봤을때 admin이라고 뜨지 않고 guest라고 뜨는 이유는 

테이블에서 guest가 admin보다 위에 존재하고 guest의 비밀번호와 admin의 비밀번호가 앞에 몇글자 까지 일치하다는 소리이다. 따라서 90까지는 guest라 뜨지만 902%라고 하게 되면 admin이라고 뜨게 된다.