SQL-инъекция: это безопасно? - PullRequest
0 голосов
/ 02 октября 2011

У меня есть этот сайт со следующими параметрами:

http://www.example.com.com/pagination.php?page=4&order=comment_time&sc=desc

Я использую значения каждого из параметров в качестве значения в запросе SQL.

Я пытаюсь протестировать свое приложение и в конечном итоге взломать свое собственное приложение в учебных целях.

Я пытаюсь ввести это утверждение:
http://www.example.com.com/pagination.php?page=4&order=comment_time&sc=desc' или 1 = 1 -

Но происходит сбой, и MySQL говорит следующее:

Предупреждение: mysql_fetch_assoc () ожидает, что параметр 1 будет ресурсом, логическое значение указано в /home/dir/public_html/pagination.php в строке 132

Является ли мое приложение полностью свободным от внедрения SQL или все еще возможно?

РЕДАКТИРОВАТЬ: Могу ли я найти действительный оператор SQL инъекции для ввода в один из параметровURL?

Ответы [ 5 ]

2 голосов
/ 02 октября 2011

Это полностью уязвимо, и тот факт, что вы можете вызвать синтаксическую ошибку, доказывает это.

Нет функции для экранирования имен столбцов или порядка по направлениям. Эти функции не существуют, потому что неправильно выставлять логику БД непосредственно в URL, потому что она делает URL-адреса зависимыми от изменений в логике вашей базы данных.

Я бы предложил что-то вроде массива, сопоставляющего значения параметра "order" с именами столбцов:

$order_cols = array(
    'time' => 'comment_time',
    'popular' => 'comment_score',
    ... and so on ...
);

if (!isset($order_cols[$_GET['order'])) {
    $_GET['order'] = 'time';
}
$order = $order_cols[$_GET['order']];

Ограничить "sc" вручную:

if ($_GET['sc'] == 'asc' || $_GET['sc'] == 'desc') {
    $order .= ' ' . $_GET['sc'];
} else {
    $order .= ' desc';
}

Тогда вы гарантированно можете добавить это к запросу, а URL не привязан к реализации БД.

2 голосов
/ 02 октября 2011

Приложение защищено от SQL-инъекций никогда создает недопустимые запросы.

Так что, очевидно, у вас все еще есть некоторые проблемы.

Хорошо написанное приложение для any Ввод дает действительный и ожидаемый результат.

0 голосов
/ 02 октября 2011

Это действительно зависит от того, как PHP проверяет эти аргументы. Если MySQL выдает вам предупреждение, это означает, что хакер уже прошел через вашу первую линию защиты , которая является вашим PHP-скриптом.

Используйте if(!preg_match('/^regex_pattern$/', $your_input)) до фильтра всех ваших входов перед передачей их в MySQL.

0 голосов
/ 02 октября 2011

Я предполагаю, что ваш сгенерированный запрос делает что-то вроде

select <some number of fields>
from <some table>
where sc=desc
order by comment_time

Теперь, если бы я атаковал оператор order by вместо WHERE, я мог бы получить некоторые результаты ... Представьте себе,Я добавил следующий

comment_time; select top 5 * from sysobjects

, запрос, возвращаемый в ваш интерфейс, будет 5 верхними строками из sysobjects, а не запрос, который вы пытаетесь сгенерировать (в зависимости от внешнего интерфейса)

0 голосов
/ 02 октября 2011

Я не уверен на 100%, но я бы сказал, что он все еще кажется мне уязвимым - тот факт, что он принимает одинарную кавычку (') в качестве разделителя и затем генерирует ошибку из последующего введенного кода, говорит мне, что он передает вещи, которые он не должен на MySQL.

Любые данные, которые возможно могут быть взяты откуда-то, кроме самого вашего приложения, должны сначала пройти mysql_real_escape_string () . Таким образом вся часть ' or 1=1 передается в качестве значения в MySQL ... если только вы не передаете "sc" прямо для порядка сортировки, например

$sql = "SELECT * FROM foo WHERE page='{$_REQUEST['page']}' ORDER BY data {$_REQUEST['sc']}";

... что вы тоже не должны делать. Попробуйте что-то вроде этого:

$page = mysql_real_escape_string($_REQUEST['page']);
if ($_REQUEST['sc'] == "desc")
  $sortorder = "DESC";
else
  $sortorder = "ASC";

$sql = "SELECT * FROM foo WHERE page='{$page}' ORDER BY data {$sortorder}";

Я до сих пор не могу сказать, что он ПОЛНОСТЬЮ защищен от инъекций, но он определенно более устойчив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...