2014-04-06 5 views
1

Привет У меня есть следующий запрос, который является частью класса java. Я просто хочу знать, какие возможные атаки возможны с помощью SQL Injection. Как злоумышленник может вводить запросы? Каковы примерные запросы в этом случае, которые могут быть использованы для получения доступа к базе данных?SQL Injection и возможные атаки

String query = ("SELECT username, password, admin FROM users 
    WHERE " + "username='" + username + "' AND password='" + 
    password + "'"); 
    ResultSet rs = st.executeQuery(query); 
    // Entry in the result set means the query was successful and 
    //the user is a valid user 
    if (rs.next()) { 
    username = rs.getString(1); 
    isAdmin = rs.getBoolean(3); 

Я думаю, что это возможный способ атаки, также помещая имя пользователя в качестве аЬса '; # так что-нибудь после # будет рассматриваться как комментарий в SQL. Что другие думают об этом?

Я хочу знать, что злоумышленник будет вводить в поле имени пользователя и пароль страницы HTML, чтобы получить доступ в качестве администратора. Предполагая, что работа вышеуказанного класса java заключается в обработке запроса входа пользователя с HTML-страницы путем запроса базы данных.

+0

http://www.sqlinjectionwiki.com/Default.aspx – DCoder

+1

Просто добавьте эту строку над первой строкой и запустите свой код. Он должен дать вам представление о том, что злоумышленник может предоставить при вводе пользователя: 'String username =" me '; Пользователи UPDATE SET password =' ​​foo '; - "' – StuartLC

+1

В зависимости от того, какие РСУБД, вы можете сделать все, отбрасывая базы данных для полного компрометации машины. –

ответ

3

в основном работает как этот https://xkcd.com/327/

, что я делаю, это при условии, что все пользователь вводит это угроза, поэтому я хотел бы сохранить все, чтобы переменные, как usUsername, где «мы» означает небезопасным. После этого я проверяю все «us» -переменные для инъекций, что приводит к sUsername (s означает безопасный). Поэтому, когда я создаю запрос, я могу использовать только s-varaibles и должен быть безопасным в большинстве случаев.

Эта идея полностью взята отсюда: http://www.joelonsoftware.com/articles/Wrong.html

+0

Лучше всего использовать параметризованные запросы, тогда вам не нужно беспокоиться о дезинфекции данных, поскольку это никогда не будет быть «инъекционным». Использование конкатенации строк для построения запросов никогда не является хорошей идеей, даже если вы сначала попытаетесь дезинформировать значения. Слишком легко пропустить что-то плохое. –

0

Вы не можете этого сделать. имя пользователя и пароль могут быть заменены на все, что ведет ко всем типам запросов. Вы должны использовать подготовленное заявление, чтобы указать имя пользователя и пароль.

2

На основании этого кода вы можете сделать НИЖЕ что хотите, манипулируя значениями имени пользователя или пароля, отправленного на запрос.

Единственным ограничением является уровень разрешения учетной записи пользователя, выполняющей запрос. Если это был системный администратор, вы можете удалить все. Если SQL Server и xp_cmdshell включены, вы можете отформатировать жесткий диск SQL-сервера.

SQL Injection - одна из тех вещей, где, если вы можете сделать что-то, вы можете в значительной степени сделать что-нибудь.

Загляните в инструмент Havij, который является инструментом исследования безопасности, который может продемонстрировать мощь SQLi.

0

Ввод следующих значений для пароля бы добавить строку в результирующем набор, содержащих значения 'admin', 'dummy', 1 для пользователя, пароля, и админ соответственно:

' AND 1=0 UNION SELECT 'admin', 'dummy', admin FROM users WHERE admin = 1 AND '1'='1 

Результирующий запрос будет выглядеть следующим образом:

SELECT username, password, admin FROM users 
WHERE username='dummy' AND password='' AND 1=0 UNION SELECT 'admin', 'dummy', admin FROM users WHERE admin = 1 AND '1'='1' 

Первый SELECT, не будет возвращать никакого результата, как 1=0 ложно для каждой записи. Но второй, введенный SELECT будет возвращать все записи, где admin=1 истинно, и заменяет исходные значения для имя пользователя и пароль с admin и dummy, соответственно.

Вы должны use prepared statements и передать значения в качестве параметров при выполнении.

Смежные вопросы