데이터베이스 쿼리 인젝션 공격
Noncompliant Code Example
public boolean authenticate(javax.servlet.http.HttpServletRequest request, java.sql.Connection connection) throws SQLException {
String user = request.getParameter("user");
String pass = request.getParameter("pass");
String query = "SELECT * FROM users WHERE user = '" + user + "' AND pass = '" + pass + "'"; // Unsafe
// If the special value "foo' OR 1=1 --" is passed as either the user or pass, authentication is bypassed
// Indeed, if it is passed as a user, the query becomes:
// SELECT * FROM users WHERE user = 'foo' OR 1=1 --' AND pass = '...'
// As '--' is the comment till end of line syntax in SQL, this is equivalent to:
// SELECT * FROM users WHERE user = 'foo' OR 1=1
// which is equivalent to:
// SELECT * FROM users WHERE 1=1
// which is equivalent to:
// SELECT * FROM users
java.sql.Statement statement = connection.createStatement();
java.sql.ResultSet resultSet = statement.executeQuery(query); // Noncompliant
return resultSet.next();
}
Compliant Solution
public boolean authenticate(javax.servlet.http.HttpServletRequest request, java.sql.Connection connection) throws SQLException {
String user = request.getParameter("user");
String pass = request.getParameter("pass");
String query = "SELECT * FROM users WHERE user = ? AND pass = ?"; // Safe even if authenticate() method is still vulnerable to brute-force attack in this specific case
java.sql.PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, user); // Will be properly escaped
statement.setString(2, pass);
java.sql.ResultSet resultSet = statement.executeQuery();
return resultSet.next();
}
'Secure Coding' 카테고리의 다른 글
XPath 인젝션 공격 (0) | 2021.09.17 |
---|---|
데이터베이스에 연결 시 암호 보안 (0) | 2021.09.17 |
Reflected cross-site scripting (XSS) 공격 (0) | 2021.09.17 |
역직렬화 인젝셕 (0) | 2021.09.17 |
[java] Dynamic code execution should not be vulnerable to injection attacks (0) | 2021.09.17 |
댓글