Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_shell_код_Фостер_Дж_

.pdf
Скачиваний:
14
Добавлен:
19.04.2024
Размер:
3.68 Mб
Скачать

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

 

i

r

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

 

 

e

 

{

 

 

 

d

 

 

xch176

 

 

 

 

 

f-

 

an

 

 

 

 

 

177 VulnDBEntry *vde = NULL;

178

179 if(idx < 0 ||

180idx > (m_vec.size() – 1))

181{

182return(NULL);

183}

184

185 vde = m_vec[idx];

186

187return(vde);

188}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Углубленный анализ 721

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Анализ

В строках 15–71 определена свободная (не являющаяся членом класса) функция strtrim(). Она удаляет из строки начальные и хвостовые пробелы. В строках 27 и 28 создается новая пустая строка, в нее копируется все нужное, и результат возвращается вызывающей программе.

Âстроках 36–45 мы ищем индекс первого непустого символа в исходной строке, а в строках 48–57 – индекс последнего непустого символа. Если первый индекс указывает на конец строки, то функция вернет пустую строку.

Âстроках 65–70 содержимое исходной строки, за исключением начальных

èхвостовых пробелов, копируется в новую строку.

Âстроках 73–80 определен конструктор класса VulnDB по умолчанию. При его вызове должны быть инициализированы члены класса, являющиеся указателями на динамически выделяемую память, иначе возможны ошибки. Такое случается в более сложных программах, но мы этой темы касаться не будем. Обратите также внимание на то, что оператор присваивания в этом классе не реализован. Поскольку мы собираемся работать только с одной базой данных, то он нам не нужен. Если бы в программе использовалось несколько баз данных, такой оператор следовало бы реализовать. О назначе- нии конструкторов, операторов присваивания и деструкторов вы можете узнать из любой книги по языку C++.

Âстроках 82–100 определен деструктор. Он обходит вектор и удаляет из него все элементы, чтобы избежать утечек памяти, которая произойдет, если при уничтожении объекта не освободить всю выделенную для него динами- ческую память.

Âстроках 102–158 реализовано самое важное в классе VulnDB – логика разбора данных об уязвимостях.

Âстроке 115 файл открывается, и его дескриптор сохраняется в переменной fptr. Затем в цикле, начинающемся в строке 128, последовательно чита-

ются строки из файла.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

 

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

722 Глава 14. Создание инструмента для проверки уязвимости Web приложения

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

 

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

В строке 130 вызывается функция strtrim() для удаления начальных и хвос--x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

товых пробелов из только что прочитанной строки. Если строка оказывается

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

комментарием (строки 132 и 133), то на этом ее обработка заканчивается,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

и мы переходим к следующей строке.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В строке 138 создается новый объект класса VulnDBEntry, которому прочи-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

танная строка с удаленными пробелами передается для разбора. Когда строка

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

будет разобрана, объект помещается в вектор m_vuln, и мы переходим к сле-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

дующей итерации цикла чтения строк.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Если при чтении не произошло ошибок, файл закрывается, и функция

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

инициализации возвращает true.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В строках 161–168 определен метод Size(). Он возвращает размер вектор

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объектов VulnDBEntry.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В строках 175–188 определен метод GetEntry(). Он возвращает указатель на

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объект VulnDBEntry, находящийся в векторе m_vuln по индексу idx, ïðè óñëî-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

вии, что индекс не выходит за пределы вектора.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

В результате разбора строки в классе VulnDBEntry заполняются члены Path,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Result, Method и Description, которые в дальнейшем будут использоваться для

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

получения доступа к данным об уязвимости.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 /*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

* VulnDBEntry.cpp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8 #include <stdio.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9 #include "VulnDBEntry.h"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

10

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11 #define VDBE_FIELD_TYPE

0x0000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

12 #define VDBE_FIELD_PATH

0x0001

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

13 #define VDBE_FIELD_RES

0x0002

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

14 #define VDBE_FIELD_METH

0x0003

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

15 #define VDBE_FIELD_DESC

0x0004

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

17/*

18* VulnDBEntry()

19*

20*

21*/

22VulnDBEntry::VulnDBEntry()

23{

24}

25

26 /*

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

 

t

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

i

 

 

D

 

 

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

 

 

NOW!

o

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

Углубленный анализ

723

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

 

 

e

 

* ~VulnDBEntry()

 

 

p

 

 

 

x cha

 

e

 

 

 

 

d

 

 

xch27

 

 

 

 

 

d

 

 

g

 

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

 

 

 

f-

 

 

n

 

 

 

 

 

 

 

 

 

 

 

28

 

 

*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

29

 

 

*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

30

 

 

*/

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

31

 

VulnDBEntry::~VulnDBEntry()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

32

 

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

33

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

34

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

35/*

36* Init()

37*

38*

39*/

40

41

// состояния разбора

 

42

#define VDBE_BEGTOK

0x0001

43

#define VDBE_INTOK

0x0002

44

#define VDBE_ENDTOK

0x0003

45

#define VDBE_NXTTOK

0x0004

46

#define VDBE_ESC

0x0005

47

48 bool VulnDBEntry::Init(char *entry)

49{

50string tmp;

51

char

ch

= 0;

 

52

int

st

= 0;

 

53

int

cnt = 0;

 

54

int

len = 0;

 

55

int

idx = 0;

 

56

 

 

 

 

57

// формат

 

 

58

// #type #path

#tok #meth #desc

59

// "iis","/_vti_bin/_vti_cnf/","200","GET","frontpage, \"directory

 

found."

 

 

60

 

 

 

 

61if(entry == NULL)

62{

63return(false);

64}

65

66 len = strlen(entry);

67

68if(len <= 0)

69{

70return(false);

71}

72

73 st = VDBE_BEGTOK;

74

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

724 Глава 14. Создание инструмента для проверки уязвимости Web приложения

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

75

 

 

 

 

df-xchan

e

while(idx < len)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

76

{

 

 

 

 

 

 

 

 

 

 

 

77

ch = entry[idx];

 

 

 

 

 

 

 

 

 

 

 

78

 

79switch(st)

80{

81case VDBE_BEGTOK:

83

++idx;

84

 

85// начальные пробелы допустимы

86if(ch == ' ' ||

87ch == '\t' ||

88ch == '\n' ||

89ch == '\r')

90{

91break;

92}

93

94// начало поля

95if(ch == '\"')

96{

97// открывающая "

98st = VDBE_INTOK;

99break;

100}

101

102// недопустимый символ

103return(false);

104

105 break;

106

107 case VDBE_INTOK:

108

109// закрывающая " (не включать idx)

110if(ch == '\"')

111{

112st = VDBE_ENDTOK;

113break;

114}

115

116 ++idx;

117

118// escape-символ

119if(ch == '\\')

120{

121st = VDBE_ESC;

122break;

123}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

 

 

i

r

P

 

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

 

 

e

 

 

 

 

 

d

 

 

xch124

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Углубленный анализ 725

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

// сохранить символ tmp += ch;

break;

case VDBE_ENDTOK:

//не включать idx

//сохранить значение m_str[cnt] = tmp;

tmp

= "" ;

//все поля разобраны ++cnt;

if(cnt == VDBE_FIELD_CNT)

{

return(true);

}

//перейти к следующему полю st = VDBE_NXTTOK;

break;

case VDBE_ESC:

// обработать имена дисков в формате DOS //("c:\")

if(entry[idx – 2] == ':')

{

if(entry[idx] == '\\')

{

++idx;

tmp += '\\';

st = VDBE_INTOK; break;

}

else if(entry[idx] == '\"')

{

++idx; if(idx < len)

{

if(entry[idx] == ',')

{

tmp += '\\';

st = VDBE_ENDTOK;

}

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

726 Глава 14. Создание инструмента для проверки уязвимости Web приложения

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

else

 

 

 

df-xchan

173

 

 

 

 

 

 

 

 

174

{

 

 

 

 

 

 

 

 

175

tmp += '\"';

 

 

 

 

 

 

 

 

176

st = VDBE_INTOK;

 

 

 

 

 

 

 

 

177

}

 

 

 

 

 

 

 

 

178

}

 

 

 

 

 

 

 

 

179

 

180break;

181}

182else

183{

184tmp += '\\';

185}

186}

187

188tmp += ch;

189st = VDBE_INTOK;

190++idx;

191

192

break;

193

 

194

case VDBE_NXTTOK:

195

 

196

++idx;

197

 

198if(ch == ',')

199{

200st = VDBE_BEGTOK;

201}

202

203break;

204}

205}

206

207 printf("\r\n*** ОШИБКА ПРИ РАЗБОРЕ: %s\r\n\r\n", entry);

208

209return(false);

210}

211

212/*

213* GetType()

214*

215*

216*/

217string VulnDBEntry::GetType()

218{

219return(m_str[VDBE_FIELD_TYPE]);

220}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

r

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

e

 

 

 

 

 

d

f-xch221an

 

 

 

 

 

 

 

 

 

g

 

 

 

 

222/*

223* GetPath()

224*

225*

226*/

227string VulnDBEntry::GetPath()

228{

229return(m_str[VDBE_FIELD_PATH]);

230}

231

232/*

233* GetResult()

234*

235*

236*/

237string VulnDBEntry::GetResult()

238{

239return(m_str[VDBE_FIELD_RES ]);

240}

241

242/*

243* GetMethod()

244*

245*

246*/

247string VulnDBEntry::GetMethod()

248{

249return(m_str[VDBE_FIELD_METH]);

250}

251

252/*

253* GetDesc()

254*

255*

256*/

257string VulnDBEntry::GetDesc()

258{

259return(m_str[VDBE_FIELD_DESC]);

260}

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Углубленный анализ 727

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Анализ

Âстроках 11–15 определены константы, описывающие состояние разбора.

Âстроках 17–33 определены конструктор и деструктор. Оба ничего не делают, так к классе VulnDBEntry, в отличие от VulnDB, нет членов данных, па-

мять для которых выделяется динамически.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

i

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

t

 

P

D

 

 

 

 

 

 

 

 

o

 

P

D

 

 

 

 

 

 

 

 

o

 

 

 

 

NOW!

r

 

 

 

 

 

NOW!

r

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

728 Глава 14. Создание инструмента для проверки уязвимости Web приложения

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

o

 

w Click

 

 

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

df

 

 

 

 

e

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

В строках 35–210 определена функция Init(). Как и одноименная функция-x cha

 

 

 

 

 

в классе VulnDB, она и выполняет собственно анализ и разбор сигнатуры. Чтобы понять, как работает анализатор, важно проследить за использовани-

ем локальных переменных. В строке tmp хранится текущее анализируемое поле. Переменная st содержит текущее состояние разбора. Она используется в предложении switch в строке 79. Переменная cnt – это счетчик уже обработанных полей. Как только счетчик достигает значения VDBE_FIELD_COUNT (5), функция возвращает true в знак успешного завершения работы. В переменной len хранится длина переданной на вход строки, а в переменной idx – текущая позиция в ней.

В строках 61–71 отбрасываются пустые строки, для которых функция возвращает false.

В строке 73 процедура разбора находится в начальном состоянии, поэтому в переменную st заносится значение VDBE_BEGTOK.

В строке 75 начинается цикл while, который будет выполняться, пока индекс idx меньше длины строки. В начале цикла в переменную ch копируется символ, находящийся в позиции entry[idx].

В строке 79 начинается переключатель switch, состоящий из пяти ветвей, которые соответствуют возможным состояниям разбора.

VDBE_BEGTOK (начало поля):

1.В строке 83 индекс увеличивается и указывает на следующий символ в строке.

2.Поскольку каждое поле начинается и заканчивается символом двойной кавычки, то в этом состоянии мы пропускаем все пустые символы, пока не встретится открывающая кавычка (строка 95). Если вдруг будет прочитан непустой символ, отличный от кавычки, то функция вернет false, индицируя ошибку при разборе.

3.Когда символ кавычки будет найден, устанавливается состояние VDBE_INTOK (строка 98).

VDBE_BEGTOK (внутри поля):

4.Если в этом состоянии будет обнаружена двойная кавычка, процедура разбора переходит в состояние VDBE_ENDTOK (строка 112), и мы возвращаемся в начало цикла.

5.В строке 116 индекс увеличивается на единицу, то есть мы переходим к следующему символу.

6.Если обнаружен символ экранирования ‘\’, то устанавливается состояние VDBE_ESC, и мы возвращаемся в начало цикла.

7.В противном случае прочитан обычный символ (строка 126), который можно добавить в строку tmp. Затем цикл продолжается, все

еще оставаясь в состоянии INTOK.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

VDBE_ENDTOK (конец поля):

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

Углубленный анализ 729

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

8.В строке 135 значение текущего поля копируется из строки tmp в очередной элемент массива m_str. Затем строка tmp очищается, а счетчик полей увеличивается на 1.

9.В строке 140, если счетчик стал равен числу полей (VDBE_FIELD_CNT), то разбор считается успешным, и функция возвращает true.

10.В противном случае устанавливается состояние VDBE_ENDTOK, и цикл продолжается.

VDBE_ESC (обработка escape-последовательности):

11.В строке 154, если найден символ ‘\’, то проверяется, что предшествующий ему – не двоеточие. Иначе придется обработать случай, когда в строке встретилось обозначение диска, принятое в DOS.

12.В строке 156, если выяснилось, что текущий символ в переменной ch – это часть имени диска, то в путь добавляется символ ‘\’, а процедура разбора переходит в состояние VDBE_INTOK. Затем разбор продолжается обычным образом.

13.В строке 163, если после “:\” идет двойная кавычка, а потом запятая, то в строку tmp добавляется символ ‘\’ и состояние устанавливается в VDBE_ENDTOK. Иначе (строка 173) в tmp заносится двойная кавычка, а в st – VDBE_INTOK. Если же после двоеточия нет ни ‘\’, ни двойной кавычки, то в tmp добавляется сначала символ ‘\’, а за ним – текущий символ из ch. Процедура разбора переходит в состояние VDBE_INTOK, индекс увеличивается на 1 и разбор продолжается.

VDBE_NXTTOK (следующее поле):

14.В строке 196 мы увеличиваем индекс, пока не встретится запятая. После этого устанавливается состояние VDBE_NXTTOK, и разбор продолжается.

15.В строке 207, если цикл завершается раньше, чем обработаны все ожидаемые поля, функция возвращает false.

16.В строках 212–260 определены методы доступа к членам класса, инициализированным в функции Init(). Методы называются GetType() (строка217),GetPath()(строка227), GetResult()(строка237),GetMethod() (строка 247) и GetDesc() (строка 257).

Объявления классов, их членов-данных и методов собраны в заголовочных файлах. Каждый такой файл начинается со строки, аналогичной строке 8 в файле VulnDB.h. Она предотвращает повторное включение файла.

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

730 Глава 14. Создание инструмента для проверки уязвимости Web приложения

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df

 

 

n

 

Заголовочные файлы

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

В файле VulnDB.h объявлен класс VulnDB. Все его методы были подробно рассмотрены выше. В классе есть один закрытый член данных vector<VulnDBEntry*> m_vec. В нем хранятся объекты класса VulnDBEntry, число которых заранее неизвестно.

1 /*

2 * VulnDB.h

3 *

4 *

5 *

6 */

7

8 #if !defined(__VULNDB_H__)

9 #define __VULNDB_H__

10

11 #include <vector>

12 using std::vector;

13

14 #include "VulnDBEntry.h"

15

16/*

17*

18* VULNDB CLASS

19*

20*/

21class VulnDB

22{

23public:

24

25/*

26* VulnDB()

27*

28*

29*/

30VulnDB();

32/*

33* ~VulnDB()

34*

35*

36*/

37~VulnDB();

39/*

40* Init()

41*