В компоненте  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 позволяет блокировать подобные атаки даже при наличии уязвимости «нулевого дня».