2014-01-11 2 views
0

Я запускал сайт, который я приобрел, который, как я думал, был довольно неустранимым. Однако после атаки я обнаружил, что это не так. Он сообщил мне об уязвимости, однако мой вопрос заключается в том, какой пользовательский ввод мог быть сделан, чтобы получить все имена пользователей пользователей, как он? Вот код ...Hackable sql query

$un=$_GET['username']; 
$q=$db->query("SELECT * FROM users WHERE login_name='$un' OR username='$un'"); 

Я понимаю, что это highley hackable. Поэтому я изменил сайт на подготовленные заявления, чтобы это не повторилось. Я просто хочу знать, что он мог ввести, чтобы получить все имена пользователей пользователей.

Кто-то отправил сценарий на GitHub, вы можете найти его здесь: https://github.com/sat312/Mafia-Game-Script/blob/master/checkun.php

+2

Буквально первое, что google вызывает для «sql injection php», находится здесь: http://www.php.net/manual/en/security.database.sql-injection.php Полностью объясняет это для вас в полной мере – Deryck

+0

@Deryck Вы прочитали вопрос? Он ищет пример, который соответствует коду выше ... не какое-то общее описание. – Brad

+0

Ваш хакер сообщил вам. Как мило. – crafter

ответ

2
' OR 1=1; 

В URL:

/yourScript.php?username=%27%20OR%201%3D1%3B 

Идея заключается в том, что, поскольку данные смешивают с командой, вы можете просто закончить команду с данными.

+0

Да, но это не создает список имен пользователей. Некоторые, как он создал список имен пользователей, используя SQL-инъекцию. – alexander7567

+0

@ alexander7567 Это общая форма. Вы не показываете остальную часть своего кода (например, как работает вывод), поэтому я не могу быть более конкретным, чем это.Кроме того, в зависимости от конфигурации вам, возможно, придется завершить второй запрос в вашей инъекции. – Brad

+1

@ alexander7567 Для получения данных вы можете создавать объявления с помощью агрегатных функций и строковых функций. Я не буду читать весь код, с которым вы связаны ... это займет некоторое время. Я подозреваю, что этот код очень уязвим и другими способами. В любом случае, как только вы контролируете запрос, вы управляете выходом. Вам просто нужно будет проявить творческий подход к тому, как вы свернете данные. Имеет ли это смысл? Проверьте это: http://stackoverflow.com/q/149772/362536 – Brad

2

Вы получаете $un от пользователя, так что я могу напечатать все, что я хочу, и он будет получать подставляется в запросе. Это называется атакой SQL Injection.

Допустим, $un = ' OR 1 = 1;-- тогда ваш запрос будет выглядеть так:

SELECT * FROM users WHERE login_name='' OR 1 = 1;--' OR username='' OR 1 = 1;--' 

Что будет? это выполняется:

SELECT * FROM users WHERE login_name='' OR 1 = 1; 

Это вернет каждую строку в таблице.

1

Возможно, он использовал инструкцию GROUP_CONCAT в MySql, которая в основном группирует столбец из нескольких строк в одну строку (дополнительную информацию см. В разделе Can I concatenate multiple MySQL rows into one field?). Он, возможно, прекратил исходный оператор SQL или UNIONED его своим собственным, и добавил LIMIT и ORDER BY, чтобы гарантировать, что его результат вернется и закомментировал оставшееся исходное утверждение.

Это одна из возможностей, но, возможно, есть еще несколько других.