В этой гла& 424f58e #1074;е:
MS DOS
UNIX
и . Это справедливо для большинства консольных приложений MS DOS Windows x Windows NT
UNIX
copy MS DOS MS DOS con
copy con myfile
Hello, World!
^Z
copy myfile con
Hello, World!
Начинающим, вероятно, следует пояснить - символ <Ctrl Z> указывает программе на завершение ввода и конец файла. В самом файле он отсутствует.
SRC/io.c
#include <stdio.h>
int main(int argc, char *argv[])
return 0;
ASCII
io.exe con con
Hello, Sailor!
0x48
0x65
0x6C
0x6C
0x6F
0x2C
0x20
0x53
0x61
0x69
0x6C
0x6F
0x72
0x21
0xA
con con .
В стандартной библиотеке языка Си для этой цели используются файловые манипуляторы stdin и stdout, связанные со стандартными устройствами ввода и вывода соответственно. Модернизированный вариант программы может выглядеть так (на диске он находится под именем "/SRC/iostd.c
#include <stdio.h>
int main(int argc, char *argv[])
return 0;
Но как в этом случае заставить программу выводить результаты работы в файл, а не терминал? Стандартный ввод-вывод выгодно отличается возможностью направить его куда угодно, указав в командной строке специальный символ ">" для вывода и "<" для ввода.
Например, используем ранее созданный файл myfile и выведем результат работы iostd в файл "out txt
iostd.exe <myfile >out.txt
copy out.txt con
0x48
0x65
0x6C
0x6C
0x6F
0x2C
0x20
0x53
0x61
0x69
0x6C
0x6F
0x72
0x21
0xA
/SRC/iohack.c UNIX
#include <stdio.h>
main()
запрашиваемого файла! Например
iohack.exe
$Hello!
Hello!
iohack.exe
$<myfile
Hello, Sailor!
.
UNIX, встретив конструкцию "</etc/passwd" выдаст на экран содержимое файла паролей, или любого другого файла который будет запрошен. С первого взгляда ничего страшного в этом нет, - программа наследует все привилегии пользователя и получает доступ к тем, , файлам, которые пользователь мог бы просмотреть и без помощи этой программы, скажем, командой "cat
UNIX SendMail
SendMail не одинок, и подобные ошибки допущены во множестве приложений, щедро разбросанных по серверам. Часто для их поиска даже не требуется кропотливого изучения исходных текстов программы - достаточно во всех вводимых строках (или полях заголовка) подставить символ "<" и посмотреть на реакцию программы - нет-нет, да повезет!
ls sort ls' (или dir в MS DOS temp sort r
ls >temp
$ sort -r <temp
temp
sioux.pl
passwd
iohack.o
iohack.c
index_hack.htm
demos.txt
bomb.pl
attack2.htm
или труба (от английского pipe
". Разумеется, стандартный ввод первой программы в цепочке и стандартный вывод последней могут быть перенаправлены с помощью символов "<" и ">" соответственно (результат попытки перенаправления остальных непредсказуем, и обычно разрывает цепочку конвейера).
FIFO First Input First Output
$ ls | sort -r
sioux.pl
passwd
iohack.o
iohack.c
index_hack.htm
demos.txt
bomb.pl
attack2.htm
UNIX MS DOS
dir /b | sort /r
sioux.pl
passwd
iohack.o
iohack.c
index_hack.htm
demos.txt
bomb.pl
attack2.htm
MS DOS
UNIX yes y
UNIX y yes MS DOS yes yes
SRC/pipe.hack.pl
open(FH,<>);
if (FH)
ls|
sioux.pl
passwd
iohack.o
iohack.c
index_hack.htm
demos.txt
bomb.pl
open Perl негла& 424f58e #1089;но поддерживает конвейер! Вместо открытия файла происходит его запуск! Вряд ли стоит объяснять, какие последствия вытекают из этого! Так, одна из версий SendMail позволяла в качестве обратного адреса отправителя письма подставить строчку "|/usr/bin/sh" и оболочка действительно запускалась, предоставив атакующему привилегированный доступ в систему (от имени демона).
код . Аналогично перенаправлению ввода-вывода, конвейерные дырки могут быть обнаружены не только тщательным изучением исходных тестов приложений, но и простой подстановкой знака "|" во все доступные строки ввода и поля заголовков. Не так уж и редко это срабатывает.
UNIX Windows x Windows NT pipe hack pl Windows
dir |
Том в устройстве F не имеет метки
Серийный номер тома: 2F42-0AE8
Содержимое папки F:\TPNA\src
<ПАПКА> 28.06.00 23:14 .
<ПАПКА> 28.06.00 23:14 ..
IO C 294 06.07.00 10:29 io.c
IO OBJ 775 06.07.00 10:18 io.obj
IO EXE 32 768 06.07.00 10:18 io.exe
IOSTD C 228 06.07.00 10:30 iostd.c
IOSTD OBJ 627 06.07.00 10:26 iostd.obj
IOSTD EXE 32 768 06.07.00 10:26 iostd.exe
MYFILE 16 06.07.00 10:53 myfile
OUT TXT 89 06.07.00 10:53 out.txt
IOHACK C 295 06.07.00 15:18 iohack.c
IOHACK OBJ 827 06.07.00 14:58 iohack.obj
IOHACK EXE 32 768 06.07.00 14:58 iohack.exe
PIPEHA~1 PL 65 06.07.00 22:29 pipe.hack.pl
12 файлов 101 520 байт
1 710 641 152 байт свободно
Методы противодействия и защиты от подобных ошибок будут описаны в гла& 424f58e #1074;е «Атака на WEB-сервер», а ниже будет объяснено почему символ конвейера появляется то слева от команды (как в примере с "|/usr/bin/sh"), то справа ("dir |"). Вообще-то «классический» конвейер состоит минимум из двух программ, и вывод первой из них попадает на ввод второй. То есть конструкцию "program 1 | program 2" можно изобразить как "stdin program 1 program 2 stdout". А в случае, когда используется всего лишь одна программа, вывод программы, стоящей до символа конвейера, перенаправляется в открываемый функцией "open
/SRC/pipe.test.pl
open(FH,<>);
if (FH)
x
echo Hello, Sailor |
Этот текст прочитан из файла:Hello, Sailor
|echo Hello, Sailor!
Hello, Sailor!
echo open манипулятор, откуда он может читается оператором "<>" и выводится на экран вызовом "printf
echo print
И так-то славно дело пошло! Я сижу на мачте верхом, кручу бочку одной рукой, другой снимаю с конвейера готовую продукцию, передаю Фуксу, тот Лому, а Лом считает, записывает и выпускает на берег. Часа за три весь остров заселили.
|