powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / sql-injection?
14 сообщений из 14, страница 1 из 1
sql-injection?
    #38314870
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет. Сопровождаю один сайтик, на котором имеется форма комментариев. От продвинутых пользователей пришла подсказка, что через форму комментариев можно сделать sql-injection. Но, к сожалению, конкретного примера они не привели. А у меня что-то организовать инъекцию не удается (прежде чем я буду что-то исправлять, я хочу воспроизвести проблему, чтобы быть уверенным, что проблема исчезнет). Прошу помочь.

Теперь детали (оставляю только самое важное).

Форма комментариев
Код: html
1.
2.
3.
4.
5.
<form action="" method="post">
    <input type="text" name="author">
    <textarea name="comment"></textarea>
    <input type="submit" value="Submit">
</form>



Из формы данные попадают в контроллер:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
$author  = '';
if (isset($_REQUEST['author'])) {
    $author = trim(stripslashes($_REQUEST['author']));
}
$comment = '';
if (isset($_REQUEST['comment'])) {
    $comment = trim(stripslashes($_REQUEST['comment']));
}



Запрос, который используется для сохранения комментария:
Код: plsql
1.
INSERT INTO comments (comment_author, comment_text) VALUES (<?>,<?>)


Вопросики "<?>" -- самописная обработка поступающих параметров, которая досталась мне в наследство.

Параметры, переданные пользователем, объединяются в запрос (вопросики удаляются). Здесь $parQuery -- запрос с параметрами, $pars -- массив параметров.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
function combineQuery($parQuery, $pars) {
    $query = "";
    $par_i = 0;
    for ($i=0; $i<strlen($parQuery); $i++) {
        if (substr($parQuery, $i, 3) == "<?>") {
            $pr = $pars[$par_i++];
            if (!isset($pr)) {
                $query .= "''";
            } else if (is_int($pr)) {
                $query .= (int)$pr;
            } else if (is_float($pr)) {
                $query .= (float)$pr;
            } else if (is_string($pr)) {
                if ($pr == 'NULL') {
                    $query .= $pr;
                } else {
                    $query .= '\'';
                    $query .= str_replace( "\\", "\\\\", str_replace( '\'', '\'\'', $pr ));
                    $query .= '\'';
                }
            } else if (!$pr) {
                $query .= "''";
            } else {
                $query .= strval( $pr );
            }
            $i += 2;
        } else {
            $query .= $parQuery[$i];
        }
    }
    return $query;
}


В этой функции подозрительно выглядят строки
Код: php
1.
2.
3.
query .= '\'';
$query .= str_replace( "\\", "\\\\", str_replace( '\'', '\'\'', $pr ));
$query .= '\'';


но тут делается практически то же, что и в mysql_real_escape_string : Strictly speaking, MySQL requires only that backslash and the quote character used to quote the string in the query be escaped . mysql_real_escape_string() quotes the other characters to make them easier to read in log files.

Так что мне пока не ясно, каким образом здесь можно сделать sql-injection. Прошу помочь понять.
...
Рейтинг: 0 / 0
sql-injection?
    #38315000
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторно тут делается практически то же, что и в mysql_real_escape_string

авторCharacters encoded are “\”, “'”, “"”, NUL (ASCII 0), “\n”, “\r”,

Говнокод все, я бы переделал по нормальному.
...
Рейтинг: 0 / 0
sql-injection?
    #38315044
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще один момент:
Код: php
1.
2.
3.
} else {
    $query .= strval( $pr );
}



Получается, что при определенном условии мы можем попасть в этот блок. В нем к запросу присоединяется текст параметра без escaping-а. Только вот мне не ясно, можем ли мы вообще попасть в этот блок: ведь числовые и строковые параметры обрабатываются в предыдущих блоках. Может, магия PHP дает возможность попадать в этот небезопасный блок?
...
Рейтинг: 0 / 0
sql-injection?
    #38315066
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
pivot
Код: php
1.
$query .= str_replace( "\\", "\\\\", str_replace( '\'', '\'\'', $pr ));


Вот так в коде, или неправильно скопировали? А пробовали в строку в форме ' вставить?
...
Рейтинг: 0 / 0
sql-injection?
    #38315073
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
?,

пробовали. Не помогло.
...
Рейтинг: 0 / 0
sql-injection?
    #38315079
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
?,

скопировал правильно
...
Рейтинг: 0 / 0
sql-injection?
    #38315084
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
pivot, и у вас mysql?
...
Рейтинг: 0 / 0
sql-injection?
    #38315086
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
?,

да
...
Рейтинг: 0 / 0
sql-injection?
    #38315364
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Почему-то считал, что для mysql в дефолтной конфигурации апострофы надо исключительно слешами экранировать, а чтобы работало с удвоением апострофов, нужна специальная настройка. Оказалось, не так. По документации удвоение апострофов должно работать всегда. Может, от каких-то старых версий информация была. Ну тогда не видно здесь sql-injection.
...
Рейтинг: 0 / 0
sql-injection?
    #38315374
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pivot,

1. интересно, что может сделать инъекция в операторе вставки данных в таблицу? Разве что вставить 2 коммента вместо одного... это раз. Если, конечно в самом низу у вас отправляется реально PDO или MySqli insert(), а не какой-нибудь общий query().

2. Хорошо, даже если прошла инъекция на выборку данных: какова вероятность того, что выборка окажется полезной в смысле знания сторонним взломщиком названия базы, таблиц и полей... а также условия соединений полей? Тока инсайдер. Это к слову об "опытном пользователе" - ищите в подсказчиках инсайдера, если уверены, что он точно опытный.

3. а подсказка точно от "опытного", а не рекламное разводилово "давайте мы вам тут поможем"? :)
...
Рейтинг: 0 / 0
sql-injection?
    #38315376
Arhat109
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arhat109,

имхо, но проблемы с инъекциями мне кажутся больше надуманными, чем реальными. Ещё для какого-нибудь "в контакте" - может и актуально... а для рядового сайта - слишком дорогое удовольствие удаленно копаться со взломом подбирая и определяя корректную инъекцию. по большей части - дурь это.
...
Рейтинг: 0 / 0
sql-injection?
    #38315425
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109Arhat109,

имхо, но проблемы с инъекциями мне кажутся больше надуманными, чем реальными. Ещё для какого-нибудь "в контакте" - может и актуально... а для рядового сайта - слишком дорогое удовольствие удаленно копаться со взломом подбирая и определяя корректную инъекцию. по большей части - дурь это.
Самому копаться не надо, для этого есть куча утилит, например sqlmap и другие. ТС может сам на локалке проверить, есть ли скуля или нет.
...
Рейтинг: 0 / 0
sql-injection?
    #38315489
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arhat109,

1) надежнее, все-таки, чтобы всякие товарищи не могли менять наши sql-запросы. Внутри используется pear DB::connect, а затем у полученного объекта дергается метод query($sqlString).

3) Вроде бы нет. Предложений коммерческих не поступало.
...
Рейтинг: 0 / 0
sql-injection?
    #38315491
pivot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
phpz,

спасибо, воспользуюсь вечерком.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / sql-injection?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]