Web Hacking/SWLUG 내부 CTF

[SWLUG] Sqli0 - write up

hanbunny 2025. 4. 14. 11:20

🐰시작!

이 창이 뜨고 시작한다.
아이디와 패스워드를 넣어 푸는 문제 같음.

소스코드를 먼저 열어봤다.

 

from flask import Flask, request, g
import mysql.connector

app = Flask(__name__)

with open('FLAG.txt', 'r') as file:
    FLAG = file.read().strip()

def get_db():
    if 'db' not in g:
        g.db = mysql.connector.connect(
            host='db',  # Docker Compose 서비스 이름
            user='root',
            password='toor',
            database='sqli'
        )
    return g.db

@app.teardown_appcontext
def close_db(exception):
    db = g.pop('db', None)
    if db is not None:
        db.close()

@app.route('/')
def index():
    uid = request.args.get('uid')
    upw = request.args.get('upw')

    query = f"SELECT * FROM sqli0 WHERE uid='{uid}' AND upw='{upw}'"
    print(query)  
    cur = get_db().cursor()
    try:
        cur.execute(query)
        result = cur.fetchone()
    except mysql.connector.Error as e:
        return f"<h3>Database error: {e}</h3>"
    
    if result:  
        if result[1] == 'admin':  # 사용자가 'admin'이라면
            output = f"<h3>Hello! {result[3]}</h3><p>FLAG: {FLAG}</p>"  # FLAG 포함 메시지 생성
        else:
            output = f"<h3>Hello! {result[3]}</h3>"  # 일반 사용자 환영 메시지 생성
    else:  
        output = "<h3>Invalid credentials</h3>" 

    
    return f"""
        <h1>level 0</h1>
        <p><b>Query:</b> {query}</p>
        <p><b>Result:</b> {output}</p>
    """
if __name__ == '__main__':
    app.run(host='0.0.0.0')

if문 부분을 보면 사용자가 'admin'이면 **FLAG**값을 출력하고 'admin'이 아니라면 **Invalid credentials** 가 출력된다.

'admin'계정의 비밀번호를 알 수 없기 때문에 아무값이나 넣어봤더니 **Invalid credentials**가 뜬다.

그래서 비밀번호를 입력을 무효화 시킬 수 있는 방법을 찾아봤음.

 

인증우회공격

- 터미네이션 방식 (Termination Query)
"--를 사용해 주석처리함으로써 뒷 구문이 잘려진다."

/?uid=admin'--&upw=anything



- 인라인 방식 (In-line Query)
"'1'='1'을 사용해 모든 조건이 참이 되게 만든다."

/?uid=admin'OR '1'='1' AND upw=anything


두 방식 중 터미네이션 방식으로는 로그인이 안됐다.
아마 이 방식을 쓸 수 없게 막아놓은 거 같음.

 

그래서 인라인 방식으로 이 페이로드를 넣었더니 풀렸음.

/?uid=admin'OR '1'='1' AND upw=anything

 

 

근데 풀고나서 AND를 쓰는게 맞는 건지..? 궁금했음.

/?uid=admin' OR '1'='1' AND upw=anything

AND가 OR보다 우선순위가 높기 때문에

(uid = 'admin') OR ('1'='1' AND upw = 'anything')

 조건이 이렇게 인식이 된다.
그래서 upw가 참일 경우 모든 행이 반환될 수 있다.

+ AND '1'='1'과 OR '1'='1'의 차이.
  + AND '1'='1'에서 '1'='1'은 항상 참(True)이므로, 이전 조건이 참이어야 최종 결과도 참.
   + OR '1'='1'에서 '1'='1'은 항상 참(True)이므로, 이전 조건에 관계없이 전체 조건이 항상 참.

'Web Hacking > SWLUG 내부 CTF' 카테고리의 다른 글

[SWLUG] Sqli5 - write up  (0) 2025.04.14
[SWLUG] Sqli4 - write up  (0) 2025.04.14
[SWLUG] Sqli3 - write up  (0) 2025.04.14
[SWLUG] Sqli2 - write up  (0) 2025.04.14
[SWLUG] Sqli1 - write up  (0) 2025.04.14