Несоответствие сценариев требованиям безопасности: взлом при отсутствии проверки ввода
Причиной взлома при отсутствии проверки ввода с использованием общего интерфейса шлюза (CGI – Common Gateway Interface), активных страниц сервера (ASP – Active Server Pages) и языка разметки CFML (Cold Fusion Markup Language), является промах либо разработчика, либо поставщика программного обеспечения. Основная проблема возникает из-за недостаточной обработки входных данных некоторого сценария. Если не позаботиться о проверке достоверности и последующей очистке входных данных, взломщик сможет передать сценарию нужный символ, скажем, локальную команду, в качестве параметра и таким образом локально запустить эту команду на Web-сервере.
Изъян MDAC RDS IIS 4.0
Вскоре после того, как компания Microsoft справилась с проблемой, вызванной программой iishack, работа которой приводила к переполнению буфера сервера IIS (это произошло в июне 1999 года), в июле ей пришлось столкнуться с другой проблемой, связанной с Web-сервером. Данная проблема была описана в бюллетене компании Microsoft, посвященном вопросам безопасности, еще в 1998 году, но стала известна широкой общественности лишь в последнее время. Этот изъян возникает из-за недостатка одного из компонентов Microsoft доступа к данным (MDAC – Microsoft Data Access Components) службы RDS (Remote Data Service), который позволяет взломщику запускать любые команды на уязвимом сервере.
Первопричина проблемы заключается в объекте DataFactory службы RDS. По умолчанию он позволяет передавать удаленные команды серверу IIS. В этом случае команды запускаются с правами эффективного пользователя этой службы, которым обычно является пользователь SYSTEM (внутренний пользователь, обладающий привилегиями администратора). Это означает, что взломщик может получить удаленный доступ с правами администратора к любому серверу в мире', у которого имеется такой изъян.
Для проверки этой концепции компания Rain.forest.puppy разработала свой сценарий на языке Perl (его можно загрузить с Web-узла компании Security Focus http://vww.securityfocus.com), посылающий запрос RDS в базу данных, которая служит в качестве образца и называется btcustmr.mdb. Целью запроса является запуск на сервере команды, вводимой пользователем.
Поиск уязвимых серверов в сети представляется простой задачей. Посмотрим, как можно обнаружить компоненты MDAC службы RDS. С помощью утилиты netcat и языка Perl можно просканировать подсети в поисках признаков уязвимого сервера – наличия динамически подключаемой библиотеки msadcs.dll. Если в результате обработки HTML-запроса будет получена строка appiication/x-varg, значит, высока вероятность того (хотя и не на 100%), что данная система уязвима. Ниже для примера приведен код на языке Perl, с помощью которого можно обнаружить данный изъян.
#!/usr/bin/perl if ($|ARGV < 0) { print "Ошибка в синтаксиме – попробуйте eщe раз."; print ": mdac.pl 10.1.2.3-255";} doit($ARGV[0]); foreach $item (@hosts) { portscan($item); } close OUTFILE; sub doit { $line = $_[0]; if ($line!=/#/) { if ($line=~/-/) { Stmp = split/-/, $line; Ship = split//, $tmp[0]; @eip = split//, $tmp[lj; } else { @bip = split//, $line; @eip = split//, $line; } $al = $bip[0]; $bl = $bip[l]; $cl = $bip[2]; $dl = $bip[3]; Snum = @eip; if ($num==l) { $a2 = $bip[0] $b2 = $bip[l] $c2 = $bip[2] $d2 = $eip[0] } elsif ($num==2) {$a2 = $bip[0] $b2 = $bip[l] $c2 = $eip[0] $d2 = $eip[l] } elsif ($num==3) { $a2 = $bip[0] $b2 = $eip[0] $c2 = $eip[l] $d2 = $eip[2] } elsif ($num==) { $a2 = $eip[0] $b2 '-= $eip[l] $c2 = $eip[2] $d2 = $eip[3] }