jdbc
JDBC - स्टेटमेंट इंजेक्शन
खोज…
परिचय
एसक्यूएल इंजेक्शन एक कोड इंजेक्शन तकनीक है, जिसका उपयोग डेटा-चालित अनुप्रयोगों पर हमला करने के लिए किया जाता है, जिसमें नापाक एसक्यूएल बयान निष्पादन के लिए एक प्रवेश क्षेत्र में डाले जाते हैं (जैसे हमलावर को डेटाबेस सामग्री को डंप करने के लिए)।
इस खंड में हम JDBC स्टेटमेंट के साथ उस और उसके संबंध के बारे में बात करेंगे।
स्टेटमेंट और एसक्यूएल इंजेक्शन बुराई
इस उदाहरण में ध्यान दें कि हम PostgreSQL DBMS का उपयोग करेंगे, लेकिन आप किसी भी DBMS का उपयोग कर सकते हैं
हम एक डेटाबेस का उपयोग करेंगे bd_test
चुड़ैल में एक Schema: sch_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
)
स्टेटमेंट का उपयोग करके सरल लॉगिन
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";
DELETE सभी उपयोगकर्ता
विचार करें कि हैकर को आपके डेटाबेस का स्कीमा पता है, इसलिए वह आपके सभी उपयोगकर्ता को हटा सकता है
String username = "'; DELETE FROM sch_test.utilisateur WHERE id>0;--";
String password = "any";
DROP तालिका उपयोगकर्ता
हैकर आपकी टेबल को डिलीट भी कर सकता है
String username = "'; drop table sch_test.table2;--";
String password = "any";
DROP DATABASE
सबसे खराब डेटाबेस को गिराना है
String username = "'; DROP DATABASE bd_test;--";
String password = "any";
और कई अन्य हैं।
यह सब क्यों?
यह सब क्योंकि Statement
पर्याप्त सुरक्षित नहीं है, जैसे यह क्वेरी को निष्पादित करता है, वैसे ही इसके लिए यह PreparedStatement
का उपयोग करने की सिफारिश करता है, यह Statement
अधिक सुरक्षित है।
आप यहां अधिक विवरण तैयार कर सकते हैं