jattboyfrompunjab Ответов: 3

Может ли кто-нибудь увидеть, есть ли какая-либо уязвимость SQL-инъекции в следующем коде? Спасибо


<?php
$loc_id = $_GET['location'];

$query = "SELECT * from locations where ID = '$loc_id'";

if (!$mysqli ->query($query)) {
              printf("Error: %s\n", $mysqli->error);
#              print_r($query);
           }
if ($result = $mysqli ->query($query)) {

         /* fetch associative array */
         while ($row = $result ->fetch_assoc()) {
             printf ("%s %s\n", $row["ID"], $row["City"]);

}
?>


Что я уже пробовал:

<?php
$loc_id = $_GET['location'];

$query = "SELECT * from locations where ID = '$loc_id'";

if (!$mysqli ->query($query)) {
              printf("Error: %s\n", $mysqli->error);
#              print_r($query);
           }
if ($result = $mysqli ->query($query)) {

         /* fetch associative array */
         while ($row = $result ->fetch_assoc()) {
             printf ("%s %s\n", $row["ID"], $row["City"]);

}
?>

Bryian Tan

Да есть такое. Давайте сделаем это просто, я могу привести вам пример, но мне нужно знать, сколько столбцов у вас есть в таблице locations?

Member 13909527

Есть три колонки.

Member 13909527

Как бы вы выполнили атаку SQL-инъекции здесь? Есть функция поиска и URL-адрес читается website.com/index.php/check-availability/?location=1-да.

Bryian Tan

см. решение 2

Member 13909527

Я очень новичок в этом и пытаюсь учиться, поэтому, пожалуйста, простите мое невежество. Если у вас есть доступ только к интерфейсу веб-сайта, который включает в себя выпадающее меню, окно поиска и панель веб-сайта, что бы вы ввели, чтобы вызвать ошибку?

Member 13909527

Я специально ищу ошибку, которая создает таблицы.

3 Ответов

Рейтинг:
1

Dave Kreskowiak

Э-э-э, если вы не видите проблемы SQL-инъекции в этом коде, и это совершенно очевидно, вам действительно нужно прочитать об атаках SQL-инъекции. Google для "SQL Injection attack" и "PHP SQL Injection attack" и начать читать.

Да, вы берете значение с веб-страницы, не проверяя его вообще, а затем используете конкатенацию строк для построения SQL-запроса с использованием этого "значения". Да, это уязвимо.

Вы также не используете никаких параметров в запросе и своем коде.


Рейтинг:
1

Bryian Tan

Код уязвим для SQL-инъекций. Вот вам пример. Запрос отобразит все имена таблиц в базе данных. Одинарная кавычка используется для завершения начального запроса, объединение используется для добавления результата в первый запрос и %23 (#) для экранирования одинарной кавычки.

location=whatever' UNION SELECT distinct TABLE_NAME, TABLE_TYPE,1 from information_schema.tables %23

Вы можете запустить этот запрос непосредственно в MySQL, чтобы увидеть его поведение. Я не знаю, сколько столбцов у вас есть в таблице местоположений, вы можете добавить 1 в запрос объединения до тех пор, пока количество столбцов не совпадет с таблицей местоположений.
SELECT * from locations where ID = 'whatever' UNION SELECT distinct TABLE_NAME, TABLE_TYPE,1 from information_schema.tables #'

Вы должны следовать предложению @Dave Kreskowiak, санировать/проверять пользовательский ввод перед его выполнением. Помните, никогда не доверяйте вводимым пользователем данным.

Вы также можете использовать функцию mysqli_real_escape_string для экранирования специальных символов.
$loc_id = mysqli_real_escape_string($mysqli, $_GET['location']);

PHP: mysqli::real_escape_string - руководство пользователя[^]
PHP mysqli_real_escape_string() функция[^]

Ниже приведены различные варианты уязвимости SQL-инъекции.
Шпаргалка для SQL - инъекций | Netsparker[^]

Дополнительное чтение
Руководство автостопщика по предотвращению инъекций SQL[^]


Рейтинг:
1

ghinckley68

это не php, но должно быть достаточно легко сделать в php


    'Defines the set of characters that will be checked.
    'You can add to this list, or remove items from this list, as appropriate for your site
    Public Shared SQLblackList As String() = {"--", ";--", ";", "/*", "*/", "@@", _
                                           "@", "char", "nchar", "varchar", "nvarchar", "alter", _
                                           "begin", "cast", "create", "cursor", "declare", "delete", _
                                           "drop", "exec", "execute", "fetch", "insert", _
                                           "kill", "open", "shutdown", "sys", "sysobjects", "syscolumns", _
                                           "table", "update"}

    Public Shared JAVAblackList As String() = {"--", ";--", ";", "/*", "*/", "@@", _
                                           "@", "char", "nchar", "varchar", "nvarchar", "alter", _
                                           "begin", "cast", "create", "cursor", "declare", "delete", _
                                           "drop", "exec", "execute", "fetch", "insert", _
                                           "kill", "open", "select", "shutdown", "sys", "sysobjects", "syscolumns", _
                                           "table", "update"}

    Public Shared VBCSblackList As String() = {"--", ";--", ";", "/*", "*/", "@@", _
                                   "@", "char", "nchar", "varchar", "nvarchar", "alter", _
                                   "begin", "cast", "create", "cursor", "declare", "delete", _
                                   "drop", "end", "exec", "execute", "fetch", "insert", _
                                   "kill", "open", "select", "shutdown", "sys", "sysobjects", "syscolumns", _
                                   "table", "update"}


    'For each incoming request, check the query-string, form and cookie values for suspicious values.
    '   Private Sub app_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
    'Dim Request As HttpRequest = TryCast(sender, HttpApplication).Context.Request

    '   For Each key As String In Request.QueryString
    '     CheckInput(Request.QueryString(key))
    '  Next
    'For Each key As String In Request.Form
    '   CheckInput(Request.Form(key))
    ' Next
    ' For Each key As String In Request.Cookies
    '     CheckInput(Request.Cookies(key).Value)
    ' Next
    ' End Sub
    '
    'The utility method that performs the blacklist comparisons
    'You can change the error handling, and error redirect location to whatever makes sense for your site.
    Public Function CheckInput(ByVal parameter As String) As Integer
        _KEY_WORDLIST = String.Empty

        Dim iReturn As Integer = 0

        For i As Integer = 0 To SQLblackList.Length - 1

            If (parameter.IndexOf(SQLblackList(i), StringComparison.OrdinalIgnoreCase) >= 0) Then

                _KEY_WORDLIST = _KEY_WORDLIST + "  " + SQLblackList(i)

                iReturn = 1
            End If
        Next

        Return iReturn

    End Function



End Class


Patrice T

Ответ на этот вопрос был дан более года назад.
Ваше решение настолько простодушно, что оно предотвратит нормальные операции и будет сообщать о защищенных запросах.

ghinckley68

да но он делает эту работу с VB4

Patrice T

А что произойдет, если записать фильм "Убить Билла" в базу данных ?

ghinckley68

Билла убивают

Patrice T

С этим кодом убийство-это совпадение с убийством, очень плохо !