SQL-инъекция и подготовленные операторы - PullRequest
3 голосов
/ 29 марта 2012

Мой учитель и я ведем дискуссию о том, можно ли ввести SQL в подготовленное утверждение. Я понимаю, что обычно вы не можете, но профессор настаивает на использовании объединения SQL вместо использования (?).

Сейчас я пытаюсь взломать свой код, но мне не везет.

public Users getUserByUsername(String username) throws SQLException {
    StringBuffer sql = new StringBuffer();

    sql.append("select * from users as  u, user_type_lookup as l, user_types as t ");
    sql.append("where u.users_id=l.user_id and l.type_id=t.user_types_id and u.username='");
    sql.append(username);
    sql.append("';");

    System.out.println(sql.toString());

    PreparedStatement ps = conn.prepareStatement(sql.toString());
    ResultSet rs = ps.executeQuery(sql.toString());

    if (!rs.next()) {
        return null;
    }

    String password = rs.getString("password");
    String type = rs.getString("description");
    int id = rs.getInt("users_id");
    int incorrect_logins = rs.getInt("incorrect_logins");
    Time wait_time = rs.getTime("wait_time");

    Users u = new Users(id, username, password, type, incorrect_logins,
            wait_time);
    return u;
}

Вставки, которые я пробовал:

string: '; DELETE FROM users WHERE 1 or users_id = '
string: ';delete from users where username<>'
//The only one that worked    
string: stan' or 'a'<>'b

Вывод SQL (приводит к ошибке Java):

select * from users as  u, user_type_lookup as l, user_types as t where u.users_id=l.user_id and l.type_id=t.user_types_id and u.username=''; DELETE FROM users WHERE 1 or users_id = '';

Вывод SQL (работает как задумано):

select * from users as  u, user_type_lookup as l, user_types as t where u.users_id=l.user_id and l.type_id=t.user_types_id and u.username='stan';

Сообщение об ошибке:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your    
SQL syntax; check the manual that corresponds to your MySQL server version for the   
right syntax to use near 'DELETE FROM users WHERE 1 or users_id = ''' at line 1

Сервер: Tomcat 7

База данных: MySQL

IDE: Eclipse

Язык: Java

Поэтому, пожалуйста, помогите мне взломать мой код!

1 Ответ

4 голосов
/ 29 марта 2012

Вы не можете добавить отдельный оператор в SQL подготовленного оператора, но вы можете разбить его, например:

  • с использованием ' OR 'x' = 'x в качестве имени пользователя (чтобы запрос выполнял декартово объединение для всех пользователей и сопоставлял типы между ними); это сильно повредит производительности, если users и user_type_lookup - большие таблицы, и станет отличным началом атаки типа "отказ в обслуживании".
  • с использованием ' OR (SELECT stored_procedure_that_deletes_things()) = 1 (чтобы запрос вызывал хранимую процедуру, которая имеет вредные последствия).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...