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. Хорошо забытое старое: файловая система
Именованные каналы и почтовые слоты (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. Хорошо забытое старое: файловая система
Метатрибуты и альтернативные потоки данных NTFS:
Directory:<Name>:<Type>File:<Name>:<Type>
C:Windowshh.exe == C:Windows:$I30:$INDEX_ALLOCATIONhh.exe
C:Windowsnotepad.exe == C:Windowsnotepad.exe::$DATA
FileName.aspx == FileName.aspx:.jpg
Метатрибуты файлов Метатрибуты индексов
$STANDARD_INFORMATION $INDEX_ROOT
$FILE_NAME $INDEX_ALLOCATION
$DATA $BITMAP
$ATTRIBUTE_LIST
$OBJECT_ID
$REPARSE_POINT
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. [PT-2012-06] Обход ограничений Nginx
http://hostname/.svn/entries
http://hostname/.svn::$INDEX_ALLOCATION/entries
HTTP/1.1 200 OK
Server: nginx/1.2.0
HTTP/1.1 403 Forbidden
Server: nginx/1.2.0
* стабильная версия nginx-1.2.0 for Windows, выпущена 2012-04-23
…
location ~/.svn/ {
deny all;
}
…
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. «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. Коллизии хэшей объектов
System.Object.GetHashCode() - возвращает 32-разрядный хэш-код объекта
(принимает значения от -2147483648 до 2147483647).
(http://blogs.msdn.com/b/ericlippert/archive/2010/03/22/socks-birthdays-and-hash-collisions.aspx)
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. Хитрый план (post-mortem MS11-100)
1. Рассчитываем 1000 строк с
коллизиями на каждую
комбинацию «версия
.NET»/«аппаратная платформа»
2. Отправляем каждый из
наборов в качестве параметров
POST-запроса
3. Замеряем время ответа на
каждый запрос
4. ???
5. ;)
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. Специфика 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. Padding oracle (MS10-070)
Последствия:
– получение ключей, необходимых для шифрования/дешифрования:
аутентификационных cookies;
ViewState и Event Validation;
аргументов для WebRecource.axd и ScriptResource.axd =>
чтение произвольных файлов внутри каталога
приложения
Исправления:
при ошибке паддинга возвращается обощенная ошибка;
используется случайное число в качестве IV;
изменен формат шифруемых строк для их валидации;
ScriptResource.axd может обрабатывать только *.js файлы.
19. Особенности эксплуатации LFI
Response.WriteFile(<vfilename>)
- позволяет включать любой файл внутри каталога приложения, кроме *.config;
- файл включается статически, выполнения кода не происходит;
- принимает в качестве аргумента виртуальное имя файла.
Server.Execute(<vfilename>)
- позволяет включать любой файл внутри каталога приложения, кроме *.config;
- выполняет обработчик для переданного файла, результат включает в ответ;
- принимает в качестве аргумента виртуальное имя файла.
File.ReadAllText(<filename>)
- позволяет включать любой файл, на который есть права;
- файл включается статически, выполнения кода не происходит;
- принимает в качестве аргумента реальное имя файла.
21. Состояние представления (ViewState)
Предназначено для передачи на
сервер информации об элементах
представления.
- передается в параметре
__VIEWSTATE;
- шифрование и целостность часто
не обеспечиваются;
- используется разработчиками, для
хранения данных сессии на
клиенте, хотя не предназначено
для этого;
- нарушение его целостности может
привести к реализации самых
разнообразных угроз от XSS до
нарушения функциональности
приложения.
22. Подтверждение запросов и событий
Request Validation – встроенный примитивный WAF, направленный на
предотвращение атак XSS. Блокируются все запросы, содержащие:
&#
< с последующей буквой, !, / и ?
А также, игнорируются сторонние параметры, начинающиеся с __
Event Validation – встроенный механизм валидации
данных событий. Представляет собой параметр
__EVENTVALIDATION, хранящий хэши допустимых
значений элементов форм, событий, ViewState и т.п.
Вопреки бытующему мнению,
неэффективен против CSRF-атак,
при стандартной реализации.
23. 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:
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 };
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);
26. Внедрение выражений 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);
27. Внедрение выражений LINQ
Ограничения инъекций в Dynamic LINQ:
- доступ к полям, свойствам и методам возможен только для типа коллекции
или для достижимых типов, определяемых «белым списком»;
- все части выражения должны выполняться без ошибок, в сообщениях об
ошибках отсутствует полезный вывод;
- инъекции подвержены изолированные части запроса;
Возможности инъекций в Dynamic LINQ:
- обход аутентификации / авторизации;
- неавторизованный доступ к данным коллекции;
- нарушение функционала (при наличии у объектов коллекции statefull-
полей);
- реализация угрозы отказа в обслуживании (DoS).
В других решениях возможна реализация угрозы
удаленного выполнения кода (RCE)