<?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>Julius Beckmann &#187; Wordpress</title>
	<atom:link href="http://juliusbeckmann.de/blog/category/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://juliusbeckmann.de/blog</link>
	<description>Ich bin nicht verrückt, nur technisch begabt ...</description>
	<lastBuildDate>Wed, 05 Jun 2013 11:02:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Facebook: Like Buttons uses wrong url</title>
		<link>http://juliusbeckmann.de/blog/facebook-like-buttons-uses-wrong-url.html</link>
		<comments>http://juliusbeckmann.de/blog/facebook-like-buttons-uses-wrong-url.html#comments</comments>
		<pubDate>Mon, 11 Apr 2011 09:20:40 +0000</pubDate>
		<dc:creator>Julius</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Patch]]></category>

		<guid isPermaLink="false">http://juliusbeckmann.de/blog/?p=776</guid>
		<description><![CDATA[I use the digg-digg Wordpress Plugin on this blog and found a annoying error - the like button does not use the correct url. I found out why and how to correct it. What happened I wrote a new article and watched the preview of it. Digg-Digg showed the buttons on the preview page. I [...]]]></description>
			<content:encoded><![CDATA[<p>I use the <a href="http://wordpress.org/extend/plugins/digg-digg/">digg-digg Wordpress Plugin</a> on this blog and found a annoying error - the like button does not use the correct url. I found out why and how to correct it.<br />
<span id="more-776"></span></p>
<h2>What happened</h2>
<ul>
<li>I wrote a new article and watched the preview of it.</li>
<li>Digg-Digg showed the buttons on the preview page.</li>
<li>I published the article and tried the Like Button.</li>
<li>The Like Button did not use the correct url, in my case: <em>juliusbeckmann.de/article-name.html</em> instead of <em>juliusbeckmann.de/<strong>blog</strong>/article-name.html</em>.</li>
</ul>
<h2>Explained</h2>
<p>While watching the preview, die like button send the preview url to facebook. Now facebook tried to fetch the page, but was redirected because the article was not published yet. Facebook "guessed" a url and came up with "juliusbeckmann.de/" what got cached.<br />
Now i published the articled, used the like button, but facebook does not use the new url, they used the old guessed and cached url from the preview.</p>
<h2>Solution</h2>
<p>Solution is simple: Do not show the facebook like button on preview pages that will not be visibile for facebook.</p>
<h2>Hack for Digg-Digg</h2>
<p>Hacking Digg-Digg is simple. Open the file "digg-digg.php" and find the function "dd_hook_wp_content".<br />
Now replace this code:</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">global</span> <span class="re0">$wp_query</span><span class="sy0">;</span><br />
<span class="re0">$post</span> <span class="sy0">=</span> <span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">post</span><span class="sy0">;</span> <span class="co1">//get post content</span></div>
</div>
<p>with this code:</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">global</span> <span class="re0">$wp_query</span><span class="sy0">;</span><br />
<span class="co1">// Hack - No Digg-Digg on preview pages &nbsp;by JuliusBeckmann.de</span><br />
<span class="kw1">if</span><span class="br0">&#40;</span><span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">is_preview</span><span class="br0">&#41;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp;<span class="kw1">return</span> <span class="re0">$content</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="re0">$post</span> <span class="sy0">=</span> <span class="re0">$wp_query</span><span class="sy0">-&gt;</span><span class="me1">post</span><span class="sy0">;</span> <span class="co1">//get post content</span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://juliusbeckmann.de/blog/facebook-like-buttons-uses-wrong-url.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress: Remote Admin Reset Password Exploit &#124; Wie es dazu kommen konnte</title>
		<link>http://juliusbeckmann.de/blog/wordpress-remote-admin-reset-password-exploit-wie-es-dazu-kommen-konnte.html</link>
		<comments>http://juliusbeckmann.de/blog/wordpress-remote-admin-reset-password-exploit-wie-es-dazu-kommen-konnte.html#comments</comments>
		<pubDate>Tue, 11 Aug 2009 15:53:21 +0000</pubDate>
		<dc:creator>Julius</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Admin]]></category>
		<category><![CDATA[Exploit]]></category>
		<category><![CDATA[Password]]></category>

		<guid isPermaLink="false">http://juliusbeckmann.de/blog/?p=360</guid>
		<description><![CDATA[Wieder einmal eine Lücke in Wordpress. Ich mach mir mal die Mühe und zeige die Umstände wie es dazu kommen konnte. In der wp-login.php gibt es die Möglichkeit mit den Paramatern: ?action=rp&#38;key=LANGER_KEY ein Passwort zurücksetzten zu lassen. Bedingung hierfür ist jedoch dass der key in der Datenbank gefunden wurde. Code: Schauen wir uns mal den [...]]]></description>
			<content:encoded><![CDATA[<p>Wieder einmal eine Lücke in Wordpress. Ich mach mir mal die Mühe und zeige die Umstände wie es dazu kommen konnte.<br />
<span id="more-360"></span></p>
<p>In der wp-login.php gibt es die Möglichkeit mit den Paramatern: ?action=rp&amp;key=LANGER_KEY ein Passwort zurücksetzten zu lassen. Bedingung hierfür ist jedoch dass der key in der Datenbank gefunden wurde.</p>
<h2>Code:</h2>
<p>Schauen wir uns mal den Code genauer an:</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw2">function</span> reset_password<span class="br0">&#40;</span><span class="re0">$key</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
<span class="kw2">global</span> <span class="re0">$wpdb</span><span class="sy0">;</span></p>
<p><span class="re0">$key</span> <span class="sy0">=</span> <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">&#40;</span><span class="st_h">'/[^a-z0-9]/i'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$key</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw1">if</span> <span class="br0">&#40;</span> <a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span> <span class="re0">$key</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw2">new</span> WP_Error<span class="br0">&#40;</span><span class="st_h">'invalid_key'</span><span class="sy0">,</span> __<span class="br0">&#40;</span><span class="st_h">'Invalid key'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="re0">$user</span> <span class="sy0">=</span> <span class="re0">$wpdb</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>get_row<span class="br0">&#40;</span><span class="re0">$wpdb</span><span class="sy0">-&amp;</span>gt<span class="sy0">;</span>prepare<span class="br0">&#40;</span><span class="st0">&quot;SELECT * FROM <span class="es4">$wpdb</span>-&amp;gt;users WHERE user_activation_key = <span class="es6">%s</span>&quot;</span><span class="sy0">,</span> <span class="re0">$key</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span> <a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span> <span class="re0">$user</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw2">new</span> WP_Error<span class="br0">&#40;</span><span class="st_h">'invalid_key'</span><span class="sy0">,</span> __<span class="br0">&#40;</span><span class="st_h">'Invalid key'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co1">// Generate something random for a password...</span><br />
<span class="re0">$new_pass</span> <span class="sy0">=</span> wp_generate_password<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>do_action<span class="br0">&#40;</span><span class="st_h">'password_reset'</span><span class="sy0">,</span> <span class="re0">$user</span><span class="sy0">,</span> <span class="re0">$new_pass</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="sy0">...</span></div>
</div>
<h2>Erklärung:</h2>
<p>Der Parameter $key kommt direkt von $_GET['key']. Dieser wird jetzt mit preg_replace() aller Zeichen ausser a-zA-Z0-9 bereinigt. Und hier liegt auch schon das Problem. Dummerweise akzeptiert preg_replace() auch Arrays als Parameter wo dann jeder einzelne Eintrag des Arrays abgearbeitet wird. Link zur PHP Doku: <a href="http://de.php.net/manual/en/function.preg-replace.php">http://de.php.net/manual/en/function.preg-replace.php</a>.</p>
<p>Was manche nicht wissen, es ist möglich auch ein Array per GET zu übergeben. Man müsste dazu in der URL schreiben: &amp;key[]=eintrag.</p>
<p>Wenn man dies nun macht wird nach dem preg_replace $key ein Array sein mit genau einem Element drin. Da aber Arrays mit mindestens einem Element drin als true gewertet werden liefert empty($key) hier false und es wird KEINE Fehlermeldung ausgespuckt.<br />
Was danach passiert ist teils auch nicht so ganz offensichtlich. Im Aufruf von $wpdb-&gt;prepare wird $key benutzt welches, da es ein Array und kein String ist nicht korrekt geparsed welches zu folgender Query führt: "SELECT * FROM jb_v1_users WHERE user_activation_key = ''". Es steht jetzt am Schluss = '' - diese Query findet also den ersten Datensatz in der user Tabelle wo die Spalte user_activation_key leer ist. Dies ist meistens der Admin. Im Nachfolgenden Code wird jetzt das Passwort des Admins geändert was auch schon den ganzen Exploit ausmacht. Der Admin kann sich vorerst nicht mehr einloggen.</p>
<p>Beheben lässt sich das ganze indem der Admin einfach seinen Passwort Hash in der Datenbank ändert und sich so wieder einloggen kann.</p>
<h2>Fix:</h2>
<p>Um diese Lücke zu fixen gibt es mehrere Möglichkeiten:</p>
<p>Wir machen aus:</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="re0">$key</span> <span class="sy0">=</span> <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">&#40;</span><span class="st_h">'/[^a-z0-9]/i'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="re0">$key</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="re0">$key</span> <span class="sy0">=</span> <a href="http://www.php.net/preg_replace"><span class="kw3">preg_replace</span></a><span class="br0">&#40;</span><span class="st_h">'/[^a-z0-9]/i'</span><span class="sy0">,</span> <span class="st_h">''</span><span class="sy0">,</span> <span class="br0">&#40;</span>string<span class="br0">&#41;</span><span class="re0">$key</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>was uns dann immer einen String zurückliefern wird. Zwar würde im Fall dass $key ein Array ist nachher "Array" drin stehen, aber diesen Key wird bestimmt keiner als user_activation_key  haben.</p>
<p>Oder wir machen aus:</p>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw1">if</span> <span class="br0">&#40;</span> <a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span> <span class="re0">$key</span> <span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw2">new</span> WP_Error<span class="br0">&#40;</span><span class="st_h">'invalid_key'</span><span class="sy0">,</span> __<span class="br0">&#40;</span><span class="st_h">'Invalid key'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<div class="codesnip-container" >
<div class="php codesnip" style="font-family:monospace;"><span class="kw1">if</span> <span class="br0">&#40;</span> <a href="http://www.php.net/empty"><span class="kw3">empty</span></a><span class="br0">&#40;</span> <span class="re0">$key</span> <span class="br0">&#41;</span> <span class="sy0">||</span> <a href="http://www.php.net/is_array"><span class="kw3">is_array</span></a><span class="br0">&#40;</span><span class="re0">$key</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">return</span> <span class="kw2">new</span> WP_Error<span class="br0">&#40;</span><span class="st_h">'invalid_key'</span><span class="sy0">,</span> __<span class="br0">&#40;</span><span class="st_h">'Invalid key'</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>welches die Fehlermeldung ausgeben wird wenn $key fälschlicherweise ein Array ist.</p>
<p>Der Bug ist echt nicht auf den ersten Blick zu sehen, daher auch keine Schande über die Wordpress Programmierer. Mein Rat an dieser Stelle, lieber ein paar mal mehr casten als zu wenig.</p>
]]></content:encoded>
			<wfw:commentRss>http://juliusbeckmann.de/blog/wordpress-remote-admin-reset-password-exploit-wie-es-dazu-kommen-konnte.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress: Sonderzeichen ersetzten deaktivieren</title>
		<link>http://juliusbeckmann.de/blog/wordpress-sonderzeichen-ersetzten-deaktivieren.html</link>
		<comments>http://juliusbeckmann.de/blog/wordpress-sonderzeichen-ersetzten-deaktivieren.html#comments</comments>
		<pubDate>Mon, 30 Jun 2008 08:10:02 +0000</pubDate>
		<dc:creator>Julius</dc:creator>
				<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[Config]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Sonderzeichen]]></category>

		<guid isPermaLink="false">http://juliusbeckmann.de/blog/?p=34</guid>
		<description><![CDATA[Wer so wie ich öfters Konfigurationsdateien postet wird es vielleicht auch schon gemerkt haben dass Wordpress normale Anführungszeichen in Anführungszeichen links und rechts sowie doppelte Striche in einen langen ersetzt und so simples Copy/Paste bei Konfigurationsblöcken und Scripten zu nichte macht. Wie man das ausstellen kann geht so.... Meine Version ist aktuell die 2.5.1, bei [...]]]></description>
			<content:encoded><![CDATA[<p>Wer so wie ich öfters Konfigurationsdateien postet wird es vielleicht auch schon gemerkt haben dass Wordpress normale Anführungszeichen in Anführungszeichen links und rechts sowie doppelte Striche in einen langen ersetzt und so simples Copy/Paste bei Konfigurationsblöcken und Scripten zu nichte macht.<br />
Wie man das ausstellen kann geht so....<br />
<span id="more-34"></span><br />
Meine Version ist aktuell die 2.5.1, bei älteren Versionen müssten die Formatierungsfunktionen im Functions Ordner von Wordpress sein und die Datei auch ein 'formatting' im Namen haben.</p>
<p>Das ganze formatieren vom 2.5er Wordpress geschieht in der Datei:<br />
<strong>/wp-includes/formatting.php</strong><br />
Dort finden sich die Zeilen für statische</p>
<div class="codesnip-container" >$static_characters = array_merge(  array('---',     ' -- ',      '--',      'xn–','...',     '``',      '\'s',      '\'\'',    ' (tm)'), $cockney);<br />
$static_replacements = array_merge(array('—', ' — ', '–', 'xn--',     '…', '“', '’s', '”', ' ™'), $cockneyreplace);</div>
<p>und für dynamische Ersetzungen:</p>
<div class="codesnip-container" >$dynamic_characters = array('/\'(\d\d(?:’|\')?s)/', '/(\s|\A|")\'/', '/(\d+)"/', '/(\d+)\'/', '/(\S)\'([^\'\s])/', '/(\s|\A)"(?!\s)/', '/"(\s|\S|\Z)/', '/\'([\s.]|\Z)/', '/(\d+)x(\d+)/');<br />
$dynamic_replacements = array('’$1','$1‘', '$1″', '$1′', '$1’$2', '$1“$2', '”$1', '’$1', '$1×$2');</div>
<p>Wer möchte kann hier gewünschte Änderungen direkt im Array vornehmen oder ein paar Zeilen weiter das Ersetzten komplett unterbinden.</p>
<p>Dazu machen wir aus</p>
<div class="codesnip-container" >// static strings<br />
$curl = str_replace($static_characters, $static_replacements, $curl);<br />
// regular expressions<br />
$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);</div>
<p>folgendes</p>
<div class="codesnip-container" >// static strings<br />
//$curl = str_replace($static_characters, $static_replacements, $curl);<br />
// regular expressions<br />
//$curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);</div>
<p>Wer gerne seine gewünschten HTML Sonderzeichen nachschlagen möchte, dem sei die SelfHTML Zeichenreferenz ans Herz gelegt:<br />
<a title="http://de.selfhtml.org/html/referenz/zeichen.htm" href="http://de.selfhtml.org/html/referenz/zeichen.htm" target="_blank"> http://de.selfhtml.org/html/referenz/zeichen.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://juliusbeckmann.de/blog/wordpress-sonderzeichen-ersetzten-deaktivieren.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
