본문 바로가기
dreamhack

[Dreamhack] simple_sqli (LEVEL 1)

by yejin_l 2023. 11. 28.
728x90

Description

로그인 서비스입니다.
SQL INJECTION 취약점을 통해 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.

 

풀이

step 1. 접속 정보 사이트로 접속 & 파일 다운로드 후 확인

접속하면 로그인을 할 수 있는 페이지가 나오게 된다. 코드를 살펴보면,

    db.execute('create table users(userid char(100), userpassword char(100));')
    db.execute(f'insert into users(userid, userpassword) values ("guest", "guest"), ("admin", "{binascii.hexlify(os.urandom(16)).decode("utf8")}");')

 

@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>'

 

login 페이지가 있고, guest와 admin으로 로그인 할 수 있는 것을 알 수 있다. guest의 계정의 패스워드는 guest이고, admin은 binascii.hexlify(os.urandom(16)).decode("utf8"인 것을 확인할 수 있었다.

guest : guest로 로그인 해보니 "hello guest"가 나왔고, admin으로 로그인 해보았더니 "wrong"이 나왔다.

문제 이름처럼 sql 인젝션을 통해 해결이 가능한데, and userpassword="{userpassword}" 이 부분을 주석처리를 해주면 될것 같았다. 주석 처리인 -- 을 사용해 userid에 admin"-- 이렇게 넣어주게 되면 플래그가 나오는 것을 확인할 수 있다.

 

728x90

'dreamhack' 카테고리의 다른 글

[Dreamhack] file-download-1 (Beginner)  (0) 2024.01.17
[Dreamhack] web-misconf-1 (Beginner)  (1) 2023.11.28
[Dreamhack] pathtraversal (Beginner)  (0) 2023.11.15
[Dreamhack] ssp_001 (LEVEL 2)  (1) 2023.11.15
[Dreamhack] image-storage (LEVEL 1)  (0) 2023.11.08