SQL 인젝션이란?
●SQL 인젝션이란?
public boolean login(String username, String password) {
String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";
try (Connection conn = DriverManager.getConnection("url");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
return rs.next();
} catch (SQLException e) {
throw new RuntimeException("Database error", e);
}
}
username: admin' --
password: (아무거나)
SELECT * FROM users WHERE username = 'admin' -- ' AND password = '1q2w3e4r!';
생성되는 쿼리는 위와 같이 변형
-- 이후는 주석 처리되므로, 비밀번호 조건은 무시되어 admin 사용자에 대한 정보가 반환되며 이처럼 공격자는 SQL 쿼리를 조작하여 인증을 우회하거나 데이터베이스의 정보를 탈취할 수 있음
이 외에도 공격자는 다음과 같은 페이로드를 사용할 수 있음
' OR '1'='1: 항상 참이 되는 조건
' UNION SELECT * FROM accounts --: 다른 테이블의 정보 조회
'; DROP TABLE users; --: 테이블 삭제
●SQL 인젝션을 방지하는 방법
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, username);
pstmt.setString(2, password);