<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>netw0rk | Cybersecurity &amp; Software Engineering on netw0rk.io</title><link>https://netw0rk.io/</link><description>Recent content in netw0rk | Cybersecurity &amp; Software Engineering on netw0rk.io</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 05 Dec 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://netw0rk.io/index.xml" rel="self" type="application/rss+xml"/><item><title>PHPMemcachedAdmin RCE — CVE-2014-8731</title><link>https://netw0rk.io/blog/phpmemcachedadmin-rce-cve-2014-8731/</link><pubDate>Mon, 05 Dec 2022 00:00:00 +0000</pubDate><guid>https://netw0rk.io/blog/phpmemcachedadmin-rce-cve-2014-8731/</guid><description>&lt;p&gt;CVE-2014-8731 is an unauthenticated RCE in &lt;a href="https://github.com/elijaa/phpmemcachedadmin"&gt;PHPMemcachedAdmin&lt;/a&gt; ≤ 1.2.2. The CVE is from 2014. I wrote a PoC in 2022 - &lt;a href="https://git.sbani.net/sbani/CVE-2014-8731-PoC"&gt;git.sbani.net&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="root-cause"&gt;Root cause&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;stats.php&lt;/code&gt; derives a file path from two user-controlled inputs and writes to it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$hash &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;md5&lt;/span&gt;($_REQUEST[&lt;span style="color:#e6db74"&gt;&amp;#39;cluster&amp;#39;&lt;/span&gt;]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;isset&lt;/span&gt;($_COOKIE[&lt;span style="color:#e6db74"&gt;&amp;#39;live_stats_id&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; $hash])) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// generate new id
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $live_stats_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $_COOKIE[&lt;span style="color:#e6db74"&gt;&amp;#39;live_stats_id&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; $hash];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$file_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rtrim&lt;/span&gt;($_ini&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;file_path&amp;#39;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DIRECTORY_SEPARATOR&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;live_stats.&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; $live_stats_id;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;$live_stats_id&lt;/code&gt; is read from a cookie. No validation, no normalisation.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file_path&lt;/code&gt; defaults to a directory inside the web root.&lt;/li&gt;
&lt;li&gt;The cluster name later gets serialised into the dump file as part of the stats payload.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Result: arbitrary file write, attacker-controlled name and content, inside the document root.&lt;/p&gt;</description></item></channel></rss>