В компоненте  flashmediaelement.swf популярной CMS WordPress обнаружена XSS-уязвимость. Уязвимости подвержены все сайты на данной CMS до версии 4.5.2 (последний релиз на 15.05.16).

Уязвимость существует из-за недостаточной фильтрации входящих данных при передаче GET параметра flashVars. Манипулируя значением URI атакующий может сформировать вредоносный запрос, приводящий к выполнению XSS-кода.

Пример атаки:

 https://example.com/wp-includes/js/mediaelement/flashmediaelement.swf?jsinitfunctio%gn=alert`1`

Компонент flash player довольно терпимо относится к переданным в GET значениям, но проверяет их на наличие "опасных" символов:

  '\" () {} * + \\ <>

Эти символы описаны в ECMAScript 5. Однако в актуальном стандарте ECMAScript 6 добавлено использование back-ticks в виде

` `

, наличие которых в URI не подвергается очистке (санации) как потенциально опасное.

При проведении атаки отбрасывается ошибочный параметр jsinitfunctio%gn, но при этом сразу же выполняется следующий GET-запрос.

({'jsinitfunctio%gn':''}).hasOwnProperty('jsinitfunction') // false

Важно заметить, что существует еще один механизм защиты (кроме санации и проверки валидности запроса) - проверка ID.

В популярном браузере Google Chrome механизм формирования flash из страницы содержит необходимый ID, что позволяет провести атаку: <embed id="plugin" src="test.swf" type="application/x-shockwave-flash" width="100%" height="100%" name="plugin"></embed>
Браузеры Firefox и Internet Explorer это значение не передают:
<embed src="test.swf" type="application/x-shockwave-flash" width="100%" height="100%" name="plugin"></embed>

Слагаемые атаки:

  1. Обход "GET Killer" используя неверные параметры URI (%g).
  2. Использование ES6 back-ticks.
  3. Обход проверки ExternalInterface.objectID при использовании жертвой атаки браузера Google Chrome.

Использование Web Application Firewall позволяет блокировать подобные атаки даже при наличии уязвимости "нулевого дня".