수색…


소개

SQL 삽입은 데이터 주입 응용 프로그램을 공격하는 데 사용되는 코드 주입 기술입니다. 사기성 SQL 문을 입력 필드에 삽입하여 실행합니다 (예 : 데이터베이스 내용을 공격자에게 덤프).

이번 장에서는 JDBC Statement와의 관계에 대해 설명 할 것이다.

문장 및 SQL 주입 악

우리는 PostgreSQL의 DBMS를 사용하지만, 당신이 어떤 DBMS를 사용할 수 있습니다 참고이 예제에서는

우리는 Schema: sch_test 포함하는 데이터베이스 bd_test 마녀를 사용할 것입니다 Schema: sch_test 와 두 테이블 userstest :

CREATE TABLE sch_test.users
(
  id serial NOT NULL,
  username character varying,
  password character varying,
  CONSTRAINT utilisateur_pkey PRIMARY KEY (id)
) 

CREATE TABLE sch_test.test
(
  id serial NOT NULL,
  "column" character varying
)

Statement를 사용한 간단한 로그인

static String DRIVER = "org.postgresql.Driver";
static String DB_USERNAME = "postgres";
static String DB_PASSWOR = "admin";
static String DB_URL = "jdbc:postgresql://localhost:5432/bd_test";

public static void sqlInjection() {
    try {
        Class.forName(DRIVER);
        Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWOR);
        Statement statement = connection.createStatement();
        String username = "admin";
        String password = "admin";
        String query = "SELECT * FROM sch_test.users where username = '" 
                + username + "' and password = '" + password + "'";

        ResultSet result = statement.executeQuery(query);

        if (result.next()) {
            System.out.println("id = " + result.getInt("id") + " | username = "
                    + result.getString("username") + " | password = " + result.getString("password"));
        }else{
           System.out.println("Login not correct");
        }

    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }
}

지금까지 모든 것이 정상적이고 안전합니다.

허위 사용자 이름과 비밀번호로 로그인하십시오.

해커 또는 테스터는 다음을 사용하여 로그인하거나 모든 사용자를 나열 할 수 있습니다.

String username = " ' or ''='";
String password = " ' or ''='";

새 사용자 삽입

다음을 사용하여 테이블에 데이터를 삽입 할 수 있습니다.

String username = "'; INSERT INTO sch_test.utilisateur(id, username, password) 
                        VALUES (2, 'hack1', 'hack2');--";
String password = "any";

모든 사용자 삭제

해커가 데이터베이스의 스키마를 알고있어 모든 사용자를 삭제할 수 있다고 생각하십시오.

String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any"; 

DROP 테이블 사용자

해커가 테이블을 삭제할 수도 있습니다.

String username = "'; drop table sch_test.table2;--";
String password = "any";

데이터베이스 삭제

최악은 데이터베이스를 삭제하는 것입니다.

String username = "'; DROP DATABASE bd_test;--";
String password = "any";

그리고 다른 많은 것들이 있습니다.

왜이 모든 것입니까?

때문에이 모든 Statement 그것을처럼 충분히 그것을 사용하는 것이 좋습니다 것입니다에 대한 것으로, 쿼리를 실행 안전하지 않습니다 PreparedStatement 대신, 그것은 더 그 확보입니다 Statement .

자세한 내용은 여기에서 찾을 수 있습니다 PreparedStatement



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow