jdbc
JDBC - 명령문 삽입
수색…
소개
SQL 삽입은 데이터 주입 응용 프로그램을 공격하는 데 사용되는 코드 주입 기술입니다. 사기성 SQL 문을 입력 필드에 삽입하여 실행합니다 (예 : 데이터베이스 내용을 공격자에게 덤프).
이번 장에서는 JDBC Statement와의 관계에 대해 설명 할 것이다.
문장 및 SQL 주입 악
우리는 PostgreSQL의 DBMS를 사용하지만, 당신이 어떤 DBMS를 사용할 수 있습니다 참고이 예제에서는
우리는 Schema: sch_test
포함하는 데이터베이스 bd_test
마녀를 사용할 것입니다 Schema: sch_test
와 두 테이블 users
와 test
:
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