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

книги хакеры / Защита_от_взлома_сокеты,_эксплойты,_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

 

 

xch196

 

 

 

 

 

f-

 

an

 

 

 

 

 

 

 

 

 

 

 

 

197

 

 

198 /*

199

* check()

 

 

200

*

 

 

201

*

 

 

202

*/

 

 

203 bool check (

char

*hostname,

204

 

unsigned int

addr,

205

 

int

port,

206

 

VulnDBEntry *vdbe,

207

 

int

bufsize)

208{

209string::size_type posx;

210string cgidirs = "@CGIDIRS";

211string admdirs = "@ADMINDIRS";

212string req;

213string path;

214string t1 = "";

215

bool

docgi

= false;

216

bool

doadm

= false;

217

bool

ret

= false;

218

int

cnt

= 1;

219

int

idx

= 0;

220

 

 

 

221// есть ли подстрока @CGIDIRS?

222posx = vdbe->GetPath().find(cgidirs);

223if(posx != string::npos)

224{

225docgi = true;

226cnt = CGIDIRS_LEN;

227}

228else

229{

230// есть ли подстрока @ADMINDIRS?

231posx = vdbe->GetPath().find(admdirs);

232if(posx != string::npos)

233{

234doadm = true;

235cnt = ADMINDIRS_LEN;

236}

237}

238

239for(idx=0; idx < cnt; ++idx)

240{

241if(docgi)

242{

243if(posx > 0)

244{

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

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

 

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

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

e

 

t1 = vdbe->GetPath().substr(0, posx);

 

 

 

df-xchan

245

 

 

 

 

 

 

 

 

246

}

 

 

 

 

 

 

 

 

247

 

 

 

 

 

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

 

 

 

 

248path = t1 + CGIDIRS[idx] + vdbe->GetPath().substr(posx + cgidirs.length(), vdbe->GetPath().length() – cgidirs.length());

249}

250else if(doadm)

251{

252if(posx > 0)

253{

254t1 = vdbe->GetPath().substr(0, posx);

255}

256

257path = t1 + ADMINDIRS[idx] + vdbe->GetPath().substr(posx + admdirs.length(), vdbe->GetPath().length() – admdirs.length());

258}

259else

260{

261path = vdbe->GetPath();

262}

263

264// построить запрос по протоколу HTTP 1.0

265req = vdbe->GetMethod()

266+ " "

267+ path

268+ " HTTP/1.0\r\n\r\n";

269

270ret = doreq(hostname, addr, port, vdbe, bufsize, req);

271if(ret == true)

272{

273return(true);

274}

275}

276

277return(false);

278}

279

280 /*

281

* resolve()

 

282

*

 

283

*

 

284

*/

 

285 bool resolve (

char *hostname,

286unsigned int *addr)

287{

288struct hostent *he = NULL;

289

290*addr = inet_addr(hostname);

291if(*addr == INADDR_NONE)

 

 

 

 

 

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

 

 

xch292

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

293

294

295

296

297

298

299

300

301

302

303 }

304

{

he = gethostbyname(hostname); if(he == NULL)

{

return(false);

}

memcpy(addr, he->h_addr, he->h_length);

}

return(true);

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

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

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

305/*

306* usage()

307*

308*

309*/

310void usage ()

311{

312printf("Webserver Scanner by the Author's of Advanced Security Programming: Price, Foster, and Tommy \r\n");

313printf("We use CIRT's awesome and freely available VulnDB! \r\n\r\n");

314printf("Usage: sprebel.exe hostname <port> <0|1> <bufsize>\r\n");

315printf("<0> = Default, Minimal Output\r\n");

316printf("<1> = Verbose Output – show me the request and response buffer\r\n");

317}

318

319int

320main(int argc, char *argv[])

321{

322

unsigned int addr

= 0;

323

VulnDBEntry *vdbe

= NULL;

324

WSADATA

wsa;

 

325

VulnDB

vdb;

 

326

bool

ret

= false;

327

int

bufsize

= 0;

328

int

port

= 0;

329

int

pos

= 0;

330

int

x

= 0;

331

 

 

 

332memset(&wsa, 0x0, sizeof(WSADATA));

333if(WSAStartup(MAKEWORD(1,1), &wsa) != 0)

334{

335printf("\r\n*** ошибка %d WSAStartup() при инициализации WSA.\r\n", GetLastError());

336return(1);

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

337 }

 

 

 

 

 

 

 

 

338

 

 

 

 

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

 

 

 

 

339// обработать аргументы в командной строке

340if(argc < 3)

341{

342usage ();

343return(1);

344}

345

346ret = resolve(argv[1], &addr);

347if(ret != true)

348{

349printf("\r\n*** ошибка resolve() при разрешении имени хоста.\r\n");

350return(1);

351}

352

353port = DEF_PORT;

354if(argc >= 3)

355{

356port = atoi(argv[2]);

357}

358

359if(argc >=4)

360{

361output = atoi(argv[3]);

362}

363

364bufsize = BUF_SIZE;

365if(argc >= 5)

366{

367bufsize = atoi(argv[4]);

368}

369

370printf("хост/адрес: %s; порт: %d; выводить: %d; длина буфера: %d;\r\n", argv[1], port, output, bufsize);

371

372// загрузить базу данных об уязвимостях

373ret = vdb.Init(DB_FILENAME);

374if(ret == false)

375{

376printf("\r\n*** ошибка VulnDB.Init(%s) при инициализации базы данных об уязвимостях.\r\n", DB_FILENAME);

377return(1);

378}

379

380// проверить для каждой записи

381for(x=0; x < vdb.Size(); ++x)

382{

383vdbe = vdb.GetEntry(x);

 

 

 

 

 

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

 

 

xch384

 

 

 

 

 

 

f-

 

an

 

 

 

 

 

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402 }

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

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

 

to

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ret = check(argv[1], addr, port, vdbe, bufsize); if(ret == true && output == 1)

{

isvuln(argv[1], port, vdbe);

}

if(output == 1)

{

twiddle(pos, x, vdb.Size());

}

}

printf("\r\n СКАНИРОВАНИЕ ЗАВЕРШЕНО!\r\n");

WSACleanup();

return(0);

Анализ

В строках 12–17 включаются необходимые программе заголовочные файлы, в частности, описывающие функции работы с сокетами и класс для разбора базы данных VulnDB.

Âстроке 19 определена константа DB_FILENAME – имя файла, содержащего базу данных об уязвимостях. Поскольку мы пользуемся базой данных CIRT, то файл по умолчанию называется scan_database.db.

Âстроках 20–23 определены принимаемые по умолчанию значения параметров. Имя хоста – это единственный обязательный аргумент программы.

Âстроках 28–36 определен массив CGIDIRS. Константа CGIDIRS_LEN равна числу элементов в этом массиве, а каждый элемент – это строка, описывающая один из каталогов, где обычно хранятся CGI-программы. Представленный список минимален.

Âстроках 38–48 определен массив ADMINDIRS, описывающий каталоги, где обычно хранятся административные программы. Он устроен аналогич- но CGIDIRS.

Âстроках 55–73 определена функция twiddle(). Она печатает информацию

îсостоянии работы, зная индекс текущей записи в базе и общее количество записей. Тем самым пользователь может видеть, как продвигается дело, но только если программа запущена с флагом output, равным 1.

Âстроках 76–84 определена функция isvuln(). Она вызывается только в слу- чае обнаружения уязвимости на целевой машине и печатает номер порта

и описание уязвимости.

 

 

 

 

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

 

 

716 Глава 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

 

 

 

 

 

В строках 86–196 определена функция doreq(). Она отвечает за установление-x cha

 

 

 

 

 

соединения и передачу запроса со строкой атаки. В строках 98–156 происходит создание сокета и работа с ним. Подробнее о сокетах см. главу 3, а сейчас достаточно знать, что на stdout выводится сообщение, если при работе с сокетом произошла ошибка. Кроме того, в этом случае функция возвращает false.

После того как соединение установлено и тест проведен, полученный ответ анализируется на предмет наличия уязвимости. В строках 161–191 мы проверяем, получен ли ответ «200 OK» или указанный в сигнатуре атаки.

В строках 198–278 определена функция check(). Она смотрит, есть ли в пути, заданном в сигнатуре, указание на то, что нужно просматривать каталоги административных или CGI-программ. Если нет, то заданный путь без изменения добавляется к запросу, передаваемому doreq().

В строках 221–227 проверяется, есть ли в заданном пути подстрока @CGIDIRS. Если есть, поднимается флажок iscgi, и тогда в строках 239–275 тест выполняется для каждого из каталогов, перечисленных в массиве CGIDIRS, или пока не будет получен положительный результат. Аналогично обрабатывается подстрока @ADMINDIRS, åñëè @CGIDIRS отсутствует.

В строках 280–283 определена функция resolve(). Она определяет IP-адрес, соответствующий указанному в командной строке имени хоста. Если поиск завершился успешно, то функция возвращает true, а в параметр addr записывается найденный IP-адрес.

В строках 305–317 определена функция usage(). Она вызывается, если в командной строке задано недостаточное число аргументов, и просто печатает справку о порядке запуска.

В строке 320 начинается функция main(). Именно в ней реализована общая логика программы.

В строках 332 и 333 обнуляется структура WSADATA, а затем вызывается функция WSAStartup(), которая загружает и инициализирует библиотеку ws2.dll. Если инициализация завершилась с ошибкой, печатается сообщение и программа завершается с кодом 1.

В строках 339–370 обрабатываются переданные программе аргументы. В строке 340 проверяется их число. Если аргументов недостаточно, печатается справка о порядке вызова. В строке 346 имя хоста преобразуется в IP-адрес. В строке 353 обрабатывается номер порта; если он не задан, по умолчанию предполагается порт 80. Аналогично обрабатываются параметры, определяющие степень подробности вывода и размер буфера. Перед тем как продолжить, программа печатает параметры, с которыми будет работать.

В строке 373 внутренние структуры заполняются информацией, прочитанной из файла DB_FILENAME (по умолчанию scan_database.db).

В строках 380–395 в цикле для каждой описанной в базе уязвимости вызывается функция check(), которая проверяет ее наличие на целевой машине.

 

 

 

 

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

 

 

 

 

 

 

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

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

p

 

-x cha

 

 

 

 

 

 

 

-xchÅñëèa

check() вернула true и поднят флажок output, то вызывается функция

 

 

e

 

 

 

 

df

 

 

n

e

 

 

 

 

df

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

isvuln(), которая печатает информацию об уязвимости. Кроме того, вызывается функция twiddle(), печатающая сообщение о том, как далеко программа продвинулась.

Âстроке 397 программа извещает пользователя о завершении сканирования.

Âстроке 399 вызывается функция WSACleanup(), которая освобождает ресурсы, после чего программа выходит с кодом 0.

Разбор базы данных

Чтобы успешно разрабатывать хакерские программы, нужно хорошо понимать, какие действия необходимы для выполнения сканирования. В частности, в такой программе обязательно должны быть средства для разбора данных о сигнатурах уязвимостей. Мы реализовали такой механизм в классах

VulnDB è VulnDBEntry.

Класс VulnDB читает файл, удаляет лишние пробелы в начале и конце строки, пропускает строки, содержащие только комментарий, а оставшиеся передает для обработки классу VulnDBEntry.

1

/*

 

2

* VulnDB.cpp

 

3

*

 

4

*

 

5

*

 

6

*/

 

7

 

 

8

#include <windows.h>

 

9

#include <stdio.h>

 

10

#include "VulnDB.h"

 

11

 

 

12

#define VULNDB_BUF_SIZE

0x0400

13

#define VULNDB_COMMENT

'#'

14

 

 

15/*

16* strtrim()

17*

18*

19*/

20static

21char *strtrim(char *sin, char *sout)

22{

23int len = 0;

24int idxl = 0;

25int idxt = 0;

26

27 len = strlen(sin);

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

28 sout[0] = '\0';

 

 

 

 

 

 

 

 

29

30if(len <= 0)

31{

32return(sout);

33}

34

35// начальные

36for(idxl=0; idxl < len; ++idxl)

37{

38if(sin[idxl] != ' ' &&

39sin[idxl] != '\t' &&

40sin[idxl] != '\r' &&

41sin[idxl] != '\n')

42{

43break;

44}

45}

46

47// хвостовые

48for(idxt=len – 1; idxt >= 0; —idxt)

49{

50if(sin[idxt] != ' ' &&

51sin[idxt] != '\t' &&

52sin[idxt] != '\r' &&

53sin[idxt] != '\n')

54{

55break;

56}

57}

58

59// только пробелы

60if(idxl == len)

61{

62return(sout);

63}

64

65// копировать

66len = idxt – idxl + 1;

67strncpy(sout, sin + idxl, len);

68sout[len] = '\0';

69

70return(sout);

71}

72

73/*

74* VulnDB()

75*

76*

 

 

 

 

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

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

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

719

 

to

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w Click

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

 

 

 

 

e

 

 

 

 

 

df-x chan

e

 

 

 

 

df-xchan77 */

 

 

 

 

 

 

 

 

78

VulnDB::VulnDB()

79

{

80

}

81

 

82/*

83* ~VulnDB()

84*

85*

86*/

87VulnDB::~VulnDB()

88{

89VulnDBEntry *vde = NULL;

90

int

idx = 0;

91

 

 

92for(idx=0; idx < m_vec.size(); ++idx)

93{

94

vde

= m_vec[idx];

95delete vde;

96m_vec[idx] = NULL;

97}

98

99m_vec.clear();

100}

101

102/*

103* Init()

104*

105*

106*/

107bool VulnDB::Init(string filename)

108{

109VulnDBEntry *vdbe = NULL;

110

FILE

*fptr = NULL;

111

char

tmp[VULNDB_BUF_SIZE];

112

char

buf[VULNDB_BUF_SIZE];

113

bool

ret = 0;

114

 

 

115fptr = fopen(filename.c_str(), "r");

116if(fptr == NULL)

117{

118return(false);

119}

120

121// для каждой строке в файле, кроме комментариев:

122// разобрать

123// сохранить в списке узлов

124// сохранить в списке

125

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

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

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

m

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

e

 

 

 

 

df-xchan

126 int x =0;

 

 

 

 

 

 

 

 

127

128while(fgets(tmp, VULNDB_BUF_SIZE, fptr) != NULL)

129{

130strtrim(tmp, buf);

131

132

if(strlen(buf)

==

0 ||

133

buf[0]

==

VULNDB_COMMENT)

134{

135continue;

136}

137

138vdbe = new VulnDBEntry();

139if(vdbe == NULL)

140{

141fclose(fptr );

142return(false);

143}

144

145ret = vdbe->Init(buf);

146if(ret != true)

147{

148fclose(fptr);

149return(false);

150}

151

152m_vec.push_back(vdbe);

153}

154

155 fclose(fptr);

156

157return(true);

158}

159

160/*

161* Size()

162*

163*

164*/

165int VulnDB::Size()

166{

167return(m_vec.size());

168}

169

170/*

171* GetEntry()

172*

173*

174*/

175VulnDBEntry *VulnDB::GetEntry(int idx)

 

 

 

 

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