Здравствуйте, все никак не мог зарегистрироваться, вот сейчас назрел вопрос =) Код (Text): INSERT INTO votes_polls (user_id, poll_id, vote_value) VALUES (1,2,3) банальный запрос, добавляющий голос юзера на голосовании, все три поля - числовые. Правда value в них попадает в виде $_POST['value'], на лицо т.н. иньекция. Оно в общем и понятно, но не могли бы вы на пальцах объяснить - каким образом оно может быть использовано? Ведь говорили мускл не поддерживает подзапросы, поэтому подзапрос нельзя вставить (поэтому и удалить не получится, ни вставить). Вывести содержимое таблицы? Но ведь вывод осуществляет не запрос - а парсер получающий результат запроса, а он зачастую не выдает все в виде print_r за еще учитывая, что может вернуться другая таблица...
вот даже скрипт для теста сделал, любые попытки внутреннего инсерта выдают "некорректный синтаксис". может для мускла слухи ою иньекциях преувеличены? (я не пытаюсь доказать безопастность тыкой дырки, просто интересно, никто так и не смог ничего внятного показать, обычно фокусы проводят на SELECT, где в WHERE указывают условия показа всех записей, например заблоченого форума). Код (Text): <?php $db_c=mysql_connect("localhost", "testuser", "testpassword"); $db_s=mysql_select_db("tablehack"); if(!$db_c){ die(mysql_errno()." : ".mysql_error()); }elseif(!$db_s){ die(mysql_errno()." : ".mysql_error()); } if(isset($_GET['create'])){ $query="CREATE TABLE votes_polls ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, user_id int(10) NOT NULL default '0', poll_id int(10) NOT NULL default '0', vote_value int(10) NOT NULL default '0', PRIMARY KEY (id) ) TYPE=MyISAM;"; $result=mysql_query($query); if(!$result){ echo mysql_error(); } } if(isset($_GET['value'])){ $query="INSERT INTO votes_polls (user_id, poll_id, vote_value) VALUES (1,2,".$_GET['value'].")"; $result=mysql_query($query); if(!$result){ echo mysql_error(); }else{ echo "true"; } } ?>
?value=5),(1,2,5), …тут n повторов…(1,2,5 и пользователь с id=1 получает предупреждение. а с echo mysql_error(); узнать вид всего запроса не так уж и сложно…
Mr.M.I.T. вот об этом я и говорю. Код (Text): - А погуглить? - А попробывать? сейчас ветка начинает принимать несколько иной оборот (что может повлечь закрытие, но не хотелось бы), но почему то все примеры взлома не работали. Скрипт выше я написал, дырка видна невооруженным глазом, пока никто так и не сказал, что именно там можно навредить. ошибка корректности синтаксиса так же выходит и в примере Luge. прошу прощения, пример Luge работает, спасибо что указали конкретную дырку.
правильно ли я понимаю, что поставив апостофы я убиваю эту возможность накрутки? Код (Text): VALUES ('1','2','".$_GET['value']."') ведь магические кавычки на большинстве вебсерверов включены, и они помешают вставить дополнительный параметр.
магические кавычки на нормальных хостингах как раз уже выключены (как и должно быть по дефолту в PHP5), а в PHP6 их вообще не будет. ?value=5'),('1','2','5'),('1','2','5
Горбунов Олег Код (Text): INSERT INTO votes_polls (user_id, poll_id, vote_value) VALUES ('1','2','5\'),(\'1\',\'2\',\'5\'),(\'1\',\'2\',\'5')
Это то, что делают кавычки магические =) Вообще все это навеяно тоннами примеров различных кульхацкеров, пишущих много статей о взломе, кучу примеров с иньекциями, а вот пока только Luge написал что то рабочее к конкретному коду, спрашивается, а что другие - пишут не пробуют? в том числе куча шлака по ссылке Mr.M.I.T.
Этим и отличается хороший программист от плохого — моим скриптам(и клиентам) пофиг, включены у них short_tags, allow_url_fopen, magic_quotes и прочая поебень: скрипты просто работают, и работают правильно.
viktor_nez любая инъекция — признак лени программиста. А магические кавычки и ошибка корректности синтаксиса — это так, отмазки, чтобы спихнуть вину ежели что случится.
А еще важным свойством таких "приложений" оказывается их непереносимость. Стоит сменить хостера или своему же хостеру чуть изменить настройки - и ото всюду посыпятся ошибки и дыры.
ну знаю я а ещё они со всем вводом вообще это делают и нахрена тебе такое извращение? формы отфильтровать так сложно? + и стоит ли надеяться на то, что именно там они будут везде, где планируется использовать скрипт?
эм... а что мешает, если ожидается ввод цифр, сделать что-то вроде $val = (int)$_GET['param'];. Tекст проверить на допустимые символы и так далее?