Чтение онлайн

на главную

Жанры

19 смертных грехов, угрожающих безопасности программ

Виега Джон

Шрифт:

Тестирование

Простейший способ протестировать наличие XSS–ошибок – отправить запрос своему Web–приложению, задав всем входным параметрам заведомо небезопасные значения. Затем взгляните на полученный от сервера ответ, не ограничивайтесь только визуальным представлением. Изучите весь поток байтов, чтобы понять, вошли ли в ответ посланные вами данные. Если это так, ваш код может быть уязвим для XSS–атаки. Вот простой Perl–сценарий, который можно положить в основу теста:

...

#!/usr/bin/perl

use HTTP::Request::Common qw(POST GET);

use LWP::UserAgent;

# Сформировать заголовок, описывающий агента

my $ua = LWP::UserAgent->new;

$ua->agent("XSSInject/v1.40");

#

Строки, содержащие внедряемый сценарий

my @xss = (\'><script>alert(window.location);</script>\'\',

\'\"; alert(document.cookie);\',

\'\\' onmouseover=\\'alert(document.cookie);\\' \\'\',

\'\"><script>alert(document.cookie);</script>\',

\'\"></a><script>alert(document.cookie);</script>\',

\'xyzzy\');

# Построить запрос

my $url = "http://127.0.01/form.asp";

my $inject;

foreach $inject (@xss) {

my $req = POST $url, [Name => $inject,

Address => $inject,

Zip => $inject];

my $res = $ua->request($req);

# Получить ответ

# Если мы увидим внедренный сценарий, возможна проблема

$_ = $res->as_string;

print "Возможна XSS-ошибка [$url]\n" if index(lc $_,lc $inject != -1);

}

Примеры из реальной жизни

Следующие примеры XSS–уязвимостей взяты из базы данных CVE (cve.mitre.org).

Уязвимость IBM Lotus Domino для атаки с кросс–сайтовым сценарием и внедрением HTML

По какой–то причине этому бюллетеню не присвоен номер в базе данных CVE. Противник может обойти HTML–кодирование в вычисляемом Lotus Notes значении, добавив квадратные скобки («[" и "]») в начало и конец поля для некоторых типов данных. Подробности на странице www.securityfocus.eom/bid/l 1458.

Ошибка при контроле входных данных в сценарии isqlplus, входящем в состав Oracle HTTP Server, позволяет удаленному пользователю провести атаку с кросс–сайтовым сценарием

И на этот раз у бюллетеня отсутствует номер. Oracle HTTP Server основан на сервере Apache 1.3.x. В сценарии isqlplus есть XSS–ошибка, связанная с недостаточным контролем значений параметров «action», «username» и «password». Атака может выглядеть примерно так:

...

http://[target]isqlplus?action=logon&username=xyzzy%22%3e%3cscript%3e

alert(\'XSS\')%3c/script%3e\&password=xyzzy%3cscript%3ealert(\'XSS\')%3c

/script%3e

Подробности на странице www.securitytracker.com/alerts/2004/Jan/1008838.html.

CVE–2002–0840

XSS–уязвимость на стандартной странице с сообщением об ошибке в Apache 2.0 до версии 2.0.43 и в Apache 1.3.x до версии 1.3.26. Подробности на странице http://cert.uni–stuttgart.de/archive/bugtraq/2002/10/msg00017.html.

Искупление греха

Путь к искуплению состоит из двух шагов:

1) не допускайте некорректных входных данных. Для проверки обычно применяются регулярные выражения;

2) при выводе данных применяйте HTML–кодирование.

Необходимо принимать обе эти меры предосторожности в своих программах. В приведенных ниже примерах показано, как это делается на практике.

Искупление греха в ISAPI–расширениях и фильтрах на C/C++

Во фрагменте ниже приведен код для HTML–кодирования информации, отправляемой браузеру.

...

/////////////////////////////////////////////////////////////////

// HtmlEncode

// Кодирует поток HTML-данных

// Аргументы

// strRaw: указатель на необработанные HTML-данные

// result: ссылка на результат, хранящийся в std::string

// Возвращаемое значение:

// false: не удалось закодировать HTML-данные

// true: все HTML-данные закодированы

bool HtmlEncode(char *strRaw, std::string &result) {

size_t iLen = 0;

size_t i = 0;

if (strRaw && (iLen = strlen(strRaw))) {

for (i = 0; i < iLen; i++)

switch(strRaw[i]) {

case \'\0\' : break;

case \'<\' : result.append("&lt;"); break;

case \'>\' : result.append("&gt;"); break;

case \'(\' : result.append("&#40;"); break;

case \')\' : result.append("&#41;"); break;

case \'#\' : result.append("&#35;"); break;

case \'&\' : result.append("&amp;"); break;

case \'"\' : result.append("&quot;"); break;

default : result.append(1,strRaw[i]); break;

}

}

return i == iLen ? true : false;

}

Если

вы хотите пользоваться регулярными выражениями в программах на C/C++, то обратите внимание на класс CAtlRegExp, предлагаемый Microsoft, или на библиотеку Boost.Regex, документированную на страницеlibs/regex/doc/syntax.html.

Искупление греха в ASP

Применяйте сочетание регулярных выражений (в данном случает объект RegExp в сценарии на VBScript) и HTML–кодирования для проверки входных данных:

...

<%

name = Request.QueryString("Name")

Set r = new ReqExp

r.Pattern = "^\w{5,25}$"

r.IgnoreCase = True

Set m = r.Execute(name)

If (len(m(0)) > 0) Then

Response.Write(Server.HTMLEncode(name))

End If

%>

Искупление греха в ASP. NET

Приведенный ниже код аналогичен предыдущему примеру, но для сопоставления с регулярным выражением и HTML–кодирования используется язык С# и библиотеки, входящие в каркас .NET Framework.

...

using System.Web; // Необходимо добавить ссылку на сборку System.Web.dll

...

private void btnSubmit_Click(object sender, System.EventArgs e)

{

Regex r = new Regex(@"^\w{5,25}");

if (r.Match(txtValue.Text).Success) {

Application.Lock;

Application.txtName.Text = txtValue.Text;

Application.UnLock;

lblName.Text = "Hello, " +

HttpUtility.HtmlEncode(txtName.Text);

} else {

lblName.Text = "Кто вы?";

}

}

Искупление греха в JSP

В JSP имеет смысл использовать нестандартный тег. Вот код тега, осуществляющего HTML–кодирование:

...

import java.IO.Exception;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

public class HtmlEncoderTag extends BodyTagSupport {

public HtmlEncoderTag {

super;

}

public int doAfterBody throws JspException {

if (bodyContent != null) {

System.out.println(bodyContent.getString);

String contents = bodyContent.getString;

String regExp = new String("^\\w{5,25}$");

// Сопоставить с регулярным выражением

if (contents.matches(regExp)) {

try {

bodyContent.getEnclosingWriter.write(contents);

} catch (IOException e) {

System.out.println("Ошибка ввода/вывода");

}

return EVAL_BODY_INCLUDE;

} else {

try {

bodyContent.getEnclosingWriter.write(encode(contents));

} catch (IOException e) {

System.out.println("Ошибка ввода/вывода");

}

System.out.println("Содержимое: " + contents.toString);

return EVAL_BODY_INCLUDE;

}

} else {

return EVAL_BODY_INCLUDE;

}

}

// В JSP нет функции для HTML-кодирования

public static String encode(String str) {

if (str == null)

return null;

StringBuffer s = new StringBuffer;

for (short i = 0; i < str.length; i++) {

char c = str.CharAt(i);

switch (c) {

case \'<\':

s.append("&lt;");

break;

case \'>\':

s.append("&gt;");

break;

case \'(\':

s.append("&#40;");

break;

case \')\':

s.append("&#41;");

break;

case \'#\':

s.append("&#35;");

break;

case \'&\':

s.append("&amp;");

break;

case \'"\':

s.append("&quot;");

break;

default:

s.append(c);

}

}

return s.toString;

}

}

Поделиться:
Популярные книги

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Последний попаданец 11. Финал. Часть 1

Зубов Константин
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1

Книга пяти колец

Зайцев Константин
1. Книга пяти колец
Фантастика:
фэнтези
6.00
рейтинг книги
Книга пяти колец

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Купидон с топором

Юнина Наталья
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Купидон с топором

Наследник в Зеркальной Маске

Тарс Элиан
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник в Зеркальной Маске

Совок 5

Агарев Вадим
5. Совок
Фантастика:
детективная фантастика
попаданцы
альтернативная история
6.20
рейтинг книги
Совок 5

Аномальный наследник. Том 1 и Том 2

Тарс Элиан
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Аномальный наследник. Том 1 и Том 2

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Гром над Империей. Часть 2

Машуков Тимур
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Гром над Империей. Часть 2

Ритуал для призыва профессора

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Ритуал для призыва профессора

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств