Комментирование части запроса (SQL-inj)

Discussion in 'PHP' started by Disasm, 22 Jul 2009.

  1. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    Всем доброго дня.

    Уважаемые господа, столкнулся с такой проблемой:

    Для внедрения SQL инъекции необходимо закомментировать хвост запроса.

    Сам запрос в исходнике:
    Code:
    $sql = "UPDATE table SET time='{$now}', what='{$what}', do= '{$do}', task= '{$task}', link= '{$link}', func= '{$func}'"
    . "\n WHERE userid={$my->id} AND userip='{$myip}'";
    
    В SQL-inj комментирую так:
    Code:
    http://site.com/index.php?func=bla'/*
    на что получаю ошибку синтаксиса, не понятно почему...

    может это из-за того, что WHERE в запросе идет с новой строки...

    Подскажите пожалуйста как корректно закомментировать всё WHERE.
     
    #1 Disasm, 22 Jul 2009
    Last edited: 22 Jul 2009
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Дело не только в коментарии, ошибку, для проведения sql-inj надо не только уметь вызвать, но и нигилировать её последующим корректным запросом, а уж потом комментировать, чтобы анигилировать sql-конструкции, идущие следом
     
  3. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    Если я не ошибаюсь, конечная структура запроса у меня получается синтаксически верная.
    Это конечно при условии, что MySQL не требует строго обособления многострочного комментария с обеих сторон.

    Т.е. я расчитывал на то, что открывающего указателя многострочного комментария /* будет достаточно для построения синтаксически верного запроса, но что-то чувствую, что MySQL ругается именно на отсутствие закрытия комментария */
     
  4. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    вопрос: вы пытаетесь внедрить SQL-код обьединив запросы UPDATE & SELECT или через подзапрос?
    покажите как вы делаете тогда станет ясней...
     
  5. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    для начала просто заккоментировать, а делее через UNION еще раз UPDATE

    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 '/*' WHERE userid=0 AND userip='255.255.255.255'' at line 2 SQL=UPDATE table SET time='1248287457', what='main', do= '', task= '', link= '/index.php?func=bla%27/*', func= 'bla'/*' WHERE userid=0 AND userip='255.255.255.255'
     
  6. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    http://phpclub.ru/mysql/doc/comments.html

    Пища для мозгов)

    Code:
    http://site.com/index.php?func=bla'/*[B]'[/B]
    может вот так сработает!
     
  7. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    xa-xa89 спасибо! Теперь ясно почему ругается.
    Подскажите, как же мне тогда верно отрезать WHERE?
     
  8. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    не работает =(
     
  9. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Приводи сразу что пишет!я ж не телепат!
     
  10. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    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 '/*'' WHERE userid=0 AND userip='255.255.255.255'' at line 2 SQL=UPDATE table SET time='1248287457', what='main', do= '', task= '', link= '/index.php?func=%27/*%27', func= 'bla'/*'' WHERE userid=0 AND userip='255.255.255.255'
     
  11. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    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 '255.255.255.255'' at line 1 SQL=UPDATE table SET time='1248292780', what='main', do= '', task= '', link= '/index.php?func=bla%27+--+', func= 'bla' --' WHERE userid=0 AND userip='255.255.255.255'
     
    #11 Disasm, 23 Jul 2009
    Last edited: 23 Jul 2009
  12. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Вот в этом должен быть еще пробел после --
    может
    Code:
    http://site.com/index.php?func=bla'+--[тут пробел]
     
  13. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    тоже самое
    обратите особое внимание, что WHERE в запросе идет с новой строки, поэтому строчный комментарий не катит
     
  14. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    заманали уже со своим бредом, ссылку в студию
     
  15. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    Ну ради експеримента, раз у тебя есть доступ к сорцам
    возьми убери символ перевода строки и попробуй....
    будем хоть точно знать в чем проблема!
     
  16. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    Pashkela взглянул на ссылку и сказал, что инъекцию произвести нельзя, поскольку невозможно повлиять на исходный запрос и что это вовсе не SQL-inj, а просто ошибка запроса, хотя мне так не кажется...

    Пробую дописать в UPDATE не существующее поле:
    http://site.com/index.php?func=who',user1='user
    на что получаю соответствующую ошибку, что поле не существует.

    меняю имя поля на существующее:
    http://site.com/index.php?func=who',user='user
    и всё ок, запрос успешно выполнен, ошибок нет.

    Проблема осталась, мне надо закомментировать условие WHERE, либо каким-нибудь образом выполнить SELECT или дополнительный UPDATE.
     
    #16 Disasm, 23 Jul 2009
    Last edited: 23 Jul 2009
  17. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    1. Он не пишет "всё ок, запрос успешно выполнен" - зачем ты врешь?
    2. Где ты там вообще where увидел??? Там идет

    insert into lalala (`a`,`b`,`c`) VALUES ('1','who','3');

    3. Ставя кавычку в значение GET-переменной func ты вызываешь ошибку sql-запроса, это есс-но, так запрос превращается в такой:

    insert into lalala (`a`,`b`,`c`) VALUES ('1','who'','3');

    т.е. чисто ошибка синтаксиса sql-запроса, и, при постановке твой конструкции

    who',user1='user

    запрос превращается в такой:

    insert into lalala (`a`,`b`,`c`) VALUES ('1','who', user1='user','3');

    и при подстановке

    who',user='user

    просходит тоже самое

    что сразу вызывает уже не синтаксическую ошибку (т.е. с кавычками ты рахобрался), а нарушения между кол-вом вставляемых значений и кол-вом колонок, куда эти значения вставляются, т.к. ты вот таким диким способом сделал уже 4 параметра во вторых скобочках вместо положенных трёх (в данном примере, в реале их там просто побольше) - т.е. уж логическая ошибка, о чем оно тебе там и пишет:

    Column count doesn't match value count at row 1

    В таких условиях, при таком sql-запросе

    insert into lalala (`a`,`b`,`c`) VALUES ('1','who', '3');

    и уязвимом параметре 'who' скуля невозможна, отсекать тут нечего, при любом отсечении будет нарушение логики sql-запроса, единственное, что ты можешь сделать, это вставить своё значение в колонку `b` вместо 'who', но это ничего не даст в итоге, т.к. в реале это идет просто сохранение линка, где сейчас чел находится, т.е. просто статистика, + там magic_qutes=on
     
    #17 Pashkela, 23 Jul 2009
    Last edited: 23 Jul 2009
  18. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    Смотрите внимательнее, INSERT идет только тогда, когда для текущего посетителя сессия еще не открыта (точнее не сессия, а запись в БД о текущем местонахождении)
    Просто обновите страницу и получите UPDATE с WHERE

    И при update - http://site.com/forum.html?func=who%27,user=%27user
    ошибок нет, т.е. запрос успешно выполняется
     
    #18 Disasm, 23 Jul 2009
    Last edited: 23 Jul 2009
  19. xa-xa89

    xa-xa89 Elder - Старейшина

    Joined:
    17 May 2008
    Messages:
    108
    Likes Received:
    27
    Reputations:
    2
    как такое может получиться?
     
  20. Disasm

    Disasm New Member

    Joined:
    10 Aug 2008
    Messages:
    42
    Likes Received:
    3
    Reputations:
    0
    Неужели никто не может дать совет по сабжу?