खोज…


परिचय

एसक्यूएल इंजेक्शन एक कोड इंजेक्शन तकनीक है, जिसका उपयोग डेटा-चालित अनुप्रयोगों पर हमला करने के लिए किया जाता है, जिसमें नापाक एसक्यूएल बयान निष्पादन के लिए एक प्रवेश क्षेत्र में डाले जाते हैं (जैसे हमलावर को डेटाबेस सामग्री को डंप करने के लिए)।

इस खंड में हम 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 अधिक सुरक्षित है।

आप यहां अधिक विवरण तैयार कर सकते हैं



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow