Есть код на PHP.
Если коротко - он чистит пользовательский ввод перед сохранением в базу.
<?php
$payload = '...';
$sanitizedText = strip_tags($payload, '<br><b>');
$sanitizedText = preg_replace('/(\s)\s+/m', '\\1', $sanitizedText);
$sanitizedText = preg_replace("/<([a-z][a-z0-9]*)[^<|>]*?(\/?)>/si",'<$1$2>', $sanitizedText);
$sanitizedText = nl2br($sanitizedText);
echo $sanitizedText;
Try online:
https://onlinephp.io/c/6a70a
Это код моего коллеги. Сам я Front-end разработчик.
Сначала тут не было третьей строки - она удаляет атрибуты. После того, как я показал коллеге пейлоад, который эксплуатирует недостаточную фильтрацию - он дописал регулярку, которая вырезает аттрибуты.
Но во-первых, он бекенд разработчик и у него нет опыта написания XSS зондов/эксплойтов. А во вторых, он сам говорит, что плохо знает регулярные выражения.
Итак, после некоторого анализа, я обнаружил, что регулярку с легкостью проходит следующий классический пейлоад:
<b a="><b onclick="alert(1)">click me</b>
Но
strip_tags
режет атрибуты, в которых есть
<
.
Потом я нашел ещё один интересный момент в
strip_tags
:
Input:
<b/some>bold</b>
Output:
bold</b>
Но вот что-то интересное из этого я вытянуть не смог пока что.
Подскажите, есть ли ещё тут что-то интересное для обхода? Спасибо!