[웹해킹] simple_sqli

Woo·2025년 1월 13일

워게임(웹해킹)

목록 보기
8/14

📖 문제

https://dreamhack.io/wargame/challenges/24/


📖 분석

SQL 인젝션을 사용해 admin 계정을 탈취하여 플래그를 획득하는 문제이다.
우선 가장 중요할 것 같은 login 페이지를 살펴보겠다.

📗 login 페이지

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        userid = request.form.get('userid')
        userpassword = request.form.get('userpassword')
        res = query_db(f'select * from users where userid="{userid}" and userpassword="{userpassword}"')
        if res:
            userid = res[0]
            if userid == 'admin':
                return f'hello {userid} flag is {FLAG}'
            return f'<script>alert("hello {userid}");history.go(-1);</script>'
        return '<script>alert("wrong");history.go(-1);</script>'

해당 페이지의 GET 요청이 아닌 경우를 살펴보면,
입력한 아이디와 비밀번호를 useriduserpassword에 저장을 한다.

query_db함수를 통해 select * from users where userid="{userid}" and userpassword="{userpassword}" SQL 명령을 보낸다.

해당 명령의 리턴값이 있다면, 이때 userid가 admin이라면, 플래그를 출력하는 것으로 보인다. query_db 함수를 사용하기에 이 함수를 알아보러 가보자

📘 app.py

def query_db(query, one=True):
    cur = get_db().execute(query)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv
    
def get_db():
    db = getattr(g, '_database', None)
    if db is None:
        db = g._database = sqlite3.connect(DATABASE)
    db.row_factory = sqlite3.Row
    return db

query_db 함수에서
query(select * from users where userid="{userid}" and userpassword="{userpassword}")를 get_db()함수를 통해 결과값을 cur에 저장하고 rv에 쿼리문 내용을 받아온다.

get_db()함수에서
연결된 데이터 베이스에서 쿼리문을 질의한다.


📖 풀이

이 문제는 간단하게 SQL 인젝션을 사용하면 플래그를 얻을 수 있는 것으로 확인된다.
admin 아이디를 우회해서 로그인 하는 방법이 있고, blind 인젝션을 사용해 비밀번호를 알아내는 방법이 있다.

우선 admin 아이디를 우회해서 로그인을 해보자.
우회할 수 있는 쿼리는 다양하다.
간단하게 해보면, 아이디에 admin "--, 비밀번호에 <아무값>을 넣어주면
SELECT FROM users WHERE userid="admin"-- " AND userpassword="<아무값>" 으로 SQL 명령문이 나오기 때문에 -- 뒤에는 모두 주석이 되므로 실질적으로
SELECT
FROM users WHERE userid="admin"
명령어가 보내지게 된다.

이 방법을 통해 로그인을 하면

플래그가 바로 나오게된다.

profile
다덤벼

0개의 댓글