<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Athlan • Piotr Pelczar • blog programisty &#187; Security</title>
	<atom:link href="http://athlan.pl/kategoria/security/feed/" rel="self" type="application/rss+xml" />
	<link>http://athlan.pl</link>
	<description>Napisać kod zrozumiały dla komputera potrafi byle głupek. Dobrzy programiści tworzą kod zrozumiały dla człowieka...</description>
	<lastBuildDate>Tue, 14 Feb 2012 14:33:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Atak XSS na $_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;]</title>
		<link>http://athlan.pl/atak-xss-server-http-x-forwarded-for/</link>
		<comments>http://athlan.pl/atak-xss-server-http-x-forwarded-for/#comments</comments>
		<pubDate>Sat, 28 May 2011 12:40:13 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=706</guid>
		<description><![CDATA[Dziś bardzo krótko, bez zbędnych dywagacji, czyli tylko i wyłącznie o tablicy $_SERVER. Dbając o bezpieczeństwo aplikacji webowych zwraca się uwagę na wiele czynników, jakimi są SQL injections, przechwytywanie nieprawidłowych parametrów, uogólniające zapytania przepuszczające maskę % w LIKE zapytaniu do baz, XSS&#8216;y w $_POST, $_GET. I finalnie&#8230; wiele osób zapomina (a jeszcze więcej nie jest [...]]]></description>
			<content:encoded><![CDATA[<p>Dziś bardzo krótko, bez zbędnych dywagacji, czyli tylko i wyłącznie o tablicy <code>$_SERVER</code>. Dbając o bezpieczeństwo aplikacji webowych zwraca się uwagę na wiele czynników, jakimi są <em>SQL injections</em>, przechwytywanie nieprawidłowych parametrów, uogólniające zapytania przepuszczające maskę % w <em>LIKE</em> zapytaniu do baz, <em><acronym title="Cross-site scripting">XSS</acronym></em>&#8216;y w <code>$_POST</code>, <code>$_GET</code>.</p>
<p>I finalnie&#8230; wiele osób zapomina (<u>a jeszcze więcej nie jest tego świadom</u>) o możliwości wstrzyknięcia szkodliwych danych w <code>$_SERVER['HTTP_X_FORWARDED_FOR']</code>;. <u>Konsekwencje są oczywiście katastrofalne</u>.</p>
<p>O ile sama walidacja jest rzeczą wtórną, diabeł tkwi w trzech szczegółach:</p>
<ol>
<li>Rzecz trywialna, ale pamiętajmy, że w naturalnym procesie użytkowania przeglądarki, <strong>w nagłówku może zostać zwrócony nie tylko jeden adres IP</strong>, a kilka oddzielonych przecinkiem, w tym <em>localhost</em>&#8216;y (<a rel="nofollow" href="http://en.wikipedia.org/wiki/X-Forwarded-For">standard nagłówka <code>X-Forwarded-For</code></a>).</li>
<li><strong>Wstrzyknięcie Javascriptów</strong> jest możliwe, ale notabene najmniej szkodliwe, bo do spreparowania nagłówka potrzebny jest bardziej zaawansowany proces (dajmy na to Data Tamping, który przedstawię poniżej), np. niż wklejenie syfu w linku/obrazku i przesłanie go komuś przez komunikator, żeby wykraść jego ciasteczka sesyjne <code>document.cookie</code> i przesłać je sobie na serwer w dowolny sposób, <strong>zatem atakowi nie ulegną osoby trzecie</strong>.</li>
<li><strong>Niepoprawność danych</strong>, które można zmanipulować, jest chyba rzeczą oczywistą: nieprzepuszczenie takich danych przez filtry może skutkować złymi wartościami zwracanymi np. przez <code><a href="http://php.net/ip2long">ip2long()</a></code> i zapis w zupełności nieprzydatnych nam później danych do bazy.</li>
<li>&#8230; <strong>ale największe nieprzyjemności</strong> możemy mieć przez spreparowanie lewych zapytań do baz danych, o ile nie używamy sprawdzonych ORM lub czegokolwiek, co pomaga nam filtrować wartości do niej przekazywane i używane w warunkach zapytań (data binding).</li>
</ol>
<p>Przykład tampingu danych, żeby spreparować niepożądane efekty.</p>
<p>Mamy bardzo prosty, niebezpieczny kod funkcji, która pobiera pierwszy adres na liście adresów oddzielonych przecinkami z <code>$_SERVER['HTTP_X_FORWARDED_FOR']</code> o ile istnieje, natomiast w przeciwnym wypadku <code>$_SERVER['REMOTE_ADDR']</code>:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;</span> ?php
&nbsp;
<span style="color: #000000; font-weight: bold;">function</span> getUserIp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_X_FORWARDED_FOR'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">current</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_X_FORWARDED_FOR'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #b1b100;">return</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'REMOTE_ADDR'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000088;">$sUserIP</span> <span style="color: #339933;">=</span> getUserIp<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Hi &quot;'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$sUserIP</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'&quot;!'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// first bug while display.</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">ip2long</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sUserIP</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// second bug while transforming data.</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p><strong>Pora na przykład manipulacji takich danych.</strong></p>
<ul>
<li>Będziemy używać <a href="https://addons.mozilla.org/en-us/firefox/addon/tamper-data/">Tamper Data</a> dla Firefox&#8217;a.<br />Dość popularny wśród developerów addon do Firefox&#8217;a, pozwala zmodyfikować dane <code>$_POST</code>, <code>$_GET</code>, <code>$_COOKIE</code>, nagłówki, &#8220;w locie żądania&#8221; etc.</li>
<li>Po instalacji w menu <em>Narzędzia</em> pojawi się pozycja <em>Dane Tamper</em>, która uruchamia okienko do podsłuchiwania żądań. Po kliknięciu <em>Rozpocznij</em> podsłuchujemy wszystkie wychodzące żądania z naszej przeglądarki. Każde żądanie nie zostanie przepuszczone, dopóki go nie zmanipulujemy klikając <em>Tamper</em>, lub przepuścimy dalej klikając <em>Wyślij</em>.</li>
<li>Jeżeli zdecydujemy się Tamper&#8217;ować żądanie, naszym oczom ukaże się okno z parametrami. Klikamy prawym przyciskiem myszy na listę parametrów, wybieramy Dodaj i wpisujemy nasz przykładowy, brzydki dla aplikacji nagłówek:<br />
<code>X_FORWARDED_FOR=&lt;script&gt;alert('Test.')&lt;/script&gt;</code></li>
</ul>
<p>Naszym oczom ukazują się co najmniej dwa błędy. Pierwszy to błąd prezentacji danych, który wykorzystuje <code>&lt;script&gt;</code>. O ile nie musimy się tym przejmować, bo naturalnie takie żądania nie są tak łatwo wysyłane, użytkownik nie może paść ofiarą ataku przez kliknięcie w link, który np. ukradnie mu ciasteczka. Dane nagłówkowe nie są w stanie być zmodyfikowane poprzez kliknięcie w link, podobnie jak z danymi <code>$_POST</code> (oczywiście mówimy o przypadkach trywialnych, bez javascript&#8217;owych wymuszanych submitów targetowanych do np. ramek).</p>
<p>Znacznie poważniejszym błędem jest konsekwencja wadliwego formatu danych, które nasza funkcja bagatelizuje. Po pierwsze mamy fałszywe dane zwracane przez <code><a href="http://php.net/ip2long">ip2long()</a></code>, po drugie kto powiedział, że właśnie z tej funkcji korzystamy, a nie zapisujemy danych plain&#8217;em i nie bindujemy pofiltrowanych danych lub instrukcji warunkowych zapytania przez np. sprawdzony ORM.</p>
<p><strong>Rozwiązanie problemu.</strong></p>
<p>Edit: Jak słusznie zauważył Zyx, zapomniałem o tym wspomnieć, że skoro mogą znaleźć się tam dowolne dane przesłane od użytkownika, <strong>nie należy tego pola traktować jako wyznacznik, że jest to numer jego IP</strong>, <u>jest ono bezużyteczne i powoduje potencjalną lukę</u>. Poza zabezpieczeniami to podstawowy argument, żeby o polu zapomnieć i używać <code>$_SERVER['REMOTE_ADDR']</code>.</p>
<p>Po pierwsze funkcja powinna sprawdzać dane wejściowe chociażby <code><a href="http://php.net/preg-match">preg_match()</a></code> lub konwersją do <code><a href="http://php.net/ip2long">ip2long()</a></code> i (jeżeli jest taka potrzeba) spowrotem do <code><a href="http://php.net/long2ip">long2ip()</a></code>. Dwa, pamiętajmy, że w X_FORWARDED_FOR znajdują się śmieci, adresy lokalne sieci,  itd., które należy pominąć przy wyborze adresu z listy po przecinku.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/atak-xss-server-http-x-forwarded-for/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hashowanie haseł z solą</title>
		<link>http://athlan.pl/hashowanie-hasel-z-sola/</link>
		<comments>http://athlan.pl/hashowanie-hasel-z-sola/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 18:50:26 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Planeta]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[md5]]></category>
		<category><![CDATA[sha1]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=150</guid>
		<description><![CDATA[Przeglądając forum.php.pl często widziałem, jak użytkownicy przechowują hasła w swoich bazach danych. Najczęściej używają funkcji hashujących md5, sha1 i sha2. Wszystko wygląda bardzo dobrze, hasła są przechowywanie bezpiecznie. No właśnie&#8230; na ile bezpiecznie. Nie będę tutaj rozwodził się nad zabezpieczeniem baz danych, w których owa baza haseł się znajduje, ale nad samym zahashowanym ciągu. Wszyscy [...]]]></description>
			<content:encoded><![CDATA[<p>Przeglądając forum.php.pl często widziałem, jak użytkownicy przechowują hasła w swoich bazach danych. Najczęściej używają funkcji hashujących <code>md5</code>, <code>sha1</code> i <code>sha2</code>. Wszystko wygląda bardzo dobrze, hasła są przechowywanie bezpiecznie. No właśnie&#8230; na ile bezpiecznie.</p>
<p>Nie będę tutaj rozwodził się nad zabezpieczeniem baz danych, w których owa baza haseł się znajduje, ale nad samym zahashowanym ciągu. Wszyscy doskonale wiemy, że istnieją bazy md5 (sha1, sha2 również).</p>
<p><em>Przezorny zawsze ubezpieczony.</em> Wiadomo, że nigdy nic nie wiadomo.</p>
<p>Pokażę, jak dodatkowo zabezpieczyć nasze hasła. Będą przechowywane w tej samej bazie danych, używając tych samych metod hashowania, a jednak szansa na &#8220;złamanie&#8221; hasła (wyszukania w bazie) będzie niemożliwa. Posłużymy się ciągiem znaków zwanym przez programistów <em>solą </em>(<em>salt</em>). Przykład implementacji możemy znaleźć w forum IPB, natomiast phpBB pozbawione jest tego <span style="text-decoration: line-through;">fjuczuru</span> ficzera. Cała sprawa sprowadza się do wygenerowania dowolnego kawałka ciągu znaków i doklejenia go do hasła. Sól potrzebna nam będzie również przy porównaniu hasła, więc trzeba ją zapisać w bazie danych obok hasła.</p>
<p>Poniżej zamieszczam przykładową klasę, która obsługuje solenie haseł. Doklejanie soli może być napisane w dowolny sposób, zależy to od Waszej wyobraźni. Ja dodatkowo dodałem element &#8220;losowy&#8221; w postaci doklejenia do soli wyniku działania funkcji microtime().</p>
<ul>
<li><a href="http://athlan.pl/code/PassSalt">Klasa, która soli hasła.</a></li>
<li><a href="http://athlan.pl/code/PassSaltExample">Przykład</a> &#8211; zapisywanie hasła do bazy danych oraz sprawdzanie go przy logowaniu.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/hashowanie-hasel-z-sola/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
